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