Array Class で同心円状に広がるように弾を発射

Space キーを押すと、Array Object Class を使って同心円状に広がるように弾を一斉に発射します。

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

プログラムの説明

  1. Space キーを押すと、同心円状に広がるように弾を一斉に発射します。
    Image Object Class & Array Object Class を使うと簡単にプログラム出来ます。
    Image Object Class の説明は Image Class でアニメーション を参照して下さい。
    Array Object Class の説明は、このページの後部に掲載しています。
    このプログラムでは、4種類の弾丸を横に並べて透明色を設定した画像を使っています。
    画像 説明
    tama4.png 4種類の弾丸を横に並べて透明色を設定した画像(32*32 を4枚)

  2. メニューから [ファイル][新規作成][プロジェクト] で新しいプロジェクトを作成して下さい。
    Game1.cs を編集して、弾丸を発射するプログラムを作成します。
    プログラムの最初に Image Object Class と Array Object Class を定義します。
    namespace Main
    {
        #region ★Image Object Class
        public class Image
        {
            //Image Object Class を定義する
        }
        #endregion
    
        #region ★Array Object Class
        //Image Class の配列を制御するクラスです。
        public class Array
        {
            //Array Object Class を定義する
        }
        #endregion
    
  3. class Game1 の最初に、次の領域を宣言して下さい。
    tama は4種類の弾丸を横に並べた画像です。
    Image[] FireArray = new Image[36]; で36個の Image Class の配列を定義します。
    Array は Image Class の配列を操作する Object Class です。
            Texture2D   tama;       // 弾丸のテクスチャ
            Image[]     FireArray = new Image[36];  //ファイアの配列
            Array       array = new Array();        //Image Arrayの制御
        
  4. コンストラクタでウインドウのサイズを大きくしています。
    ウインドウのサイズの規定値は「800*600」です。
            public Game1()
            {
                graphics = new GraphicsDeviceManager(this);
                graphics.PreferredBackBufferWidth = 1200;
                graphics.PreferredBackBufferHeight = 800;
                Content.RootDirectory = "Content";
            }
        
  5. LoadContent() メソッドで画像をロードして、array.Init() で Image Class の配列を初期化します。
    tama4.png は4種類の弾丸を横に並べた画像です。
    Init() メソッドのパラメータ ref FireArray は、配列 FireArray に初期値を設定するときの指定です。
    tama,4,1 は4枚の画像が横に並んでいることを意味し、1200,800 はウインドウのサイズです。
                // TODO: use this.Content to load your game content here
                tama = Texture2D.FromFile(graphics.GraphicsDevice, "c:\\data\\test\\tama4.png");
                array.Init(ref FireArray, tama, 4, 1, 1200, 800);
        
  6. Update() メソッドで Space キーの状態を調べて、同心円状に弾丸を発射します。
    FireArray.GetLength(0) は FireArray の大きさです。
    sp_no = 0; で最初はゼロ番の画像に設定します。
    pos = new Vector2(600,400); は弾の座標で、Rot(i*10, 5) で弾の移動ベクトルを設定します。
    array.Move() で移動ベクトルに従って弾の座標を移動します。
    array.Loop() で4種類の画像を順番に切り替えながらアニメーションしてみました。
                // Allows the game to exit
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed ||
                    Keyboard.GetState().IsKeyDown(Keys.Escape)) this.Exit();
    
                // TODO: Add your update logic here
                // 同心円状に弾を発射
                if (Keyboard.GetState().IsKeyDown(Keys.Space))
                {   for (int i=0; i<FireArray.GetLength(0); i++)
                    {   FireArray[i].sp_no = 0;
                        FireArray[i].pos = new Vector2(600,400);
                        FireArray[i].Rot(i*10, 5);
                    }
                }
    
                // 座標の移動
                array.Move(FireArray);                  //弾の移動
                array.Loop(FireArray, gameTime,150);    //弾のアニメ
        
  7. Draw() メソッドに画像を描画するコードを記述します。
    array.Draw() が Image Class の配列を描画するコードです。
    本来ならばループしなければならないのですが、Array Class を使うと簡単です。
                // TODO: Add your drawing code here
                spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
                array.Draw(spriteBatch, FireArray);     //弾の描画
                spriteBatch.End();
        

Array Class 全体の説明

  1. Array Object Class は Image Object Class の配列を操作する Class です。
    Image Class の説明 Image Class でアニメーション と合わせて参照して下さい。
    本来ならば配列を描画するには、ループしなければなりませんが、Array Class を使うと簡単です。
    例えば、Array Class を使わないで弾を描画するコードは次のようになります。
    FireArray.GetLength(0) は FireArray の大きさです。
        for (int i=0; i<FireArray.GetLength(0); i++)
        {
            FireArray[i].Draw(spriteBatch);
        }
        
    Array Class を使うと次の一行です。
        array.Draw(spriteBatch, FireArray);
        
    また Array Class を使うことにより、弾丸の数が増えても配列の大きさを変更するだけで済みます。
  2. tim は、連射のとき時間を調整する領域で、コンストラクタでクリアします。
        private double   tim;       //連射の設定時間
    
        //コンストラクタ
        public Array()
        {   tim = 0;
        }
        
  3. Image Array を初期化するメソッドです。
    ウインドウサイズを知らせるメソッドも用意しています。
        //Image Array の初期化
        public void Init(ref Image[] Array, Texture2D Img, int Xn, int Yn)
        {
            for(int i=0; i<Array.GetLength(0); i++) Array[i] = new Image(Img,Xn,Yn);
        }
        public void Init(ref Image[] Array, Texture2D Img, int Xn, int Yn, float Width, float Height)
        {
            for(int i=0; i<Array.GetLength(0); i++) Array[i] = new Image(Img,Xn,Yn,Width,Height);
        }
        
  4. Image Array から空いている Cell を取得するメソッドです。
    連射のときなどに、一定時間を置くメソッドも用意しています。
        //Image Array から空いている Cell を取得
        public int Get(Image[] Array, GameTime gameTime, double Tim)
        {   double  now;
            int     i;
    
            now = gameTime.TotalGameTime.TotalMilliseconds;
            if (tim+Tim > now)  return -1;
            for(i=0; i<Array.GetLength(0) && Array[i].sp_no<99; i++);
            if (i>=Array.GetLength(0))   return -1;
            tim = now;
            return i;
        }
        
  5. Array で定義された Image を描画するメソッドです。
        //Array で定義された Image を描画
        public void Draw(SpriteBatch spBatch, Image[] Array)
        {
            for(int i=0; i<Array.GetLength(0); i++)     Array[i].Draw(spBatch);
        }
        
  6. Sprite の番号(sp_no)を次の画像に設定するメソッドです。
    Next() は最後の Sprite が終わると描画を off にしますが、Loop() は最初に戻ります。
        public void Loop(Image[] Array, GameTime gameTime, double Tim)
        {
            for(int i=0; i<Array.GetLength(0); i++)     Array[i].Loop(gameTime, Tim);
        }
        public void Next(Image[] Array, GameTime gameTime, double Tim)
        {
            for(int i=0; i<Array.GetLength(0); i++)     Array[i].Next(gameTime, Tim);
        }
        
  7. Array で定義された Sprite の座標を、移動ベクトルに従って移動します。
    座標がウインドウの外に出ると sp_no を 99 に設定して描画を停止します。
        //Array で定義された Sprite の座標を移動
        public void Move(Image[] Array)
        {
            for(int i=0; i<Array.GetLength(0); i++)     Array[i].Move();
        }
        

【演習】

  1. 弾丸数を増やして(減らして)下さい。
    Array Class を使っているので、配列の大きさを変更するだけです。
  2. 自機を表示して、自機を中心に弾丸を発射して下さい。

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

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