構造体で Enemy のコースを設定

構造体(Struct)で Enemy の出現コースを設定します。

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

プログラムの説明

  1. シューティングゲームでは、Enemy の出現パターンがゲームを面白くする大切なファクターです。
    単純な方法としては、上下左右に往復したり、乱数を使って移動しますが、これだけではゲームの面白味に欠けます。
    そこで、Enemy の出現パターンを構造体を使って定義する方法を説明します。
  2. C# では C++ のように構造体の定義と同時に初期値を設定することは出来ません。
    そこで Struct の宣言にコンストラクタを定義して new で初期値を設定します。
    frame は pos を vect で更新しながら画像を描画するフレーム数です。
    img_no は切り分けた5枚の画像のうち何番目を使うかの指定です。
    pos は Enemy を描画する座標で、vect はその移動量です。
        public struct Course
        {
            public int frame;          //フレーム数
            public int img_no;         //画像の番号
            public Vector2 pos;        //座標
            public Vector2 vect;       //増分
    
            public Course(int Frame, int Img_no, Vector2 Pos, Vector2 Vect)
            {
                frame = Frame;
                img_no = Img_no;
                pos = Pos;
                vect = Vect;
            }
        }
        
  3. Struct と Class には微妙な違いがあるのですが、現在のところ同じものだと思って下さい。
    事実、上記ソースコードの struct を class に変更してもそのまま動きます。
  4. struct Course を使って、構造体を定義します。
    c0 〜 c4 の5種類の出現パターンを定義しました。
            public Course c0 = new Course(400, 0, new Vector2(-80, 20), new Vector2(2, 0));
            public Course c1 = new Course(400, 1, new Vector2(400, 600), new Vector2(0, -1.5f));
            public Course c2 = new Course(400, 2, new Vector2(0, 0), new Vector2(2, 1.5f));
            public Course c3 = new Course(400, 3, new Vector2(800, 0), new Vector2(-2, 1.5f));
            public Course c4 = new Course(400, 4, new Vector2(800, 600), new Vector2(-2, -1.5f));
        
  5. 出現パターンに従って Enemy を描画する領域の定義です。
    fcnt には frame を格納して、この値がゼロになるまで pos に vect を加えながら描画します。
    Speed は pos を更新する時間間隔で、Timew は前回の更新時刻です。
            Texture2D    texture;                    //画像テクスチャ
            Vector2      pos = new Vector2(400,250); //画像の座標
            Vector2      vect = new Vector2(0,0);    //画像の移動
            int          sp_no = 0;                  //画像の番号
            int          fcnt = 0;                   //フレームカウント
            double       Timew = 0;                  //前回の切り替え時間
            double       Speed = 20;                 //切り替え速度
        
  6. Update() メソッドです。
    NumPad0 〜 NumPad4 のキーをタイプすると c0 〜 c4 の定義に従って 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 += vect;
                    }
                }
    
                // キーでコースを選択
                if (Keyboard.GetState().IsKeyDown(Keys.NumPad0))
                {
                    fcnt = c0.frame;
                    sp_no = c0.img_no;
                    pos = c0.pos;
                    vect = c0.vect;
                }
                      :
                // NumPad1 〜 NumPad4 も同じ要領です。
                      :
    
                base.Update(gameTime);
            }
        
  7. 他のメソッドは今までと同じです。
    プログラムを完成させて下さい。

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

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