サインカーブで動かす

サインカーブで Enemy を動かします。

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

プログラムの説明

  1. 直線的な動きだけでは、ゲームが単調になります。
    このページでは三角関数の sin を使ってカーブを描きながら Enemy を動かしてみましょう。
  2. sin カーブを計算するために struct Course に Vector2 val を追加します。
    struct Course の説明は 構造体で Enemy のコースを設定 を参照して下さい。
        public struct Course
        {
            public int frame;          //フレーム数
            public int img_no;         //画像の番号
            public Vector2 pos;        //座標
            public Vector2 vect;       //増分
            public Vector2 val;        //計算領域
        
  3. struct Course を使って、構造体を定義します。
    c0 〜 c2 の3種類のパターンを定義しました。
    0.05f は radian角の回転係数です。
    360度=2πradian で、この値が大きいほど周期が速くなります。
            public Course c0 = new Course(300, 0, new Vector2(100, 100), new Vector2(2, 0.05f), Vector2.Zero);
            public Course c1 = new Course(300, 1, new Vector2(100, 100), new Vector2(2, 0.1f), Vector2.Zero);
            public Course c2 = new Course(300, 2, new Vector2(100, 100), new Vector2(2, 0.2f), Vector2.Zero);
        
  4. パターンに従って Enemy を描画する領域の定義です。
    Object Class にまとめることも出来るのですが、今回はテーブルを使って解りやすく Enemy の動きを設定することが目的です。
            Texture2D    texture;                    //画像テクスチャ
            Vector2      pos = new Vector2(400,250); //画像の座標
            Vector2      vect = new Vector2(0,0);    //画像の移動
            int          sp_no = 0;                  //画像の番号
            int          fcnt = 0;                   //フレームカウント
            Vector2      val;                        //計算領域
            double       Timew = 0;                  //前回の切り替え時間
            double       Speed = 20;                 //切り替え速度
        
  5. Update() メソッドです。
    SinCurve(200, 100) で Enemy の動きを計算します。
    200 はY座標の中心で、100 は振幅の大きさです。
    NumPad0 〜 NumPad2 のキーをタイプすると c0 〜 c2 の定義に従って Enemy が移動します。
            protected override void Update(GameTime gameTime)
            {
                // ゲームを終了する
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed  ||
                    Keyboard.GetState().IsKeyDown(Keys.Escape)) this.Exit();
    
                // TODO: Add your update logic here
                if (Timew + Speed < gameTime.TotalGameTime.TotalMilliseconds)
                {   Timew = gameTime.TotalGameTime.TotalMilliseconds;
                    // 画像の移動
                    if (fcnt>0)
                    {   fcnt--;
                        pos.X += vect.X;
                        val += vect;
                        SinCurve(200, 100);
                    }
                }
    
                // キーでコースを選択
                if (Keyboard.GetState().IsKeyDown(Keys.NumPad0))
                {
                    fcnt = c0.frame;
                    sp_no = c0.img_no;
                    pos = c0.pos;
                    vect = c0.vect;
                    val = c0.val;
                }
                if (Keyboard.GetState().IsKeyDown(Keys.NumPad1))
                {
                    fcnt = c1.frame;
                    sp_no = c1.img_no;
                    pos = c1.pos;
                    vect = c1.vect;
                    val = c1.val;
                }
                if (Keyboard.GetState().IsKeyDown(Keys.NumPad2))
                {
                    fcnt = c2.frame;
                    sp_no = c2.img_no;
                    pos = c2.pos;
                    vect = c2.vect;
                    val = c2.val;
                }
    
                base.Update(gameTime);
            }
        
  6. サインカーブを計算する SinCurve() メソッドです。
    cen はY座標の中心で、wd は振幅の大きさです。
            public void SinCurve(float cen, float wd)
            {
                pos.Y = (float)Math.Sin(val.Y)*wd+cen;
            }
        
  7. 他のメソッドは今までと同じです。
    プログラムを完成させて下さい。

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

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