とはいっても「面白いゲームをつくって公開する」のではなく「ゲームづくりを通して知らないことを学ぶ」のが目的なので、つくっているゲームが面白い必要は1ミリもない。
ほんとはUnityとかからやりゃいいんだと思うのだけれど、そもそもの考え方とかがなんも身についてないので(せめて言語の書き方では迷わない)Pythonで始めている。画面遷移とか状態の保持とか敵キャラの思考とか、基礎がわかったらUnityとかに移植してみたい。
たまーにやるんだがだいたい仕事忙しくなったとか、他に面白そうな趣味ができたとか、単に進捗が詰まってモチベで超えられなくなったとか、たいてい途中で放り出している。
なので毎回1からのスタートになっていて、効率という面では重篤な問題を抱えている。
Pygame(Pygame Zero)つら
とかでこの3日くらい触っているやつがPygameZeroで、これは今までも使ってきていたPygameのラッパーみたいだ。Pygameは画面のすべてを更新するとか一部の描画だけやり直すとかの制御も自分持ちだったのが煩わしい点だったのだけれど、そのへんの細かいところを包んで、より「やりたいことに集中できる」ってことに力を入れている印象。
へえなるほどと触るも、もとのPygameにもあった問題のいくつかを引き継いでいるのも確かで、そこがとくに自分の趣味と折り合わなかったりもしている。
状態の更新と描画の更新だけは分割できない
いやーそんなわけないよなーって探すんだけど、だいたい記事ってインストールしてチュートリアルやって終わりみたいないつものやつが多いんので、階層の深いアプリ書くときにまつわる悩みとかにはほぼ相対しない。これはPygameに限らずそう。
ハローワールドできましたー!とかをわざわざブログにするあの神経はマジでわからない。まあかんたんだしPVの足しにはなるんだろうけど。
タイトル画面 →はじめから →ゲーム本編→結果表示→エンディング →ステージ選択→ゲーム本編→結果表示→エンディング →設定画面 →ゲーム終了
さて、上のようなアプリケーションやろうぜみたいときに、こいつらの更新はすべてupdate、描画はdrawに詰め込むことになる。実際はupdateの中でtitle_updateとか関数切って分割はするのだけれど、ゲームが起動したあとで発生するオブジェクトscreenにわたす都合上、よそのファイルにクラスを切って分離することができず、なのでタイトル画面の話もゲーム本編の話もmain.pyに散らかる風景になっちゃう。
文脈の異なるコードが一箇所に収まるのは許しがたい。
別にスマホだコンソールだWebだと分けずとも、今どきのアプリを書くなら状態とかビューとかで分担を整理していくと思うのだが、分担がきれいに定まらない。pygameの機能に依存する処理についてはmain.pyにないとダメって感じ。
そんなわけないだろーと探したがないんで、ない以上はしょうがないので、別のライブラリを見てみようとなったのが昨夜までの進捗。
ライブラリはけっこうたくさんあるのだけれど、趣味に合致しそうなものというと絞られてくる。
なんちゃらのPythonバインディングです、みたいなのは基本避ける。
割といろいろある
ひとつが「Kivy」で、これはゲーム用じゃなくてアプリ用だから「ゲームも作れるけど専用じゃないよ」ってやつだ。TkInterとかPyQtみたいなもんだろうか。
きょうびTkInterは触らないし、PyQtはまあ商用でやるんじゃなければ問題ないけど、今触るモチベはない。
Kivyは相当へんなライブラリで、kv言語なるyamlみたいなもんでビューの定義をするとある。いやまあPythonでゴリゴリ描画用の関数呼ぶとかはぞっとしないんでいいんじゃないだろうか。
悩みどころは情報が少ないところだけど、本家なんとか読み下せばいけるでしょ。なにしろわたしはDeepLに金払ってるからなガハハ。
もういっこがPyxelで、こっちはゲーム用。おまけに16色、4音しか出力しませんと制限がついてる、レトロゲーム機テイストの作品を作るもの。
できることに制限あるのは(指向性の強い)ライブラリにおいてはいいことなんで、これでできないことは割り切ってやらないって態度でシンプルにできていいんじゃないだろうか。そもそもそんな凝ったことしないから、手触りが良ければ問題ない。そして日本製なので情報に困んない。
なんかデモ見てたらWebに描画する機能持ってるんだ?もしかしてこないだ話題になってた「DON’T SAY YES」みたいなことができると。あの作品はGB Studio製なので別なんだけども。
昔懐かしいJavaのAppletや、ShockwaveとかFlashのノリをもってこれちゃうんだ。おまけにプラグイン不要。WebAssemblyすっげえー。
ゆくゆくはUnityを~みたいな色気出してしまうと今やってることを後で捨てることへの抵抗感が増すので良くない。おまけにそんな雑なロードマップ敷いたところで到達するかすら怪しい現状、今できることをコツコツやるほうがいいのだ。
まずはPyxelを触ってみる。
とりあえず以下がTodo。よくあるやつ。
- タイトル画面
- メニュー
- 設定画面作る+設定のセーブとロード
- ゲーム本編の画面
- ゲームのセーブ
- セーブデータの選択とロード
- タイトルや設定画面の行き来
- パッドの入力を受け付け
- パッチサーバを用意して更新の検知とアプリケーションの更新(あとまわし)