プロジェクト演習Ⅳ・Ⅵ インタラクティブゲーム制作 第3回 コマンド入力判定と ユーティリティクラス
今日の内容 コマンド入力判定をしてみよう その処理を通じて「ユーティリティクラス」の作り方を考えよう
ユーティリティクラスとは 便利クラスのこと 自分でも作ろう! FKUTシリーズ FKUTは、FKというライブラリを使う上でまとまっているとお手軽だったり、便利だったりするユーティリティクラスの集まり 自分でも作ろう! ゲームでよく使う処理をクラス化しておく どのゲームでも使えそうなものをストックしておくとVery good. FKUTシリーズ トラックボール スプライト オーディオ シンプルウィンドウ フルスクリーン インプット フレームレート制御 モーション 動画再生
今回のサンプル fkut_Inputの実践的活用例 EventManagerを拡張して、SimpleWindowのような入力判定を ゲームパッドでも実現 某格闘ゲームライクなコマンド判定の 実装例
使い方のポイント Inputクラスのヘッダを見てみよう 誰かに使ってもらうクラスには、これくらいのコメントが理想 丁寧なコメントの山が見えます 誰かに使ってもらうクラスには、これくらいのコメントが理想 Doxygenを使うとマニュアルが作れるレベル それ以外のクラスについては。。。 てへ☆ 今日の授業を通じてコメント付けておこう
EventManagerの意義 fk_WindowにしろInputクラスにしろ、 「その時点での状態」しか取れない キー操作は「押した瞬間」「離した瞬間」も重要 このクラスで以下のような機能を実現 キーの状態をRELEASE, UP, DOWN, PRESSに 分けて定義する 前回のupdate時の情報を保持し、4種類のステータスが取れるようにする 生のデータが取れるクラスを、自分のクラスで包み込んで、自分なりに使いやすくする このようなクラス化を「ラッピング」と呼ぶ
方向キーの表記について 格闘ゲームなどでは方向キーの入力方向をテンキー表記することがある EventManagerでもそれを採用 方向入力なし(ニュートラル)は5で表現 7 8 9 4 N 6 1 2 3
コマンド判定の実現 一般的には2種類の方針が考えられる キー操作の履歴を一定時間分残しておき、 フレームごとにそれぞれのコマンドが 成立しているかをチェック コマンドごとにフラグの集合体を作り、 コマンドを構成する入力が合ったらフラグを立てていく。全てフラグが立ったら発動。 入力始めから制限時間を過ぎたら不発。
1つのコマンド判定を オブジェクトとして扱う コマンドバッファ式も由緒正しい良い方法だが、オブジェクト指向っぽく書くにはフラグ集合体形式がやや有利? プロでも両方使ってます 以下のように使えるのが目標 判定したいコマンドの個数分、 変数(オブジェクト)を用意する それぞれにコマンド情報をセットする 毎フレームの関数呼び出しでコマンド成立を判定する どのコマンドから判定していくかは使う側次第
条件をデータ化する…? 「条件分岐」という「処理」に気を取られすぎると、データと処理が癒着したコードを書いてしまいがち プログラミングの極意! 何を変数で表すのがベストかを考える その変数を「入力データ」とし、 どう「処理」するかを考える
CommandTriggerクラスの設計 必要なデータ phase コマンド入力がどの段階まで進んでいるか regTime コマンド入力し始めの時間(ミリ秒) limitTime そのコマンドを受け付ける制限時間(ミリ秒) commandArray 1ステップ分のコマンド判定情報の配列
判定に必要な情報 どのキーが、どの状態になればいいのか でも同時押しの判定はどうしよう? 3つの変数に分かれると面倒だなぁ これらが変数で取れれば判定できる でも同時押しの判定はどうしよう? じゃあどの段階の判定か、も持たせて、 同じ段階の判定はまとめて処理するようにしよう 3つの変数に分かれると面倒だなぁ じゃあ構造体作って、それの配列にしよう 必要に応じて、データをまとめたクラス (構造体)を用いると色々スッキリする
設計の発展案 以下には対応できるとモアベター 上記を実現するために必要なこと ため入力 入力向きの左右入れ替わり アナログスティックの入力値 構造体ではなく、クラス化して継承を用いる 異なるタイプの判定でも共通の関数で判定できるようにする
いわゆる3D格闘ゲームの コマンド判定は? いわゆる「PPPK」などのコマンド 最初のパンチのモーション中に次のパンチボタンが押されたら、2つのパンチのモーションに移行する、という仕組みで実現している 分かりやすく言えばチェーンコンボをルート限定で設定しているようなもの 状態遷移の構造化によって実現してるので、これについてはまた別の機会に
今日の課題 右記の入力判定を 実現してみよう 1回転コマンド ボタン連打コマンド 4ため646Kコマンド 瞬獄殺コマンド アナログ入力で CommandTriggerクラスをそのまま使ってもいいし、使う側で色々工夫してもいい でも出来る限りクラス側を拡張して、使う側は簡単に扱えるようにしよう 1回転コマンド ボタン連打コマンド 4ため646Kコマンド 瞬獄殺コマンド アナログ入力で 任意方向のダッシュ バーチャロンのジャンプ、しゃがみ、旋回