Hatena::ブログ(Diary)

土屋つかさのテクノロジーは今か無しか

2015-12-15

DXRuby Advent Calendar 2015 15日目:司エンジンでゲームを作ってみたよ

 DXRuby Advent Calendar 2015(http://www.adventar.org/calendars/757)の15日目です。14日目はkiku_masa_muneさんの「DXRubyWSを使ってゲームっぽいもの作ろう(http://kagamihotaru.sblo.jp/article/169905340.html)」でした。うーん、さすがにウィンドウシステムだけあって当たり判定が細かく制御できる模様。司エンジンはまだドラッグが実装できてないんだよな……。

 さて、皆さんがゲームを作っているのを見て羨ましくなり、土屋も司エンジンを使ったミニノベルゲームを作ってみましたよ。以下からDLしてください。

http://someiyoshino.main.jp/file/tsukasa_AC2015_04.zip

f:id:t_tutiya:20151210000710p:image
 main.exeを実行すれば動きます。パッキングツールに使っているocraの仕様で、ファイルパスに日本語が含まれると起動できないので注意です。ayameの読み込みが上手くいかなかったので一時的に切ってます(多分土屋の方でローカルのdll配置方法が間違ってる)。一時ファイルの展開にかなり時間がかかっています。あおたくスペシャルに期待。

追記:カスケードのテキストインはスペースキーで飛ばせます(このスキップ処理そのものもプログラム可能です)

 文中に登場する選択肢をクリックすると物語が展開します。ノーヒントデスゲームなので、バッドエンドに到達したら再起動してください。トゥルーエンドに到達すればクリアです。スクリプトファイルを見れば自明ですが、見ないで探す方が楽しいと思います。土屋と同世代のノベルゲーマー(なにそれ)ならすぐ分かると思う。ちなみにプロポーショナルフォントで字詰めすることもできるのですが今回は敢えて等幅フォントを使っています(これはネタバレです)。

見て欲しい所

 まずテキストのカスケードイン/アウト。イン、アウトそれぞれについてスクリプトで挙動を制御しています(つまり、ユーザーの任意にプログラミングできます)。なめらかなスクロールはイージング係数を掛けています。実用にするにはイージング係数への係数が必要だと作っていて気付きました(来年実装します)。

 そして選択肢のボタン。司エンジンでは選択肢ボタンに相当するコマンドは存在せず、全部自分で組まなければなりません。逆に言えば、なんでも自分で組めるので好きなボタンを作ることができます。ここではボタン上に指定した文字列を表示させていますが、ボタンの状態に応じて画像だろうがアニメだろうが任意のクリッカブル要素を表示できるわけです。

コードについて

 今回のゲームのスクリプトscriptフォルダに入っている物で全部になります。1_0.tksというファイルが(scenario/first.tksというファイルから読み込まれて)実行されます。src.rbというファイルにロジックが放り込まれていて、他のファイルは1画面につき1ファイルに対応しています。

 ほんのちょっとだけコードを解説しておきましょう。

文字通りヘリで[func_select "飛んで逃げる", id: 0]か、あるいは来た
[func_select "道を戻る", id: 1]か。まあヘリなんて一つずつボタン
を押せば後は勝手に飛んでくれるさ。さあ急
  _SET_ :_TEMP_, flag: nil #
  #ウェイク状態まで待機
  _WAIT_ :_TEMP_,  not_equal: {flag: nil} do #
  	_CHECK_ key_push: [K_A] do #
		  _SET_ :_TEMP_, flag: 2
  	end
  end

 func_selectはユーザー定義コマンドで、文字列中に選択肢ボタンを挿入しています。このボタンはクリックされると、一時データストアハッシュのキーflagにidで指定した数字を代入します。

 文字列を表示し終えた後、,_SET_コマンドで一時データストアハッシュのキーflagを初期化します。

 次に△_WAIT_コマンドでflagがnilとイコールで無くなるまで(not_equal)、スクリプトパースをせずに待機状態になります。これはつまり、func_selectでキーflagに値が入るまでは先に進まないということです。

 さて、_WAIT_で待機が決定すると、_WAIT_コマンドに付与したブロックの中のコマンドが実行されます。ここではの_CHECK_コマンドで、キー入力の有無を確認しています。指定したキーが入力された場合はflagを更新します。なのでキーを押されることでも_WAIT_が終了するわけですね(これもネタバレです)。

作り込めなかった部分(サンプルコードになっていません)

 実はサクサク書けたというわけではなく、組んでいる途中でエンジンのバグや不足している機能が判明し、それらを作り込みながらの作業となりました。また、幾つかのバグを回避しながら書いていたので、サンプルコードになっていません(すみません)。年明けにもう少しリファクタリングできればと思っています。

 当初は、テキストアウト時にも時間差でカスケードさせる予定だったのですが、作っている最中で現行仕様では実現できないことがわかりました(少し前に紹介したデモ動画では出来ているのですが、実はこれはコアロジックバグにより副次的に発生していた現象で、バグを直したらできなくなりました)。これの実現方法を考えます。

 また、最初は組み込みのテキストウィンドウをカスタマイズしてゲームを載せるつもりだったのですが、実際にやってみるとどうにも上手くカスタマイズできず、結局テキストウィンドウ周りはまるごとsrc.rbにコピペして内部を弄りました。これもどうにかいしたい所です。出来る気はしているんですがー。

まとめ

 ボタンの当たり判定には矩形の他にも三角形や円、マスク画像を使った不定形を可視/不可視問わず指定できます。デジタルゲームとはインタラクションであり、インタラクションとはボタンです(ホントか?)。これを使えば脱出ゲームくらいは作れる筈です(多分)。色々な可能性を追求してみてくださいませませ。

 明日は土井ヴィさんの「もう少し複雑なゲームを作ってみる(後編)」です!

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/t_tutiya/20151215/1450139110