Enemy の方向に Ship を向ける

Enemy の移動に合わせて Ship を回転します。
画像を回転する基本的な説明は spBatch で画像を回転 を参照して下さい。

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

プログラムの説明

  1. spriteBatch の回転を使って、常に Ship が Enemy の方向を向くように回転します。
    Ship には、回転する自機の画像をロードします。
    Enemy には、動き回る Enemy の画像をロードします。
    pos は Enemy の座標で、矢印キーで操作します。
    org は Ship の回転座標の中心です。
    Ship の画像サイズが 80*80 なので 40*40 に設定します。
    rot は Ship の回転係数です。
    Enemy と Ship の座標からプログラムで計算します。
            Texture2D   Ship;                           //Ship テクスチャ
            Texture2D   Enemy;                          //Enemy テクスチャ
            Vector2     pos = new Vector2(200,200);     //Enemy pos
            Vector2     org = new Vector2(40, 40);      //Ship 回転中心
            float       rot = 0;                        //Ship 回転係数
        
  2. LoadContent() で画像をロードします。
    ship.png と kishi.png が画像ファイルの名前です。
        Ship = Texture2D.FromFile(graphics.GraphicsDevice,"c:\\data\\test\\ship.png");
        Enemy = Texture2D.FromFile(graphics.GraphicsDevice,"c:\\data\\test\\kishi.png");
        
  3. Update() メソッドで Enemy の操作と、回転係数の計算を行います。
    Set_rot() が回転係数を計算するメソッドです。
    Vector2(400,300) は Ship の座標で、常に画面中央に描画しています。
        KeyboardState keyState = Keyboard.GetState();
        //画像の移動
        if (keyState.IsKeyDown(Keys.Left))  pos.X -= 4;
        if (keyState.IsKeyDown(Keys.Right)) pos.X += 4;
        if (keyState.IsKeyDown(Keys.Up))    pos.Y -= 4;
        if (keyState.IsKeyDown(Keys.Down))  pos.Y += 4;
    
        //回転係数の計算
        Set_rot(new Vector2(400,300), pos.X, pos.Y);
        
  4. Enemy の描画と、Ship を回転しながら描画するコードです。
    rot が回転係数で org が回転軸の中心です。
        spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
        spriteBatch.Draw(Enemy, pos, Color.White);
        spriteBatch.Draw(Ship, new Vector2(400,300), null, Color.White, 
                         rot, org, 1.0f, SpriteEffects.None, 1.0f);
        spriteBatch.End();
        
  5. 回転係数を計算する Set_rot() メソッドです。
    パラメータで渡された Pos が Ship の座標で、x, y が Enemy の座標です。
    rot = rot + MathHelper.ToRadians(90); は、Ship の画像が上を向いているので、その補正です。
    回転係数を計算している Pos と x, y は、画像の左上の座標です。
    きちんと計算するなら、座標を画像の中央に持って行って下さい。
        public void Set_rot(Vector2 Pos, float x, float y)
        {
            float   dx, dy;
            dx = x - Pos.X;
            dy = y - Pos.Y;
            rot = (float)Math.Atan2((double)dy, (double)dx);
            rot = rot + MathHelper.ToRadians(90);
        }
        
  6. メニューからコンパイルして実行して下さい。
    矢印キーで Enemy を動かすと、Ship がその方向に回転します。

【演習】

Enemy の画像も回転して、Ship と Enemy が常に向き合うように描画して下さい。

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

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