XNA GSE チュートリアル2 とりあえずコーディング


どもども、多忙と言うよりは、熱出したり外出していたりといった感じで、なかなか更新には至らなかった次第。
あれ?
誰に言い訳してんだ?
まぁ、いいや。
あくまでマイペースにやります。
ところで、ブログペットが勝手に更新しやがって、前々回のタイトルをパクリやがったうえに、どうでもいい記事が投稿されていましたね。
なんか、あのとき、アクセス数が伸びていたのが忍ばれます・・・。
少しは見ている人が・・いる、と?

で、タイトル通りチュートリアル2を進めていきたいと思います。
このチュートリアルでは前回紹介したXbox 360コントローラーを使ってチュートリアル1のモデルを動かしちゃおう、と言うものです。
早速前回のソリューションファイルを開いてください。
ステップ1はコントローラーのセットアップに関する記述なので飛ばします。
ステップ2から始めましょう。

ステップ2:モデルの回転や移動を作成する
まず、Updateクラスを探してください。
その前後を下記のような感じで書き換えてみてください。

//モデルの移動変化量を各フレーム上のモデル位置に反映させる
Vector3 modelVelocity = Vector3</strong>.Zero;
protected override void Update(GameTime gameTime)
{
//パッドのBackボタンを押すと終了
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
//入力の受け付け
UpdateInput();
//現在のポジションに移動変化量を加算する
modelPosition += modelVelocity;
//操作後の移動変化量の減少度合いを記述
modelVelocity *= 0.95f;
base.Update(gameTime);}

ベロシティーの表現については、自分なりに解釈した結果、移動変化量と表現することにしました。
まず最初にVector3modelVelocityを宣言し、すべての値をゼロにして初期化します。
続いて、Updateメソッド内にUpdateInputを呼び出すのですが、ステップ2では未記述のメソッドです。従って、今コンパイルするとエラーが起きます。

modelPositionmodelVelocityの値を加算し、移動させます。
たぶん、UpdateInputメソッドでmodelVelocityに値が渡されるのでしょう。
そして、それが終了したら、modelVelocity0.95をかけ、徐々にスピードを落とすという感じでしょうか?

ステップ3:ユーザーからの入力待ち受け

ここでは実際に入力を受け付けの手続きと、それに伴うアクションを記述していきます。
チュートリアルによると、今回は以下の機能を実現することを目的とします。

左スティックを右か左に倒した時、modelRotationの数値を増減させる。
右トリガーを引いた時、modelRotationの方位を元にmodelVelocityの移動量を加算する。
Aボタンを押した時、モデルのポジションと、移動量、回転の数値をリセットして画面中央に”ワープ”させる。

また、注意書きには「トリガーとスティックはアナログコントロールです。
これが意味することは、単純にオン・オフすると言うよりも、それらを動かした量を知らせることができると言うことです。
Xbox 360コントローラーには、2つのスティックと2つのトリガーがアナログコントロールです。
そして、他のボタンはデジタルボタンです。」とのこと。
当たり前ですけど、一応。

さて、コードを書き換えましょう。

Updateメソッドの下の空いたスペースを見つける。
protected void UpdateInput()と呼ばれる新しいメソッドを追加する。
・メソッドを下記のように書き換える。

protected void UpdateInput()
{
//ゲームパッドの状態を取得する
GamePadState currentState = GamePad.GetState(PlayerIndex.One);
if (currentState.IsConnected) {
//左スティックを使ったモデルの回転
modelRotation -= currentState.ThumbSticks.Left.X * 0.10f;
//トリガーを引いた時の移動変化量に関する関数
Vector3 modelVelocityAdd = Vector3.Zero;
//回転をさせる時、どの方向に押し込んだのかを検出
modelVelocityAdd.X = -(float)Math.Sin(modelRotation);
modelVelocityAdd.Z = -(float)Math.Cos(modelRotation);
//トリガーを引いたらどれだけ移動するか
modelVelocityAdd *= currentState.Triggers.Right;
//最後に、移動変化量にこの移動量を加える
modelVelocity += modelVelocityAdd;
//移動時に振動させる
GamePad.SetVibration(
PlayerIndex.One,
currentState.Triggers.Right,
currentState.Triggers.Right);
//画面外にはみ出た場合、Aボタンを押すことにより、中心に戻す
if (currentState.Buttons.A == ButtonState.Pressed) {
modelPosition = Vector3.Zero;
modelVelocity = Vector3.Zero;
modelRotation = 0.0f;
}
}
}

ここまで追加したらビルドができるはずです。
で、実行すると以下のような感じでグリグリ動かせます。
いやいや、Nintendo64でマリオがグリグリ動いた時を思い出します。
革命的じゃありませんか?
まぁ、現状ではただ”やらされてる”感が強いわけですが・・・。
まぁ・・・いつかは・・・ね(笑。

xna_19

あと、前回ちょっと触れたとおり、ドライバモデルの違いから、Xbox 360コントローラーを公式ドライバで動かさないと動作しません。
非公式ドライバが走っている場合は公式ドライバを一時的に適用させてください。
また、公式ドライバでは振動がサポートされていない旨が書かれていますが、実行した皆さんならお気づきの通り、サポートされています。
そのあたりの事情は不明ですが、これもドライバモデルやら、XNAとの兼ね合いなど問題があるのでしょう。
中途半端で申し訳ないのですが、今回はここまでです。後半追加したコードの解説は次回行いますので、とりあえずここまで。

アディオス。

Post to Twitter

, ,

  1. No comments yet.
(will not be published)