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 帧不一致的主要内容,如果未能解决你的问题,请参考以下文章

XNA SpriteSheet 不工作

XNA精灵排序模式

XNA如何使xna不能读取透明颜色

SwiftUI ObservableObject 的行为不一致,具体取决于调用站点的来源

XNA图像显得clippy /模糊?

Sprite! 我笑了ORZ