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