Transcript コマンド入力とユーティリティクラス
プロジェクト演習Ⅳ インタラクティブゲーム制作 プログラミング4
2011/10/25 コマンド入力判定と ユーティリティクラス
今日の内容
• コマンド入力判定をしてみよう • その処理を通じて「ユーティリティクラス」の作 り方を考えよう
ユーティリティクラスとは
• • 便利クラスのこと – 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つの変数に分かれると面倒だなぁ – じゃあ構造体作って、それの配列にしよう • 必要に応じて、データをまとめたクラス (構造体)を用いると色々スッキリする
設計の発展案
• • 以下には対応できるとモアベター – ため入力 – 入力向きの左右入れ替わり – アナログスティックの入力値 上記を実現するために必要なこと – 構造体ではなく、クラス化して継承を用いる – 異なるタイプの判定でも共通の関数で判定できる ようにする
いわゆる3D格闘ゲームの コマンド判定は?
• • いわゆる「PPPK」などのコマンド – 最初のパンチのモーション中に次のパンチボタン が押されたら、2つのパンチのモーションに移行す る、という仕組みで実現している – 分かりやすく言えばチェーンコンボをルート限定 で設定しているようなもの 状態遷移の構造化によって実現してるので、 これについてはまた別の機会に
今日の課題
• 右記の入力判定を 実現してみよう – CommandTriggerクラス をそのまま使ってもいい し、使う側で色々工夫し てもいい – でも出来る限りクラス側 を拡張して、使う側は簡 単に扱えるようにしよう • • • • 1回転コマンド ボタン連打コマンド 4ため646Kコマンド 瞬獄殺コマンド • アナログ入力で – – 任意方向のダッシュ バーチャロンのジャンプ、 しゃがみ、旋回