画像を読みながらアニメーション

XNA で一連番号を付けた画像ファイルを読みながらアニメーションします。

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

プログラムの説明

  1. 一連番号を付けた画像ファイルをフォルダーに格納しておいて、一枚ずつ読み込みながらアニメーションします。
    アニメーションの速度に画像の読み込みが付いていけるか否かが問題でした。
    今回使った画像ファイルは「横=127, 縦=77, 256色」のBMP画像ですが、速度を上げても問題なくアニメーションが出来ました。
    "c:\\data\\test\\" のフォルダーに Dog1.bmp 〜 Dog5.bmp の画像を格納してテストしています。
  2. StringBuilder を使うので、Game1.cs の最初の方で System.Text を追加して下さい。
    using System.Text; //追加
  3. texture にアニメーションする画像を一枚ずつロードします。
    file_name は Dog1.bmp 〜 Dog5.bmp の画像ファイル名を格納する領域です。
    Num には描画する画像ファイルの番号を格納します。
    Timew は画像を切り替えた時刻を保存します。
    Speed はアニメーション速度で、上下キーで操作します。
            Texture2D   texture;        // 描画に使用するテクスチャ
            string      file_name;      // 画像のファイル名を格納
            int         Num = 0;        // File Number
            double      Timew = 0;      // 前回の切り替え時間
            double      Speed = 100;    // 切り替え速度
        
  4. LoadContent() で一枚目の描画をロードしています。
    texture = Texture2D.FromFile(graphics.GraphicsDevice, "c:\\data\\test\\Dog1.bmp");
  5. Update() 関数で自動的に texture の画像を切り替えます。
    Timew + Speed が現在時刻より小さくなれば画像を切り替えます。
    Num をインクリメントして、file_name に入力する画像ファイルの名前を編集します。
    texture に file_name の画像を入力します。
    texture.Dispose(); は texture を開放するコードで、一応入れてみたのですが無くても何ら変わりません。
    上下キーの操作で Speed をインクリメント/デクリメントして、アニメーション速度を設定します。
            protected override void Update(GameTime gameTime)
            {
                // 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 (Timew + Speed < gameTime.TotalGameTime.TotalMilliseconds)
                {   Timew = gameTime.TotalGameTime.TotalMilliseconds;
                    Num = (Num+1)%5+1;
                    StringBuilder sb = new StringBuilder();
                    sb.Append("c:\\data\\test\\Dog");
                    sb.AppendFormat("{0:d1}", Num);
                    sb.Append(".bmp");
                    file_name = sb.ToString();
                    //texture.Dispose();
                    texture = Texture2D.FromFile(graphics.GraphicsDevice, file_name);
                }
    
                if (Keyboard.GetState().IsKeyDown(Keys.Up))
                {   if (Speed>10)   Speed-= 1;  }
                if (Keyboard.GetState().IsKeyDown(Keys.Down))   Speed+= 1;
    
                base.Update(gameTime);
            }
        
  6. Draw() メソッドは何時もと同じです。
            protected override void Draw(GameTime gameTime)
            {
                graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
    
                // TODO: Add your drawing code here
                spriteBatch.Begin(SpriteBlendMode.AlphaBlend);
                spriteBatch.Draw(texture, new Vector2(100.0f, 100.0f), Color.White);
                spriteBatch.End();
    
                base.Draw(gameTime);
            }
        
  7. 上下キーを操作してアニメーション速度を変えてみて下さい。
    画像サイズが大きくなると、支障が出るかも知れませんが、現在のサイズでは問題なくアニメーションが出来ました。
    後日 400*300*24 のPNG画像1340枚を使って問題なくアニメーションが出来ました。
  8. さすがにサイズの大きい大量の画像を読みながらアニメーションすることは出来ないようです。
    800*600*24 のBMP画像1340枚を使うとアニメーションの途中でハングアップしてしまいました。
    そのときは、以下のような対策を講じて下さい。

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

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