2016年9月6日火曜日

スクリプトの構造とステータス表示

以前にウディタで、画面左上にHP、SP、尿量、尿意を表示していましたが、あれと同じことをします。
ツクールのコードを弄る部分に関する記事は今回が初めてなので、全般的なことも交えて紹介していきます。


まずスクリプトですが、エディタ機能がついていて、ここにRubyで処理を記述できます。

基本的に自作コードは、この「素材」という部分に追加するのが望ましいようです。

このPee_Holderというクラスは、まだ実装中ですが、おしっこ関連のステータスと処理を司る部分です。
一番下の行でインスタンスを生成していますが、このようなクラスやメソッドの定義ではない部分は、ゲーム起動時に一回実行されることが、調査の結果分かっています。
game_systemというシステム全般に関するクラスのコメントに「このクラスのインスタンスは $game_system で参照されます。」という記述があってので、それに倣ってシングルトン的に扱うためにこのようにしています。


全体的な設計ですが、予定通り毎フレーム呼び出される処理は1つにまとめ、そこから各メソッドを呼び出すようにしています。

これが、そのメソッド

そしてこちらが呼んでいる部分のコモンイベント。フラグが立っている場合のみ並列実行されます。


なお、現状では呼び出される間隔はコード側では制御していません。ツクール自体の並列実行の実装に依存しています。その辺の仕様についての調査と、複数環境によるテストプレイが必要になりそうですが、ダメならダメで何か噛ませればいいので、今は気にしないで実装していきます。



さて、ステータス表示そのものの話に戻りましょう。
ちょっと調べたところ、ウディタのように文字列を簡単に画面上に自由に表示する機能は無さそうです。また、重要箇所くらいは見やすいレイアウトにこだわりたいので、使用する文字を画像として描きだして表示することにしました。

色々試した結果、良さそうだったフォントと色で、画像を作りました。

なお、数字個別の画像の他に、項目の画像も作りました。



こういう画像表示の機能があるので、コードでこれと同じことが出来ればと探しましたが…



自分の理解不足もあり、それらしいものが上手く動かず、試行錯誤の末にシンプルなSpriteクラスとBitmapクラスを使用する方法が良さそうであることが分かりました。


Spriteクラスのインスタンスは、今回使った限りで以下のような情報を持っています。
  • x : 表示位置のx座標
  • y : 表示位置のy座標
  • z : 重なり順
  • bitmap : Bitmapクラスのインスタンス。これで画像を指定する
  • visible : 表示状態であるかどうか
bitmapさえセットされていて、表示状態であれば、指定した位置にbitmapの画像が表示されます。

なおBitmapのクラスのインスタンスは、今回使った限りでは、画像ファイルのパスしか渡していないので、画像そのものに関する情報だけを管理しているものと考えて良いでしょう。


以上を踏まえて、以下のような実装にすることにしました。

  • 最初に、使用する画像1つにつき1つのBitmapのインスタンスを生成し、以降それを複数のSpriteインスタンスで使い回す
  • 最初に、文字表示位置1つにつき1つのSpriteのインスタンスを生成し、以降そのbitmapの指定を逐次変更する


最後に、コードを少し紹介します。

画像読み込み部分です。0から9までは配列のインデックスと画像の数字が一致するようにしています。


Spriteインスタンス生成部分です。直後に位置決めもしています。反吐が出るほどにクソベタ書きですね。


そしてこちらが、毎フレームの処理から呼び出されるBitmapインスタンスの付け替え部分です。


レイアウトに関する情報をハードコーディングしたり、似たような処理をコピペしたりと、きったねぇソースですね。いいんです。きったないものを封じ込めて外に臭いが漏れないようにするためのカプセル化です。


さて、前回と同じ画像ですが、こんな感じに表示されます。



以下、今思い付く限りの積み残し。
  • システム情報から、戦闘中フラグを参照し、戦闘中は表示しないようにする。
  • 同、メニュー表示中


0 件のコメント:

コメントを投稿