spBatch で画像を回転

spriteBatch で画像を回転する方法を説明します。
深度(Zバッファの値)を使う方法も説明します。
Enemy の向きを設定するプログラムは Enemy の方向に Ship を向ける を参照して下さい。

前田稔(Maeda Minoru)の超初心者のプログラム入門

プログラムの説明

  1. spriteBatch.Draw() には、幾つかのパラメータの設定方法があります。
    ここでは spriteBatch で画像を回転するプログラムを作成します。
    myTexture には、回転しながら描画する画像をロードします。
    私は「騎士」の画像を使いましたが、適当なサイズであれば何でも構いません。
        Texture2D   myTexture;      // 描画に使用するテクスチャ
        
  2. LoadContent() で画像をロードします。
    kishi.png が画像ファイルの名前です。
        myTexture = Texture2D.FromFile(graphics.GraphicsDevice, "c:\\data\\test\\kishi.png");
        
  3. pos は画像を描画する座標です。
    org は回転の基点となる座標で、最初は画像の中央(画像サイズ=128)に設定しています。
    rot は回転係数で、ラジアン角(360度=2πラジアン)で設定します。
    これらの値はキーボードから操作できるようにプログラムしています。
        Vector2     pos = new Vector2(200,200);
        Vector2     org = new Vector2(64, 64);
        float       rot = 0;
        
    また現在の値を確認できるように、常にウインドウのキャプションに表示してみました。
        #region ★Title Bar にデバッグ情報を表示
        public void VerMsg()
        {
            string wstr;
            wstr = "SIZE=(128,128) POS=(" + pos.X + "," + pos.Y + ") ORG=(" + org.X + "," + org.Y + ") ROT=" + rot;
            base.Window.Title = wstr;
        }
        #endregion
        
  4. 画像を回転しながら描画するコードです。
    pos, rot, org を使って画像を回転しながら描画します。
        spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
        spriteBatch.Draw(myTexture, pos, null, Color.White, rot, org, 1.0f, SpriteEffects.None, 1.0f);
        spriteBatch.End();
        
  5. メニューからコンパイルして実行して下さい。
    画像の回転を制御するキーの説明です。
    キー 説明
    矢印キー 画像を描画する座標の移動
    数字キー 4,6 回転軸の中心(X座標)を移動
    数字キー 8,2 回転軸の中心(Y座標)を移動
    数字キー 1,3 回転係数のアップ/ダウン
    キーを操作して回転の様子を確かめて下さい。

【NOTE】

画像を回転しながら描画するコードの org の次の 1.0f は画像のスケールで、最後の 1.0 は深度(Zバッファの値)です。
spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
spriteBatch.Draw(myTexture, pos, null, Color.White, rot, org, 1.0f, SpriteEffects.None, 1.0f);
spriteBatch.End();

深度を有効にするには Begin() のパラメータを次のように指定します。
幅、高さ共に128ドットの画像を「0, 0.5f, 1.0f」で回転しながら描画して見ました。
深度の値は「0〜1.0」で、1.0 の画像が一番上から(一番最後に)描画されます。
深度が有効でないときは書かれた順に描画されるので 1.0f の回転画像が一番上に描画されますが、 深度を有効にすると深度が小さい順に描画されるので、0 の回転画像(深度は 0.4f)が一番上に描画されます。
説明しただけでは解り難いと思うので、深度を無効/有効に設定して試して下さい。
spriteBatch.Begin(SpriteBlendMode.AlphaBlend,SpriteSortMode.FrontToBack,SaveStateMode.None);
spriteBatch.Draw(texture, new Vector2(80, 80), null, Color.White, 0, new Vector2(64, 64),
                 1, SpriteEffects.None, 0.4f);
spriteBatch.Draw(texture, new Vector2(140, 80), null, Color.White, 0.5f, new Vector2(64, 64),
                 1, SpriteEffects.None, 0.2f);
spriteBatch.Draw(texture, new Vector2(200, 80), null, Color.White, 1.0f, new Vector2(64, 64),
                 1, SpriteEffects.None, 0.0f);
spriteBatch.End();

超初心者の方のために全ソースコードを掲載します。 (^_^;)
全ソースコード

前田稔(Maeda Minoru)の超初心者のプログラム入門

超初心者のプログラム入門(XNA(C#) game program)