スライド 1

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