动画短序列

时间:2013-03-30 23:22:18

标签: c# animation xna

我正在写一个游戏,我想在发生碰撞时运行爆炸动画。然而,我知道如何动画的方法是基于键盘输入。对方法进行编码的最佳方法是什么,这样当调用动画时,所有帧都会单次通过然后停止?

public void Update(GameTime gametime)
  {
    timer += gametime.ElapsedGameTime.Milliseconds;
       if (timer >= msBetweenFrames)
      {
        timer = 0;
        if (CurrentFrame++ == numberOfFrames - 1)
           CurrentFrame = 0;
          rect.X = CurrentFrame * width;
          rect.Y = 0;
     }
  }

   public void Render(SpriteBatch sb, Vector2 position, Color color)
  {
   sb.Draw(aniTex, position, rect, color, 0, Vector2.Zero, 2.0f, SpriteEffects.None, 0);
 }

2 个答案:

答案 0 :(得分:2)

如果问题只是循环问题,你可以删除更新中的一些代码,使其循环(if (CurrentFrame++ == numberOfFrames - 1) CurrentFrame = 0;)所有你需要做的就是让动画再次播放,您希望它播放时将当前帧设置回0。 (要停止绘图,只需在需要时进行绘制调用。)

如果你正在寻找一种方法来构建它(这是我最初解释你的问题!)为什么没有一个动画类,你设置了你想要动画的任何对象。

的内容
class AnimatedObject
{
    Texture2D texture;
    Rectangle currentRectangle;
    Rectangle frameSize;
    int frameCount;
    int currentFrame;

    bool isRunning;

    public AnimatedObject(Texture2D lTexture, Rectangle lFrameSize, int lFrameCount)
    {
        texture = lTexture;
        frameSize = lFrameSize;
        currentRectangle = lFrameSize;
        currentFrame = 0;
    }

    public void Pause()
    {
        isRunning = false;
    }

    public void Resume()
    {
        isRunning = true;
    }

    public void Restart()
    {
        currentFrame = 0;
        isRunning = true;
    }

    public void Update()
    {
        if(isRunning)
        {
            ++currentFrame;
            if(currentFrame == frameCount)
            {
                currentFrame = 0;
            }

            currentRectangle.X = frameSize.Width * currentFrame;
        }
    }

    public void Draw(SpriteBatch spriteBatch)
    {
        if(isRunning)
        {
            spriteBatch.Draw(texture, currentRectangle, Color.White);
        }
    }
}

显然,您可以将其扩展为更复杂(例如,使用您的计时器来选择何时移动框架等。

答案 1 :(得分:1)

您可以停止动画,例如,在动画结束时通过游戏中的动画移除对象。

否则,您可以在动画完成时将currentFrame设置为非法值(例如-1),然后对其进行测试。

public void Update(GameTime gametime)
{
    if (currentFrame >= 0)
    {
        timer += gametime.ElapsedGameTime.Milliseconds;
        if (timer >= msBetweenFrames)
        {
            timer = 0;
            currentFrame++;
            if (currentFramr >= numberOfFrames - 1)
                currentFrame = -1;
            rect.X = CurrentFrame * width;
            rect.Y = 0;
        }
    }
}

public void Render(SpriteBatch sb, Vector2 position, Color color)
{
    if (currentFrame >= 0)
        sb.Draw(aniTex, position, rect, color, 0, Vector2.Zero, 2.0f, SpriteEffects.None, 0);
}