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