“RUN” それは魔法の言葉

私とコンピュータの思い出を、だらだらと綴ります。最近はHSP3でのゲーム作り日記です

173.HSPでゲームを作ろう:培養臼Ex その14

ゲーム内容に関する変更は、一通り終わったので、チュートリアルを作る。いわゆるデモ画面。
培養臼は、ルール説明を一切しなかったので、友人やコンテストのコメントで、ルールが分からないという指摘を受けていた。
といっても、どうやるか。

キャラクターの移動や文字表示のプログラムを全部ベタで書いて動きを作ることもできるが、面倒。
せっかくゲーム本体のプログラムがあるのだから、うまく有効利用したい。

そこで考えたのが、テキストファイルにシーケンスを書いて、それを読み込んでゲーム本体のサブルーチンを流用して動かす方法。これなら、半分ぐらいはサブルーチンに任せられそう。

まずはシーケンスのフォーマットを検討。
要りそうなのはこんな項目。

  • 何をするか(自機の移動、弾の発射、細胞の表示、文字列の表示など)
  • 何フレーム持続するか
  • 座標
  • 座標以外の設定値や文字列

これらをカンマ区切りでテキストファイルに書いておいて、順に実行するようにしてみた。

テキストファイルの記述はこんな感じ。

;チュートリアルシーケンスファイル
;0:自機移動 1:弾発射 2:武器チェンジ 3:文字表示 4:細胞出現 5:細胞加速
3,100,300,200,遊び方
4,50,150,220
3,100,500,200,細胞 →
0,30,350,208
1,30,0,0
3,100,150,300,撃つと膨らむ
1,30,0,0
1,30,0,0
1,30,0,0
1,30,0,0
3,100,280,300,最後は破裂
4,20,150,100
0,60,350,88
…

ただ、残念ながら処理の関係上、そのままゲーム本体と同じルーチンを使うことができないものがあり、コピペしてチュートリアル用のルーチンに書き換えた。同じロジックを複製するのはあまりよろしくないが、チュートリアル部分をあとからアップデートするほどでもないゲームなのでwwwこのままにしておこう。

チュートリアルとして作っていて困ったのが、自機の移動処理。
座標を指定して、以前の座標から新しい座標まで、自動的に移動させるために、es_aim命令を使ってみたのだが、指定した座標と、待機するフレーム数によっては、指定した座標に止まらず、通り過ぎて、そのあとのシーケンスが繋がらなくなったのよね…

es_aim命令での移動を止めるには、移動量を0で再指定すればよいことは分かっているので、現在のスプライトの座標をes_getpos命令で取得して、指定座標と一致したら止めるようにしてみた。
が、目論見は失敗。斜めに移動させると、座標が完全に一致しないんだよねぇ。

他に方法がないかを調べてみたところ、2点間の距離を返すes_dist命令なるものがあった。
これで距離が0になれば止めればいいんだ!と思ったが、座標が一致しないんだから0にはならんわな…
誤差が出るのを承知で、何かいい方法がないかを考えてみた。
es_distの値は、はじめは距離があるので大きな値が返ってくる。近づくにつれて徐々に小さくなって、遠ざかる(通り過ぎる)と、大きくなるはず。
これを利用して、前回の距離と現在の距離を比較して、増加したらその時点で止めるようにするというダサい方法で回避することにした。

es_aim 0,int(tu_seq(2)),int(tu_seq(3)),350

;現在の自機の位置と指定座標までの距離を取得
es_dist dis,px,py,int(tu_seq(2)),int(tu_seq(3))
dis=dis>>8 ;距離測定結果から整数部を取り出すため8ビットシフト

;指定した座標で止める(誤差あり)
if b_dist<dis or dis=0 {
  es_chr 0,1
  es_aim 0,0,0,0
}
b_dist=dis

指定座標には、ピッタリ止まらないので、うまく指定する座標を調整して動きをコントロールできた。

こうして作ったチュートリアルはこんな感じ。
https://youtu.be/9f3WerlaDqA