TOP

ABOUT

PROGRAM

DIALY







Tutorialのお勉強(3)

 1.はじめに
 3DモデルをX箱のコントローラーで動かします。




 2.コントローラー入力
 まずは,3Dモデルを表示させます。表示の仕方は「Tutorialのお勉強(2)」を参考にしてください。
前回のプログラムに修正を加えるところはコントローラーの入力の処理のところです。
Update()メソッドを修正し,UpdateInput()メソッドを新たに追加します。
ゲームパッドの状態をGamePad.GetState()メソッドによって取得します。一人でゲームをやっていると仮定しているので,このメソッドの引数はPlayerIndex.Oneにしておきます。2人の場合は一人目がPlayerIndex.One,二人目がPlayerIndex.Twoに引数を設定すれば,それぞれのゲームパッドの状態が取得できます。
00107:          /// <summary>
00108:          /// Allows the game to run logic such as updating the world,
00109:          /// checking for collisions, gathering input, and playing audio.
00110:          /// </summary>
00111:          /// <param name="gameTime">Provides a snapshot of timing values.</param>
00112:          protected override void Update(GameTime gameTime)
00113:          {
00114:              // Allows the game to exit
00115:              if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
00116:                  this.Exit();
00117:  
00118:              // TODO: Add your update logic here
00119:              UpdateInput();
00120:  
00121:              // 位置の更新
00122:              modelPosition += modelVelocity;
00123:  
00124:              // 速度ベクトルを徐々に小さくする
00125:              modelVelocity *= 0.95f;
00126:  
00127:              base.Update(gameTime);
00128:          }
00129:  
00130:          ///<summary>
00131:          /// キー入力の更新処理
00132:          ///</summary>
00133:          protected void UpdateInput()
00134:          {
00135:              //ゲームパッドの状態を取得
00136:              GamePadState currentState = GamePad.GetState(PlayerIndex.One);
00137:              if (currentState.IsConnected)
00138:              {
00139:                  // 回転角
00140:                  modelRotation -= currentState.ThumbSticks.Left.X * 0.10f;
00141:  
00142:                  // 加算用の変数を作成
00143:                  Vector3 modelVelocityAdd = Vector3.Zero;
00144:  
00145:                  // 回転
00146:                  modelVelocityAdd.X = -(float)Math.Sin(modelRotation);
00147:                  modelVelocityAdd.Z = -(float)Math.Cos(modelRotation);
00148:  
00149:                  // トリガーが押されている時間によってベクトルを拡大
00150:                  modelVelocityAdd *= currentState.Triggers.Right;
00151:  
00152:                  // 速度に加算
00153:                  modelVelocity += modelVelocityAdd*0.01f;
00154:  
00155:                  // コントローラーを振動させる
00156:                  GamePad.SetVibration(PlayerIndex.One, currentState.Triggers.Right, currentState.Triggers.Right);
00157:  
00158:                  // 見えなくなった場合,Aボタンでリセット
00159:                  if (currentState.Buttons.A == ButtonState.Pressed)
00160:                  {
00161:                      modelPosition = Vector3.Zero;
00162:                      modelVelocity = Vector3.Zero;
00163:                      modelRotation = 0.0f;
00164:                  }
00165:              }
00166:          }
00167:  

 左スティックの横方向で回転するようにcurrentState.ThumbSticks.Left.Xをモデルの回転角であるmodelRotaionに減算代入します。ここでは回転速度をいい感じにするために0.1fを調整用係数として掛けてありますが,自分に合うようにこの係数は変えてみてください。
あとは右トリガーで前進するようにmodelVelocityAddに乗算代入します。速度の調整はmodelVelocityに加算代入するときに行いました。ここでは速度調整係数を0.01fにしてあります。お好みに合わせて変数は調整してください。
あとは右トリガーが引かれているときにコントローラーを振動させる処理を入れます。GamePad.SetVibration()メソッドで振動させます。Xbox360ゲームコントローラーには振動を作成するモーターが2つ装備されているそうです。左側のモーターは振動数が低く,右側のモーターは振動数が高いモーターになっているそうです。上のコードではプレイヤーインデックスが1のプレイヤーのコントローラーの左側のモーターと右側のモーターを右トリガーによって振動させるようになっています。
これで基本的には終了なのですが,モデルの移動制限をかけていないため,画面の外にモデルがいってしまいモデルが見えなくなってしまいます。モデルが見えなくなった場合にリセットできるようにAボタンが押されたときにmodelPositionとmodelVelocity,modelRotationをゼロにする処理を加えておきます。


 Download
本ソースコードおよびプログラムを使用したことによる如何なる損害も製作者は責任を負いません。
本ソースコードおよびプログラムは自己責任でご使用ください。
プログラムの作成にはMicrosoft Visual Studio 2005 SP1 Professional, XNA Game Studio 2.0を用いています。