コマンド入力とユーティリティクラス

Download Report

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コマンド 瞬獄殺コマンド • アナログ入力で – – 任意方向のダッシュ バーチャロンのジャンプ、 しゃがみ、旋回