“RUN” それは魔法の言葉

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

149.HSPでゲームを作ろう:培養臼(BAIOUS) その26

ラストはおまけ。
↓のエントリーで書いた、ポーズ機能を作り直した話を少々。
coro3.hatenablog.jp

この時の実現方法は、ポーズキーを押したら、gosubでポーズルーチンに飛ばし、無限ループにして、次にポーズキーが押されるまで、元の処理にreturnしないというものだった。
いろいろと情報を見てると、この方法は一部ヤバかった。
無限ループにしたときは、await命令を入れてないとだめというルールがあったのだ。

ただし、そのために1つだけHSPスクリプトを作る上で約束事があります。 HSPでは「キーを押さないと進まないなどの無限にループになる可能性のある部分では、 必ずwaitかawait命令を入れる必要がある」という約束事を覚えておいてください。

HSP3プログラミングマニュアルより

で、いくらポーズ機能を告知していなくても、このままヤバいものを公開しておくのも嫌なので、ポーズ機能を作り直すことにした。
今のルーチンへ単純にawait 5とかを入れるだけでも良かったが、この方法だと、redrawができないので、新たに何か表示を付け加えられない。
そこでもう少しいろいろ調べたら、スプライトの描画を行うes_drawには、処理を保留するフラグの引数があった。

値     マクロ名          内容
―――――――――――――――――――――――――――――
  0  ESDRAW_NORMAL        すべての処理を実行する
  1  ESDRAW_NOMOVE        移動処理を保留する
  2  ESDRAW_NOANIM        アニメーションを保留する
  4  ESDRAW_NOCALLBACK    コールバックルーチンを保留する
  8  ESDRAW_NODISP        表示を保留する
 16  ESDRAW_NOSORT        ソートを保留する

es_drawのヘルプより

複数の処理を保留したければ、HSP3ではお約束の通り、足した数を指定すればよい。
今回、ポーズ機能で使用したのは、1の移動処理保留と、2のアニメーションの保留。
なので、引数には3を指定すれば、その間、スプライトは表示されるけど、es_adirの自動移動は停止するし、もともとアニメパターンで定義していたスプライトは、アニメーションを停止できた。

こんな感じ。

es_draw ,,(pauseflg=1)*3,0,10000 ;スプライト描画

ポーズボタンを押したら、pauseflgを1にする。1になっていれば、論理式が成立して3を、通常の状態なら0を処理保留フラグとして指定する。
あとはポーズ中に移動を受け付けないようにしたり、ゲーム内カウンタがintの最大値を超えないように、カウンタリセットの処理を加えた。
何より、redraw 0~redraw 1の処理を行うので、ポーズ中は、画面内に「PAUSE」の文字を点滅表示できるようになったので、わかりやすくなった。

培養臼の作成に関するエントリーは、いったんこれで終了。
次からは、次作に向けての準備などについて書いて行こうと思う。