弾丸を連射

配列を使って弾丸を連射します。
実行形式が置かれているフォルダーから相対的に画像ファイルを参照します。
Shot Class を使った連射は Shot Class で弾丸を連射 を参照して下さい。

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

プログラムの説明

  1. 配列を使って弾丸を連射します。
    2Dシューティングゲームの基礎となるプログラムです。
    弾丸の連射を管理するには、一画面に描画される弾丸の個数だけの配列が必要です。
    今回は最大20発分の領域を定義しました。
    pos は弾丸を描画する座標です。
    vect は弾丸の移動量(移動の方向)を設定する領域です。
    flag は描画するか否かを判定するフラグで、pos が画面の外に出るとリセットします。
            public Vector2[]    pos = new Vector2[20];      //弾の位置
            public Vector2[]    vect = new Vector2[20];     //弾の移動
            public bool[]       flag = new bool[20];        //弾フラグ
        
  2. class Game1 の最初に pos, vect, flag に続いて、次の領域を宣言して下さい。
    tama は発射する弾丸のテクスチャです。
    settim は連射の間隔を調整するために発射時刻を保存する領域です。
            public Texture2D    tama;                       //弾テクスチャ
            public double       settim = 0;                 //弾の設定時間
        
  3. Initialize() で flag をクリアします。
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            base.Window.Title = "XNA Game Studio";
    
            // flag のクリア
            for(int i=0; i<20; i++) flag[i] = false;    //弾フラグクリア
    
            base.Initialize();
        }
        
    20は配列の大きさですが flag.GetLength(0) で取得することが出来ます。
    flag.GetLength(0) を使うと配列の大きさが変わったときに柔軟に対応できます。
    for(int i=0; i<flag.GetLength(0); i++)
  4. LoadContent() メソッドで画像をロードします。
    tama.png は透明色を設定してプロジェクトのフォルダーに保存しました。
    実行形式が置かれているフォルダーから、相対的("..\\..\\..\\tama.png")に参照しています。
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);
    
            // TODO: use this.Content to load your game content here
            tama = Texture2D.FromFile(graphics.GraphicsDevice, "..\\..\\..\\tama.png");
        }
        
  5. Update() メソッドで弾丸の移動と連射を行います。
    vect[] に弾丸の移動量(移動の方向)が設定されているので、これを pos に加えます。
    pos[] のX座標が 740 を超えると flag をリセットします。
    今回は横にしか動きませんが、縦にも移動するときはY座標の判定も必要です。
    また左方向や上方向に移動するときは、座標の下限も判定して下さい。
    flag.GetLength(0) を使うときは、関連する全ての箇所で使って下さい。
        protected override void Update(GameTime gameTime)
        {
            int i;
            // ゲームを終了する
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed  ||
                Keyboard.GetState().IsKeyDown(Keys.Escape)) this.Exit();
    
            // TODO: Add your update logic here
            // 弾丸の移動
            for(i = 0; i < 20; i++)
            {
                if (flag[i])
                {
                    pos[i] += vect[i];
                    if (pos[i].X > 740) flag[i] = false;
                }
            }
        
  6. スペースキーが押し続けられると弾丸を連射します。
    前回発射した時刻から 100ミリ秒を置いて、次の弾丸を発射します。
    配列の flag[] を調べて空いている領域を探します。
    flag[] が OFF の領域が見つかれば弾丸を登録します。
            // スペースキーで弾丸を連射
            if (Keyboard.GetState().IsKeyDown(Keys.Space))
            {
                if (settim + 100 < gameTime.TotalGameTime.TotalMilliseconds)
                {   for(i=0; i<20 && flag[i] == true; i++);
                    if (i < 20)
                    {
                        settim = gameTime.TotalGameTime.TotalMilliseconds;
                        flag[i] = true;
                        pos[i] = new Vector2(0, 250);   //弾の座標ベクトル
                        vect[i] = new Vector2(8, 0);    //弾の移動ベクトル
                    }
                }
            }
    
            base.Update(gameTime);
        }
        
  7. Draw() メソッドに弾丸を描画するコードを記述します。
    spriteBatch.Draw() が弾丸を描画するコードです。
        protected override void Draw(GameTime gameTime)
        {
            graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
    
            // TODO: Add your drawing code here
            spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
            for(int i=0; i<20; i++)
            {
                if (flag[i])    spriteBatch.Draw(tama, pos[i], Color.White);
            }
            spriteBatch.End();
    
            base.Draw(gameTime);
        }
        
  8. メニューの [デバッグ] から [デバッグ開始] を選択すればコンパイルされ、エラーが無ければ実行されます。
    Space キーを押し続けると、弾丸が連射されます。

【演習】

  1. 連射の弾丸数を増やして(減らして)下さい。
    flag.GetLength(0) を使ってプログラムすると、配列の大きさを変更するだけです。
  2. 連射の間隔を長く(短く)して下さい。
  3. 縦方向(斜め方向)に弾丸を発射して下さい。
  4. 自機を表示して、自機から弾丸を発射して下さい。

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

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