15
プププププププププププププププププププププ プ3プ プププププププププ ププププププププププ

プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

Embed Size (px)

DESCRIPTION

プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作. 第 3 回 コマンド入力判定と ユーティリティクラス. 今日の内容. コマンド入力判定をしてみよう その処理を通じて「ユーティリティクラス」の作り方を考えよう. ユーティリティクラスとは. 便利クラスの こと FKUT は、 FK というライブラリを使う上でまとまっているとお手軽だったり、便利だったりするユーティリティクラスの集まり 自分でも作 ろう! ゲームでよく使う処理をクラス化しておく どのゲームでも使えそうなものをストックしておくと Very good. FKUT シリーズ トラックボール - PowerPoint PPT Presentation

Citation preview

Page 1: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

プロジェクト演習Ⅳ・Ⅵインタラクティブゲーム制作

第 3回コマンド入力判定とユーティリティクラス

Page 2: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

今日の内容

• コマンド入力判定をしてみよう

• その処理を通じて「ユーティリティクラス」の作り方を考えよう

Page 3: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

ユーティリティクラスとは• 便利クラスのこと

– FKUTは、 FKというライブラリを使う上でまとまっているとお手軽だったり、便利だったりするユーティリティクラスの集まり

• 自分でも作ろう!– ゲームでよく使う処理をクラス化しておく

– どのゲームでも使えそうなものをストックしておくと Very good.

• FKUTシリーズ– トラックボール– スプライト– オーディオ– シンプルウィンドウ– フルスクリーン– インプット– フレームレート制御– モーション– 動画再生

Page 4: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

今回のサンプル

• fkut_Inputの実践的活用例• EventManagerを拡張して、 SimpleWindowのような入力判定をゲームパッドでも実現

• 某格闘ゲームライクなコマンド判定の実装例

Page 5: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

使い方のポイント

• Inputクラスのヘッダを見てみよう–丁寧なコメントの山が見えます

• 誰かに使ってもらうクラスには、これくらいのコメントが理想– Doxygenを使うとマニュアルが作れるレベル

• それ以外のクラスについては。。。–てへ☆–今日の授業を通じてコメント付けておこう

Page 6: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

EventManagerの意義

• fk_Windowにしろ Inputクラスにしろ、「その時点での状態」しか取れない– キー操作は「押した瞬間」「離した瞬間」も重要

• このクラスで以下のような機能を実現– キーの状態をRELEASE, UP, DOWN, PRESSに分けて定義する

– 前回の update時の情報を保持し、 4種類のステータスが取れるようにする

• 生のデータが取れるクラスを、自分のクラスで包み込んで、自分なりに使いやすくする– このようなクラス化を「ラッピング」と呼ぶ

Page 7: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

方向キーの表記について

• 格闘ゲームなどでは方向キーの入力方向をテンキー表記することがある

• EventManagerでもそれを採用– 方向入力なし (ニュートラル )は 5で表現

 7 8 94 N 61 2 3

Page 8: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

コマンド判定の実現

• 一般的には 2種類の方針が考えられる–キー操作の履歴を一定時間分残しておき、フレームごとにそれぞれのコマンドが成立しているかをチェック

–コマンドごとにフラグの集合体を作り、コマンドを構成する入力が合ったらフラグを立てていく。全てフラグが立ったら発動。入力始めから制限時間を過ぎたら不発。

Page 9: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

1つのコマンド判定をオブジェクトとして扱う

• コマンドバッファ式も由緒正しい良い方法だが、オブジェクト指向っぽく書くにはフラグ集合体形式がやや有利?– プロでも両方使ってます

• 以下のように使えるのが目標– 判定したいコマンドの個数分、変数 (オブジェクト )を用意する

– それぞれにコマンド情報をセットする– 毎フレームの関数呼び出しでコマンド成立を判定する• どのコマンドから判定していくかは使う側次第

Page 10: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

条件をデータ化する…?

• 「条件分岐」という「処理」に気を取られすぎると、データと処理が癒着したコードを書いてしまいがち

• プログラミングの極意!–何を変数で表すのがベストかを考える–その変数を「入力データ」とし、どう「処理」するかを考える

Page 11: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

CommandTriggerクラスの設計

• 必要なデータ– phase• コマンド入力がどの段階まで進んでいるか

– regTime• コマンド入力し始めの時間 (ミリ秒 )

– limitTime• そのコマンドを受け付ける制限時間 (ミリ秒 )

– commandArray• 1ステップ分のコマンド判定情報の配列

Page 12: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

判定に必要な情報

• どのキーが、どの状態になればいいのか– これらが変数で取れれば判定できる

• でも同時押しの判定はどうしよう?– じゃあどの段階の判定か、も持たせて、同じ段階の判定はまとめて処理するようにしよう

• 3つの変数に分かれると面倒だなぁ– じゃあ構造体作って、それの配列にしよう

• 必要に応じて、データをまとめたクラス(構造体 )を用いると色々スッキリする

Page 13: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

設計の発展案

• 以下には対応できるとモアベター–ため入力–入力向きの左右入れ替わり–アナログスティックの入力値

• 上記を実現するために必要なこと–構造体ではなく、クラス化して継承を用いる–異なるタイプの判定でも共通の関数で判定できるようにする

Page 14: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

いわゆる 3D格闘ゲームのコマンド判定は?

• いわゆる「 PPPK」などのコマンド–最初のパンチのモーション中に次のパンチボタンが押されたら、 2つのパンチのモーションに移行する、という仕組みで実現している

–分かりやすく言えばチェーンコンボをルート限定で設定しているようなもの

• 状態遷移の構造化によって実現してるので、これについてはまた別の機会に

Page 15: プロジェクト演習 Ⅳ ・ Ⅵ インタラクティブゲーム制作

今日の課題

• 右記の入力判定を実現してみよう– CommandTriggerクラスをそのまま使ってもいいし、使う側で色々工夫してもいい

– でも出来る限りクラス側を拡張して、使う側は簡単に扱えるようにしよう

• 1回転コマンド• ボタン連打コマンド• 4ため 646Kコマンド

• 瞬獄殺コマンド

• アナログ入力で– 任意方向のダッシュ– バーチャロンのジャンプ、しゃがみ、旋回