進捗 ゲームシステム編 #03

 obake   character   progress 

一時停止機能を巡る実装の続き

バージョン 0070 を 0071 とすべく作業中。プレイヤーが任意のタイミングで一時停止できる機能は実装完了、要テスト。

FPS が 30 なので動作に滑らかさが足りない。しかし 60 FPS だとたぶんかなり重くなるから HTML5 では動作が難しくなる。低スペックでもそれなりに動くのが前提で作られているため、犠牲にした部分が動作の滑らかさとかってことになる。

画面表示設定はモバイルだと 3:2 , 16:9 , 2:1 の三つから選択できればよさそう。

0070h で実装された一時停止機能、テストがザル、見切り発車で一応良し。暫定。

メッセージシステムと一時停止機能

一時停止機能をメッセージ表示機能と連動させたい。

パズル操作を強制的に停止することになるが、ゲームルール/操作の説明とかをゲームプレイ中に挟みたい場合どうすればいいのか、その実装方法を考えてた。

コンボタイマーを区切りとする方法

コンボタイマーが終了となった時点を一区切りとしてイベント管理用のカウンターをインクリメントして、指定された数値と等しいときに指定されたメッセージを呼びこむ方法で検討中。

ABEYANCE_Chk フラグを追加

  • ABEYANCE_chk フラグは boolean である。
( ABEYANCE_flg と名前が似ているけど、別の役割がある )

ABEYANCE_Flg は実際に一時停止処理が実行される場合にのみ True となり、普段は false

ABEYANCE_Chk は CAbeYance_CheckClick ユーザ定義関数が実行された時、常に false へ値を戻す。次に

  • !MvBricksPaiRFlag
  • CtCaptuN == 0
  • Aflag == true

3つの変数状態を確認して、条件一致した場合に ABEYANCE_chk フラグはTrueとなる。

  • ABEYANCE_Flg → 通常 false で true の場合停止
  • ABEYANCE_Chk → 常にチェックされ値は変更される

ABEYANCE_Chk は一時停止処理が実行可能なタイミングであるか、他から問い合わせがあった時のために予め用意された「答え」。

フラグの実装後

デバッグに使えるので早速使ってみた。一つのフラグを状態監視していればタイミングの可視化も可能な便利フラグ。

動作を観察していると、コンボカウント終了のタイミングよりも、ABEYANCE_Chk が常に false から常に true な状態へ切り替わるタイミングを検出できれば、そこをメッセージイベントフラグの開始タイミングとすることができるのではないかと思った。

コンボを監視しているよりもたぶん確実。

仕組みを作る

体感してみないとどんなもんかよく分からんので作ってみることにした。

ゲームエンジン用のオブジェクトに機能追加するよりイベント管理用オブジェクトを新規で作ったほうが安全か?

GameEngine と MessageSystem を 橋渡しするオブジェクトとして Bridge というグループを作成して

  • Objects +–+ Bridge +–+ GMBridge

という階層を作ってGMBridgeオブジェクトを追加。

Inventory_ui オブジェクト追加

  • Objects +–+ GameEngine +–+ Inventory_ui

上記に Inventory_ui オブジェクトを追加。

これはメッセージシステムとは関係ないけれど、ついでなので作っておく。

GMBridge Object の動作定義

GMBrige はパズル用のゲームエンジンとメッセージシステムを往来する。

パズルゲームエンジンが動作しているときはメッセージシステムの全動作を停止、メッセージシステムが動作しているときはパズルゲームエンジンを動作停止する。

  • パズルゲームエンジン
  • メッセージシステム

この二つは協調して動くが、同時に動かない。どちらかが必ず動作を停止して片方だけが動作する。

GMBridgeは独立したオブジェクトで、フラグ管理を担当する専用オブジェクト。前述されたように二つの動作は交互に動くが、その間で必ず動作しているのが GMBridge である。

  • GMBridge はいつでも動いている

いつでも仲介できるようにいつでも動作しているのが特徴。

INI の Play Section に項目追加

a[12] = “PlayIamHERE”;

セーブデータに追加項目として。この値はグローバルでアプリケーションの起動時に受け取る。初期値は0。

値は global.InitGames[9]; に格納してゲーム中で利用される。

起動時に VGA の情報が正確に取れない場合

エラーメッセージを出して強制的にアプリケーションを終了する処理へと変更。

エラーが発生するタイミング不明だがハードウェア関連はドライバの不良とかも考えられる。ウィンドウ作成時初期化に失敗してるとか可能性もあるけど、GameMakerStudio のブラックボックス部分でもあるから対策のために手を入れようがない。再現性はあるけどタイミングや条件が一切不明というのは難しい。

頻繁に発生するバグではない、むしろ VGA の正確な情報が取れないまま起動できてしまう状態こそ望ましくないはず、なのでこのエラーが発生したらエラーメッセージを出して強制的にアプリを終了する仕様にした。

msg_SystemIcon object の追加

Objects +–+ MessageSystem +–+ SystemMenuTOPBar +–+ msg_SystemIcon としてオブジェクトを追加。

メッセージシステムが動作している時に、ゲームタイトルなどへすぐ戻れるシステムをボタン一つ押しで実現したい。

システム関連で頭を悩ませるのがテクスチャサイズとデザイン。テクスチャはあまりでかくても無駄なので軽くしたい。

MessageSystem に変数を追加

Scripts +–+ MessageSystem +–+ SysIcon_Chk_Push の Child Script である SysIcon_Call_Menu を編集中

Objects +–+ MessageSystem +–+ MessageMenuTOPBar +–+ “msg_SystemIcon”.object の動作を定義。

システムアイコンボタンが押された後の動作を編集中

シェーダの追加

カスタムシェーダを作成。新しいのを作ったついでに凍結してあった GMS Shader 48 を復旧。

Shader 48 は日付見たら二年ぶりの更新だった。

Shader 48 は HUGO の古い環境を維持していた頃に作ったブログで、HUGO がアップデートで CSS の一部に下位互換を無くしたため従来使えていたテーマが使えなくなったりスタイルに異常が発生。既存テーマを大幅にカスタムして使っていたから、自力でテーマを修正しなければならず、その修正作業が苦痛でブログも更新できなくなった。HUGO の古い環境も OS ごとバックアップに残してはあるのだけど、どうも起動する気にならない。畳と女房は新しい方がいいってあれか?

今回気が向いたので修正したが、強引な方法で直したから無駄が多くいずれこのブログテーマは捨てて新しいものをフルスクラッチで作る必要が出てくるだろう。

HUGO 自体はどんどん便利になっているためアップデートは大歓迎なのだが、テーマの自作はモチベーションが常に低い。テーマは誰かが作ってくれたものを使ってカスタムするのが一番ラクで良い。そしてカスタムしすぎてほとんど自作テーマみたいになってしまい、それが動かなくなると最悪。直すためのモチベーションなんてそうそう都合良く湧いてこない。

しかし記事をどうしても追加したい場合はやらざるを得ないから、直した。しかしあと 32 個追加しないと 48 に満たない。考え無しに 48 個シェーダを作ろうとか、無茶ですよ馬鹿なんじゃないのどうかしてる。

一ヶ月に一個追加していっても三年近くかかる…月に三個ペースで追加できれば一年で達成。六個ペースなら半年以内だ。作業量を考えないで安易に名前付けるなよ思いました。

でもせっかく直したので Shader48 にあと数個は確実に記事追加する予定。




次へ

前へ