● 今回のサンプル
Xbox360 コントローラーを使って、いろんな操作が出来ます。
| 左スティック | スプライトの移動 |
| A, B, X, Y, START | スプライトの色変更 |
| 左右トリガー(LT, RT) | スプライトの回転 |
| 右スティック | スプライトの拡大縮小 |
| BACK | 終了 |
● Xbox360 コントローラ 各部名称
● フィールド
いろんな動作が出来るように、いろいろパラメータを追加しました。
/// <summary> /// スプライトの位置 /// </summary> Vector2 pos = new Vector2(400, 300); /// <summary> /// スプライトの色 /// </summary> Color color = Color.White; /// <summary> /// スプライトの回転量(radian) /// </summary> float rotate = 0.0f; /// <summary> /// スプライトの回転軸位置 /// </summary> Vector2 origin = Vector2.Zero; /// <summary> /// スプライトの拡大率 /// </summary> Vector2 scale = Vector2.One;
● スプライトの原点位置
// テクスチャーのサイズから回転軸位置を求める this.origin = new Vector2(this.texture.Width / 2, this.texture.Height / 2);
テクスチャーを読み込んだ後、テクスチャーのサイズからスプライトの中心位置を求めています。
● 更新処理コード
/// <summary> /// 描画以外のデータ更新等の処理を行うメソッド /// </summary> /// <param name="gameTime">このメソッドが呼ばれた時点でのゲーム時間</param> protected override void Update(GameTime gameTime) { // Xbox360 コントローラの BACK ボタンを押したときにゲームを終了させます if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); // TODO: ここに更新処理を記述してください // ゲームパッド(Xbox360 コントローラー)の状態を取得 GamePadState state = GamePad.GetState(PlayerIndex.One); // 左右に移動 this.pos.X += state.ThumbSticks.Left.X * 8.0f; // 上下に移動 this.pos.Y -= state.ThumbSticks.Left.Y * 8.0f; // スプライトの色変更 if (state.Buttons.A == ButtonState.Pressed) { this.color = Color.Green; } if (state.Buttons.B == ButtonState.Pressed) { this.color = Color.Red; } if (state.Buttons.X == ButtonState.Pressed) { this.color = Color.Blue; } if (state.Buttons.Y == ButtonState.Pressed) { this.color = Color.Yellow; } if (state.Buttons.Start == ButtonState.Pressed) { this.color = Color.White; } // 回転 this.rotate += (state.Triggers.Right - state.Triggers.Left) * 0.2f; // 拡大縮小 this.scale.X = (float)Math.Pow((state.ThumbSticks.Right.X + 2.0f) * 0.5f, 2.0f); this.scale.Y = (float)Math.Pow((state.ThumbSticks.Right.Y + 2.0f) * 0.5f, 2.0f); base.Update(gameTime); }
● ゲームパッドの入力状態取得
// ゲームパッド(Xbox360 コントローラー)の状態を取得 GamePadState state = GamePad.GetState(PlayerIndex.One);
コントローラーのボタンなどの入力状態を GamePad.GetState メソッドで受け取ることが出来ます。複数のコントローラーが付いている場合もあるので、PlayerIndex 列挙を使用して、特定のコントローラーの状態を取得するようにします。
キーボードと同様にこれも1行で完了です。
● 移動
// 左右に移動 this.pos.X += state.ThumbSticks.Left.X * 8.0f; // 上下に移�� this.pos.Y -= state.ThumbSticks.Left.Y * 8.0f;
コントローラーの左スティックでスプライトを移動させています。左スティックの位置は GamePadState.ThumbSticks.Left に格納されています。
キーボードの方向キーとは違って、スティックには倒した量(-1.0f ~ 1.0f)が含まれるので、スプライトの移動量をスティックで自由に変えることが出来ます。
● 色変更
// スプライトの色変更 if (state.Buttons.A == ButtonState.Pressed) { this.color = Color.Green; } if (state.Buttons.B == ButtonState.Pressed) { this.color = Color.Red; } if (state.Buttons.X == ButtonState.Pressed) { this.color = Color.Blue; } if (state.Buttons.Y == ButtonState.Pressed) { this.color = Color.Yellow; } if (state.Buttons.Start == ButtonState.Pressed) { this.color = Color.White; }
コントローラーの各ボタンでスプライトの色を変えられるようにしました。各ボタンの状態は GamePadState.Buttons に格納されているので、ButtonState 列挙で状態を調べます。
● 回転
// 回転 this.rotate += (state.Triggers.Right - state.Triggers.Left) * 0.2f;
トリガーボタンを使用して、スプライトの回転量を変化させています。トリガーは通常のボタンと違って 0.0f ~ 1.0f の押下量で取得できます。なので、押している量によって回転のスピードを変化させることが出来ます。
● 拡大縮小
// 拡大縮小 this.scale.X = (float)Math.Pow((state.ThumbSticks.Right.X + 2.0f) * 0.5f, 2.0f); this.scale.Y = (float)Math.Pow((state.ThumbSticks.Right.Y + 2.0f) * 0.5f, 2.0f);
拡大縮小は右スティックを使用して変化させています。拡大量の計算式は適当です。
● スプライトの描画
// スプライトの描画 this.sprite.Draw(this.texture, this.pos, null, this.color, this.rotate, this.origin, this.scale, SpriteEffects.None, 0.0f);
以前と違い、回転や中心位置などを指定できるメソッドを使っています。各引数の意味は下のとおりです。
| texture | 描画するテクスチャー |
| position | スプライトの位置。origin を基準に計算する。 |
| sourceRectangle | 描画しようとするテクスチャーの使用する矩形範囲。null を指定すると、テクスチャー全体を使用して描画する。 |
| color | スプライトの色。出力色 = color × テクスチャーの色 |
| rotation | 時計回りでの回転量。単位は Radian。 |
| origin | スプライトの原点位置。 |
| scale | スプライトの拡大縮小 |
| effects | スプライト回転オプション。特に無ければ SpriteEffects.None でいいです。 |
| layerDepth | スプライトのソート用深度。今回は 0 でいいです。 |