● クマー
元ネタ
即採用。
で、今回は (1クマー)
● 今回のサンプル
Xbox360 コントローラーを使って、いろんな操作が出来ます。前回のサンプル再利用です。
左スティック |
スプライトの移動 |
A, B, X, Y, START |
スプライトの色変更 |
左右トリガー(LT, RT) |
スプライトの回転 |
右スティック |
スプライトの拡大縮小 |
BACK |
終了 |
● Xbox360 コントローラ 各部名称
● フィールド
いろんな動作が出来るように、いろいろパラメータを追加しました。
Vector2 pos = new Vector2(400, 300);
Color color = Color.White;
float rotate = 0.0f;
Vector2 origin = Vector2.Zero;
Vector2 scale = Vector2.One;
● スプライトの原点位置
this.origin = new Vector2(this.texture.Width / 2, this.texture.Height / 2);
テクスチャーを読み込んだ後、テクスチャーのサイズからスプライトの中心位置を求めています。
● 更新処理コード
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
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);
}
● ゲームパッドの入力状態取得
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 でいいです。 |
サンプルプロジェクトです。