XNAにおける入力情報の保持
また、XNAではキーボード情報を取得することが行えるため、入力系統はXbox 360コントローラーとキーボードとなります。
このことからシューティングゲームやアクションゲーム等を開発する際には、メイン入力はXbox 360コントローラー、サブ入力としてキーボードという設計にするのが融通が利いて良いかと思います。
入力情報はMicrosoft.Xna.Framework.Inputのネームスペースに全て集約されており、この中にキーボード情報を保持するKeyboardクラス、コントローラー情報を保持するGamePadクラスがあり、これらを用いて入力情報を取得することができます。
入力情報はJavaのイベントと違いリアルタイムに取得することができるため、タスク処理(キャラクター処理)中に本クラスにアクセスすれば状態が分ります。
入力情報の取得は例として記述するとこのような雰囲気です。
キーボードの入力情報の取得
KeyboardState ks = Keyboard.GetState(); if (ks.IsKeyDown(Keys.Up) == true) |
Xbox 360コントローラーの入力情報の取得
// コントローラ1からの状態取得 // 左スティック // ボタン A |
このように入力情報の取得方法は非常にシンプルです。
…が、本格的にゲーム設計をすると、以下の事を考慮することになります。
1.もしもコントローラーが装着されていない場合はキーボード入力を優先する。
2.ボタンが押下されている時と離されている状況を判断するケース(PAUSE機能の
ようなトグル状況)をサポートする場合は、その状態を保持するようにする。
3.キーボードの方向から、アナログスティックの状態に変換する。
等がまず容易に想定できます。
特に「3.」に関しては重要で、XNAのメイン入力はおおよその場合、方向入力はアナログスティックとなり、情報はVector2クラスのflortデータとなります。上下左右を例に取ると上は1~下は-1となり、左は-1~右は1となります(何も入力されていない場合は全て0となります) 。
キーボードの場合はデジタル入力となるので、単純変換の場合は、上下左右を1,-1,-1,1に変換する必要がありますが、そうでない場合は手前でキーリピートのタイミングと場合により何フレームのタイミングで上昇下降を計算するようにプログラミングしなければなりません(あまりそのような設計にはしないとは思いますが…)。
これらの事から、上述にて「タスク処理(キャラクター処理)中に本クラスにアクセスすれば~」云々と述べましたが、それはあまり現実的ではなく、実際には入力処理用のクラスを設計し、入力状況を管理する設計が望まれます。
イメージはこのような感じです。

« 昔のゲームの想い出 [0004] 「テレビブロック」 [エポック社] [1979] [テレビブロック] l Home l Javaにおける入力情報の保持 »