Спрайты и C # анимация - PullRequest
1 голос
/ 03 декабря 2009

Я нашел класс для создания gif-файла, содержащего несколько кадровых анимаций, перед фоновым изображением. Это мой класс:

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;

namespace AnimSprites {

     public class AnimSprite {
     private int frame, interval, width, height;
     private string imgFile;
     private Image img;
     private Timer frameTimer;

     public AnimSprite(string f_imgFile, int f_width) {
          frame = 0;
          width = f_width;
          imgFile = f_imgFile;

          img = new Bitmap(imgFile);
          height = img.Height;
     }

     public void Start(int f_interval) {
          interval = f_interval;

          frameTimer = new Timer();
          frameTimer.Interval = interval;
          frameTimer.Tick += new EventHandler(advanceFrame);
          frameTimer.Start();
     }

     public void Start() {
          Start(100);
     }

     public void Stop() {
          frameTimer.Stop();
          frameTimer.Dispose();
     }

     public Bitmap Paint(Graphics e) {
          Bitmap temp;
          Graphics tempGraphics;

          temp = new Bitmap(width, height, e);
          tempGraphics = Graphics.FromImage(temp);

          tempGraphics.DrawImageUnscaled(img, 0-(width*frame), 0);

          tempGraphics.Dispose();
          return(temp);
     }

     private void advanceFrame(Object sender, EventArgs e) {
          frame++;
          if ( frame >= img.Width/width )
               frame = 0;
          }
     }
}

Как я могу использовать этот класс, чтобы мой gif-файл (running_dog.gif) работал поверх background.jpg слева направо?

Это файл dog.gif: dog.gif

1 Ответ

2 голосов
/ 03 декабря 2009

Класс, который вы включили, ожидает, что кадры анимации будут перемещаться слева направо, а не сверху вниз, как ваш .gif.

Вы можете изменить его, изменив конструктор на

public AnimSprite(string f_imgFile, int f_height) {
    frame = 0;
    height = f_height;
    imgFile = f_imgFile;

    img = new Bitmap(imgFile);
    width = img.Width;
}

и метод advanceFrame для

private void advanceFrame(Object sender, EventArgs e) {
    frame++;
    if ( frame >= img.Height/height )
       frame = 0;
    }
}

и ваш вызов DrawImageUnscaled до

tempGraphics.DrawImageUnscaled(img, 0, 0-(height*frame));
...