XNA Sprite 帧不一致
Posted
技术标签:
【中文标题】XNA Sprite 帧不一致【英文标题】:XNA Sprite Frame Inconsistency 【发布时间】:2012-09-08 10:26:53 【问题描述】:我有一个 16 帧的爆炸精灵。
每次玩家与小行星碰撞时,都会调用 loss() 函数。
在 lost() 函数中,这段代码绘制了动画 spritesheet,它贯穿了 16 帧动画。它应该始终从第 0 帧开始,但并非总是如此。
expFrameID = 0;
expFrameID += (int)(time * expFPS) % expFrameCount;
Rectangle expRect = new Rectangle(expFrameID * expFrameWidth, 0, 63, 63);
spriteBatch.Draw(explosion, shipLocation, expRect, Color.White, 0f, new Vector2(32, 32), 1.0f, pickupSpriteEffects, 0.1f);
if (expFrameID == 15)
expIsDrawn = true;
时间变量如下,获取游戏总经过时间。
time = (float)gameTime.TotalGameTime.TotalSeconds;
我认为问题在于 loss() 函数的以下行:
expFrameID += (int)(time * expFPS) % expFrameCount;
它可以工作,并且可以动画。但是它并不总是从第 0 帧开始。它从 0 到 16 之间的随机帧开始,但它仍然以每秒 16 帧的速度正确运行。
那么,如何让它始终从第 0 帧开始?
【问题讨论】:
请改用ElapsedGameTime
。在自己的变量中自己累积时间(或帧数)。
如何累积时间/帧数?
在你的类中有一个变量,比如float time
。在您的更新方法中,执行time += (float)gameTime.ElapsedGameTime.TotalSeconds
。或者你可以为你所在的任何帧增加一个计数器。
【参考方案1】:
在您的动画恶意类中,您可能希望在 draw 方法中像这样增加时间变量。
// This will increase time by the milliseconds between update calls.
time += (float)gameTime.ElapsedGameTime.Milliseconds;
然后检查是否有足够的时间显示下一帧
if(time >= (1f / expFPS * 1000f) //converting frames per second to milliseconds per frame
expFrameID++;
//set the time to 0 to start counting for the next frame
time = 0f;
然后从精灵表中获取要绘制的矩形
Rectangle expRect = new Rectangle(expFrameID * expFrameWidth, 0, 63, 63);
然后绘制精灵
spriteBatch.Draw(explosion, shipLocation, expRect, Color.White, 0f, new Vector2(32, 32), 1.0f, pickupSpriteEffects, 0.1f);
然后检查动画是否结束
if(expFrameID == 15)
//set expFrameID to 0
expFrameID = 0;
expIsDrawn = true;
【讨论】:
以上是关于XNA Sprite 帧不一致的主要内容,如果未能解决你的问题,请参考以下文章