play the jitoh-san RPG

1月の雑感

プレイザジトーさんRPG、1月1日ですが早速手を付けていこうと思います。2024年にGodotでプラットフォーマーを作ってジトーさんをブンドドさせつつよくありそうな仕掛けはおおよそ作ってエタった・途中バージョンもBlogのリプレースで再配置が面倒になったので非公開とあいなったわけですが…

人生を振り返ってみると、実はプラットフォーマーは自分の出発点には近けれども(SFCで初めてやったのがマリオワールド)、自分の決断で買って自分で走り切ったゲームというとRPG(ポケモン緑)になるのかなあとか思うわけです。なので今年はそっちのほうに己を詰めていこうかななんて思うわけです。

オリジナリティのある大作を作ろうなどとイキがる年齢でもないので、多分に有名作(ドラクエ1とか)を参考にした探索・文字読み中心のゆるーい小窓ゲー(©四篠さん)が適度に実装されてできたーブンドドキャッキャして適度にエタるくらいでいいかなくらい。その力加減は今年も同じです。

で、エンジンなに使うん?というお話についてですが、小窓ゲーたるもの前回同様に4階調GBライクでいいかなと思うわけなので、ありがたくPyxelさんを使わせてもらいます。環境どうだっけなってpip list叩いたらpipとsconsとsetuptoolsしか入ってねえこのPC。venvで動かした方がいいとかある?

sconsはGodotのカスタムテンプレートをコンパイルしてFreeTypeとかを外す際に使ったやつだな……つまり具体的にはこの環境では特に何もしていないはず。pythonに対する習熟度はそんくらいです。

プレイザジトーさんRPG、今日はPixelのexamplesをもにょもにょ見ていきましょう。初学者レベルのことは正味のところ飛ばしても大丈夫なんですが、設計が大事なのは痛く思い知っているので今月はゆっくり立ち上げていきたいところですね。

Pyxelな。スマホPixelにもお世話になってるのでしばらく打ち間違えそうだ……ともあれ非常にミニマムですね。らしさを表現しているカラーパレット→イメージバンク→タイルマップの関係にやや癖があるか。タイルマップも付帯情報全然ないので当たり判定とかちゃんと書かないといけないのは渋くて良い。

メニューをシーンごとに分割して他を画面の後ろには置きつつも一切合切sleepさせておくとかの基本的な奴も特に用意はされていないようなので、ド定番の自販機書かされる状態遷移図と状態変数を持ってやっていく形になるものかなー。たまにはこういうのもよいか。

プレイザジトーさんRPG、今日はプレイヤーをマス目に沿って動かしてみて密室に閉じ込めてみるテスト。まあ動けばよしレベルには順当に動くし壁判定も機能するわけですが、NPCやら扉やら話しかけコマンドやらできればシンボルエンカウントやら考えたいなってなるときっちり設計しないとだなあ。

思い付きで機能足すようなライブ感ある開発ってなるとやはりリッチなゲームエンジンに軍配があがるなあとはしみじみ思うわけですが、3日目にしてPyxelからGodot戻るのも時期尚早でありますわけで。4.3以来Webアプリ配備のめんどくささは若干緩和されているとのことですが容量がでかいんよ。

プレイザジトーさんRPG、順番は昨日と前後しますが大変都合よく参考になるpyxel有志チュートリアル(https://note.com/frenchbread/n/n9a46ada3850e)が掲載いただいているのでそれを適宜読んでいく。とりあえずブンドドとしてやっときたいなのことが結構な割合書かれているので大変ありがたく参考にさせてもらうやつ。

とはいえ写経はしてないので外形似てても違いはすぐに生じる。updateごとxyにdxdy(dは単位時間の変化量がお約束)を加算してグリッドで止めるで書いちゃっていて、これupdateなんかで飛んだら暴走するなあとかぼんやり考えてたわけですが、先方はdxdyをグリッド単位まで積んで清算してるんですね。

xyだけで見ると移動完了時にテレポートすることになるわけですが、シンボルエンカウントの被接触が絡む場合はどう処理するのが賢いかな……というのはよくよく考えておかねばならなそうですね。移動中にほとんど通り抜けてるはずでも横から接触されるのはなんかプレイフィール悪そうな気はする。

メモ①:ツクールの矢印キーは同軸は単純加算(左右同時押しで止まる)、別軸だと後優先(→↑と入力すると上に進み始め↑を離すと右に進む。これはどの組み合わせでも同じ)

メモ②:ウディタの矢印キーは同軸でも後優先(←→と入力すると右に進む。→を離すと左に進む)。別軸は同時押しが絡むと優先順位を保ってはいない気はする(↓↑→と入力して→を離すと上に進むが、↑↓→からでも上に進む。後優先が処理されない場合に上と左の優先度が高い?)

フム。先方はWindowクラスで枠とテキストを(クラスメソッドにしてあるので開き済みならテキスト上書き)、それにCursorクラスでカーソル(こちらは都度new)を重ねて処理しているのか。Cursorだけで生じる例がないはずなのでここはいじりたい印象がある。

あとWindow.close()でdeepcopyしてるのなんでだ…ぱっと考えた範囲だとcls.all.clear()で十分なように思えますが…特定のWindowだけ消す/残す改修の想定をした?

いずれにせよ用途(長めなテキストを書きたい)からしてWindowオープン時に操作を常に乗っ取りたいのと、重ねWindowのUI(push/pop)にして戦闘もウインドウでやりたいのでここはちょっと注意深くやっていきましょうねという感じ。まあ1月号なのでライブ感のある開発でもいいんですけど…

プレイザジトーさんRPG、今日も今日とてウインドウとたたかう。先達に倣って生成はクラスメソッドとし、窓のサイズ・テキスト・選択肢はdictで定義できるようにしておく。これで複数ページと分岐はできるわけですが……pyってdictのlast()ってないんだっけ……

方針としてはWindowクラスはあくまで枠とコンテンツとカーソルを出して、最前面の1枚だけが操作を吸い、操作がどうあれどWindow名と選択結果をAppクラスに返す、ということに徹したいという感じですね。ロジックはまとめておきたい。

プレイザジトーさんRPG、今日は移動キー。ツクール式の細かい挙動を見てますが、結構首ひねるやつだな……(←で左、←↑で上、←↑↓は左、←×↓にすると縦軸優先が生きてるのか下、←×↓→でそのまま下、←×↓×で左)
同軸打ち消しのち、両軸残ったら最後に押した軸を優先…かな。

なんでここにこだわるかというとシンボルエンカウントを避けることが楽しいからその動きは直感にのっとったものであってほしいです。いやあんまりそれだけで楽しいというわけではないのだが……

ちまちま進捗をやっていますが、ブンドドゆえ単にブログに放り込むし思ったことを語ってしまっているだけです。今月はお屋敷のマップチップとご主人様とお話ができるくらいのこと・できればマップ移動して地下のスライムと固定ステータス下ででも殴り合いできるくらいまではやりたいなーとかそういう。

プレイザジトーさんRPG、今日はオブジェクト。オブジェクトとはインタラクトできる物体は全部対応させるつもりですがいったんコメントを出す立札である。こっちもマスターデータを配列で持ちたいのでclassmethodからのdict登録で扱うこととし、画面内に初期位置が入ったら登録することにする。

で、衝突フラグも持たせまして、壁衝突検出の処理側も対応することで「マップ壁でない壁」になりました。あとはこれに向いていてAボタンを押したらイベント名を返すようにし、それを受けてApp側でウインドウを出せばいいんですが……向きの定義がキャラチップ描いてないことで適当過ぎるので要調整。

プレイザジトーさんRPG、今日もオブジェクト。Aボタンでセリフインタラクトができるようにし、いったんランダムですが2秒間隔で歩いてくれるようにしました。もちろん壁やプレイヤーに重なることはない……あとは互いの衝突判定の時点にウインドウオープンを仕込めば戦闘画面自体は出せようものよな。

あとPyxelのテキストでお世話になってるので投げ銭込み勉強込みでDungeon Antiqua 2さんを購入。2からはじめていいやつ……よな? いまはそんなに積みゲーのキューも長くないのですぐにプレイできるでしょう、たぶん…

プレイザジトーさんRPG、資材をちゃんと整理する。いったん壁領域を上から3チップ(つまり48種類)として払い出しておく。壁だけでなく棚とか樽とか机とかもここに入ってくるので私がどれくらいポチポチドットを打つかによって不足するかが決まる。見通しがないな!

床チップも同様に48種類払い出しておく。で、ジトーさん当人を含めたキャラクターチップは上右下左それぞれ2チップずつの8チップ(静止時アニメーションなし、移動時アニメーションパタパタ2通り)としておく。戦闘時はやっぱりちょっと大きめの画像出したいのでこれは別イメージバンク行きかなあ。

プレイザジトーさんRPG、今日はぽちぽちドットを打つ。ジトーさん自体は以前のやつをそこそこ流用できるんですが、それにしたって横ビューかつ1ドット移動の世界で作ったやつなので調整は要る。まあいったん深追いはしないでほどほどにという感じではありますが…1stステージが館なのは同様。

プレイザジトーさんRPG、今日はのんびり戦闘面を考える回。DQにならって画面上に戦闘画面を載せたいなーとかブンドドである以上はプレイヤーアクションはしたいなーとかそういう……新桃風にミニキャラをステータスに置く? うーん。

pyxelさんを2週ほど触って思うのは、ウェイトやアニメーションはやはり直に書くのは煩雑だなあというところでしょうかね。より理解を深めるのには適切ですが、アニメーション再生状況を発火点として駆動する適当構築ができてしまうunityやgodotの優しさがよくわかる……

godotのときのプラットフォーマージトーさん、状態変数も併用してましたがウェイト(n秒状態を維持)みたいなのはアニメーションのシグナルで動いてましたからね…

プレイザジトーさんRPG、ちまちまワープイベントを作っておく。pyxelのタイルマップはマス目単位未満でもそのまま範囲で描画持ってこれて便利ですが、壁の向こうは映ってほしくないのでね。タイルマップ上は隣接していてもプレイヤーがいない「エリア」の描写・処理はしなくしておきました。

ワープイベントは瞬間で飛ばしちゃっていますが、本来は0.5秒暗転とかそういうのをはさみたいところ。ただupdate()でのインタラクションでは1フレームで全部処理されてしまうので、すべてのupdate()を動かさせない時間を稼ぎつつdraw()はする仕組みが必要か……

pyxelについては触ってないでもないんですがさすがにそろそろ1月号を……戦闘のモックまではいかないかなー。館の散歩くらいできるようにしときたいですね。

Pyxel、話を最近してませんが最近さっそくおサボりしているからです。ただうちの子ブンドドしてるだけなので、いつぞやと同じように毎月進捗くらいは展開しよう……いや2024年1月のGodotと同様、ゲームとして遊べるではなくデバッグルームだけがただ存在するみたいな状況ではあるのだが…

ただアレですね。PyxelとGodotで比較できないところもありますが、最初1000行弱くらいから面白さに至る量みたいなのはプラットフォーマーのほうが圧倒的にありますね。ボタンポチしたらキャラが動くはそれだけで楽しいですから……そりゃ初心者はプラットフォーマーかSTGか落ちモノ作れってなるなあ。

ということで1/31になったのでpyxelの1月号を掲載しました。ゲーム的な内容面はぼんやり考えているのですが、どう調整するとゲームとして楽しいのか……という感覚が全くないのでドラクエ1ライクというか調整面はクローンくらいの気持ちで勉強してみようかと思っています。

すると衝突でイベントを起こす作った仕組みは使わないわけですが、積み上げて作ってみて「演出待ちを制御する」ことの大事さがよくわかったので2月は設計と下積みをやることになるかなーとか思います。スライムくらい倒せるといいですねジトーさん。

しかしpyxel app2htmlはインラインでゲーム内容を書き出してくれるの優秀ですね。ライセンス記載したかったので追加で書き込みをしたりHTMLの文法を整えることにはなりましたが、本当に単一ファイル(メインのJSファイルはCDNですが)アップロードするだけで動くの怖いまである。イマドキだ…