static を使って Base Class を作成

XNA で static を使って画像描画の基本となる Base Class を作成します。
ウインドウの枠に当たると画像がバウンドします。

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

プログラムの説明

  1. ArrayList を使って追加/削除を繰り返すと、ガベージコレクションでゲームが一時中断することがあります。 (^_^;)
    対策としては Object Class の領域をなるべく小さくすると共に、Class 全体で共用出来る領域までを個々に割り当てないことです。
    Object Class 内で static で領域を宣言すると、new で沢山の Class を生成しても全体で一個の領域しか割り当てません。
    従ってメモリを大幅に節約することが出来ます。
    注意しなければならないことは、static で宣言された領域は全クラスを通じて一個しか存在しないために、最後に格納された値しか記録されていないことです。
  2. static を使った Base Class です。
    xn, yn, xs, ys は Class 全体で一個の領域しか割り当てられません。
    また Texture2D は描画するときにパラメータで受け取っています。
    私は、使い勝手が良いように幾つかのコンストラクタを用意しています。
        public class Base
        {
            public static int       xn,yn;      //横と縦の枚数
            public static int       xs,ys;      //横と縦のサイズ
            public int              sp_no;      //Image No
            public Vector2          pos;        //弾の座標
            public Vector2          vect;       //進行方向
    
            //コンストラクタ
            public Base(Texture2D Img, Vector2 Pos, Vector2 Vect, int Xn, int Yn, int Sp_no)
            {
                Init(Img, Pos, Vect, Xn, Yn, Sp_no);
            }
                   ・・・  一部省略  ・・・
    
            //初期値の設定
            private void Init(Texture2D Img, Vector2 Pos, Vector2 Vect, int Xn, int Yn, int Sp_no)
            {   pos  = Pos;
                vect = Vect;
                sp_no = Sp_no;
                xn = Xn;
                yn = Yn;
                xs = Img.Width / xn;
                ys = Img.Height / yn;
            }
    
            //画像の描画
            public void Draw(SpriteBatch spBatch, Texture2D Img, Vector2 Pos, int No)
            {   int xw,yw;
    
                if (No < xn*yn)
                {   xw= No%xn;
                    yw= No/xn;
                    spBatch.Draw(Img, Pos, new Rectangle(xw*xs,yw*ys,xs,ys),Color.White);
                }
            }
            public void Draw(SpriteBatch spBatch, Texture2D Img, Vector2 Pos)
            {
                Draw(spBatch, Img, Pos, sp_no);
            }
            public void Draw(SpriteBatch spBatch, Texture2D Img)
            {
                Draw(spBatch, Img, pos, sp_no);
            }
        }
        
  3. class Game1 の最初に、次の領域を宣言して下さい。
    enemy はプログラムで使用するテクスチャ画像です。
    teki は Enemy の Base Class です。
        public class Game1 : Microsoft.Xna.Framework.Game
        {
            GraphicsDeviceManager graphics;     //グラフィックス
            SpriteBatch spriteBatch;            //スプライト
    
            Texture2D   enemy;          //敵機テクスチャ
            Base        teki;           //敵機の Base Class
        
  4. LoadContent() メソッドで Texture2D に画像をロードします。
    teki の Base Class を生成します。
    Vector2(200, 100) は teki の座標で、Vector2(2.3f, 3.7f) は移動ベクトルです。
    5, 1, 0 は、横に5枚並んだ先頭の画像を指定しています。
            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
                enemy = Texture2D.FromFile(graphics.GraphicsDevice, "c:\\data\\test\\Ene5.png");
                //敵機の設定
                teki = new Base(enemy, new Vector2(200, 100), new Vector2(2.3f, 3.7f), 5, 1, 0);
            }
        
  5. Update() メソッドで Enemy を移動する teki_move() 関数を呼び出します。
            protected override void Update(GameTime gameTime)
            {
                // ゲームを終了する
                if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed  ||
                    Keyboard.GetState().IsKeyDown(Keys.Escape)) this.Exit();
    
                // ゲームの処理はここから書く。
                teki_move();
                base.Update(gameTime);
            }
        
  6. Enemy はウインドウの枠に当たると跳ね返ります。
    Enemy の座標は画像の左上で判定するので、サイズに合わせて調整して下さい。
    跳ね返りの処理は、枠に当たると vect の符号を反転するだけです。
            public void teki_move( )
            {
                teki.pos += teki.vect;
                if (teki.pos.X < -10 || teki.pos.X > 730)   teki.vect.X = 0 - teki.vect.X;
                if (teki.pos.Y < 0 || teki.pos.Y > 520)     teki.vect.Y = 0 - teki.vect.Y;
            }
        
  7. Draw() メソッドに画像を描画するコードを追加します。
    teki.Draw() で Enemy を描画します。
            protected override void Draw(GameTime gameTime)
            {
                graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
    
                // TODO: ここに描画処理を記述します。
                spriteBatch.Begin();                    //描画開始
                teki.Draw(spriteBatch,enemy);           //敵機描画
                spriteBatch.End();
    
                base.Draw(gameTime);
            }
        

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

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