オノデラの研究日記 in わんくま

思いついたネタを気ままに書いていくブログ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  209  : 記事  5  : コメント  534  : トラックバック  37

ニュース

プロフィール

  • ●おのでら
    宮城県在住
    主に業務向けソフトを製作

Twitter

ニュース

主なリンク

XNA 関連リンク

アイテム

ゲーマーカード

その他

記事カテゴリ

書庫

日記カテゴリ

● クマー

 元ネタ

 即採用。

 で、今回は (1クマー)


● 今回のサンプル

 Xbox360 コントローラーを使って、いろんな操作が出来ます。前回のサンプル再利用です。

左スティック スプライトの移動
A, B, X, Y, START スプライトの色変更
左右トリガー(LT, RT) スプライトの回転
右スティック スプライトの拡大縮小
BACK 終了

 Xbox360 コントローラ入力サンプル


● Xbox360 コントローラ 各部名称

Xbox360 コントローラ 各部名称 Xbox360 コントローラ 各部名称


● フィールド

 いろんな動作が出来るように、いろいろパラメータを追加しました。

/// <SUMMARY>
/// スプライトの位置
/// </SUMMARY>
Vector2 pos = new Vector2(400300);

/// <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 / 2this.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.5f2.0f);
    this.scale.Y = (float)Math.Pow((state.ThumbSticks.Right.Y + 2.0f) * 0.5f2.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.5f2.0f);
this.scale.Y = (float)Math.Pow((state.ThumbSticks.Right.Y + 2.0f) * 0.5f2.0f);

 拡大縮小は右スティックを使用して変化させています。拡大量の計算式は適当です。


● スプライトの描画

// スプライトの描画
this.sprite.Draw(this.texture, this.pos, nullthis.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 でいいです。


 サンプルプロジェクトです。

投稿日時 : 2007年1月25日 0:25

コメント

No comments posted yet.

Post Feedback

タイトル
名前
Url:
コメント