弾丸を一斉に発射

配列を使って弾丸を一列に並べて発射します。
実行形式が置かれているフォルダーから相対的に画像ファイルを参照します。

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

プログラムの説明

  1. Space キーを押すと、11発の弾丸を一列に並べて発射します。
    2Dシューティングゲームの基礎となるプログラムです。
    11発の弾丸を管理するには、11発分の配列が必要です。
    配列の基礎は「C# 入門」を参照して下さい。
    pos は弾丸を描画する座標です。
    vect は弾丸の移動量(移動の方向)を設定する領域です。
    flag は描画するか否かを判定するフラグで、pos が画面の外に出るとリセットします。
            public Vector2[]    pos = new Vector2[11];      //弾の座標
            public Vector2[]    vect = new Vector2[11];     //弾の移動
            public bool[]       flag = new bool[11];        //弾フラグ
        
  2. class Game1 の最初に発射する弾丸のテクスチャを宣言して下さい。
            public Texture2D    tama;                       //弾テクスチャ
        
  3. Initialize() で flag をクリアします。
    flag[] には初期値として false が格納されているようですが、初期化するのがルールでしょう。
        protected override void Initialize()
        {
            // TODO: Add your initialization logic here
            base.Window.Title = "XNA Game Studio";
    
            // flag のクリア
            for(int i=0; i<11; i++) flag[i] = false;    //弾フラグクリア
    
            base.Initialize();
        }
        
  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[] のY座標が 540 を超えると flag をリセットします。
    今回は「Y座標 > 540」で判定していますが、上下左右に移動するときは、X座標・Y座標共に下限・上限も判定して下さい。
        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 < 11; i++)
            {
                if (flag[i])
                {   pos[i] += vect[i];
                    if (pos[i].Y > 540) flag[i] = false;
                }
            }
        
  6. スペースキーが押されると、前回発射した弾丸が消えるのを待って、次の弾丸を発射します。
    配列の flag[] を調べて、true が設定されている位置を i に求めます。
    (i >= 11) になったときが、全ての弾丸が消えたときで、このタイミングで弾丸を発射します。
    弾丸の座標を上部中央に設定します。
    次のように、X座標とY座標を分けて設定することも出来ます。
    pos[i].X = 400;
    pos[i].Y = 0;
    Y座標の移動ベクトルを4に設定します。
    X座標の移動ベクトルを、弾丸が徐々に広がるように設定してみました。
    移動ベクトルは Vector2() を使って設定することも出来ます。
            // スペースキーで弾丸を一斉に発射
            if (Keyboard.GetState().IsKeyDown(Keys.Space))
            {
                for(i=0; i<11 && flag[i] == false; i++);
                if (i >= 11)
                {   for(i=0; i<11; i++)
                    {   flag[i] = true;
                        pos[i] = new Vector2(400, 0);   //弾の座標
                        vect[i].Y = 4;                  //弾の移動(Y)
                        vect[i].X = (5-i)*0.6f;         //弾の移動(X)
                    }
                }
            }
    
            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<11; i++)
            {
                if (flag[i])    spriteBatch.Draw(tama, pos[i], Color.White);
            }
            spriteBatch.End();
    
            base.Draw(gameTime);
        }
        
  8. メニューの [デバッグ] から [デバッグ開始] を選択すればコンパイルされ、エラーが無ければ実行されます。
    Space キーを押すと、弾丸が一斉に発射されます。

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

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