在 raylib 中创建精灵动画的最佳方法是什么?

What is the best way to create a sprite-animation in raylib?

提问人:Eldinur the Kolibri 提问时间:10/15/2023 最后编辑:Eldinur the Kolibri 更新时间:10/15/2023 访问量:124

问:

我不确定哪种方法对于创建动画最有效。raylib

基本上有两种选择:

  1. 我可以根据帧延迟更新帧。

  2. 我可以根据计时器更新帧。

第一种方法似乎不是很好,因为它不独立于 FPS。它可能在我的计算机上运行得恰到好处,而在另一台计算机上运行得非常慢或快。

第二种方法涉及用于计时器实现的繁琐样板代码。

在 raylib 示例页面上,他们到处都广泛使用 s,并更新了几帧。尽管这是一个如此基本的问题,但我根本不清楚更好的选择是什么。我也没有遇到任何好的建议。是否有任何商定的共识?至于我会使用什么,它可能是计时器,因为它不依赖于 FPS。(该函数计算上一帧之后的增量。framedelayGetFrameTime()

一个简单的 Timer 实现如下所示:

typedef struct {
    float Lifetime; 
} Timer;

void startTimer(Timer *timer, float Lifetime) {
    if (timer != nullptr && Lifetime > 0) {
        timer->Lifetime = Lifetime;
    }
}

void updateTimer(Timer *timer) {
    if (timer != nullptr && timer->Lifetime > 0) {
        timer->Lifetime -= GetFrameTime();
    }
}

bool timerFinished(Timer *timer) {
    if (timer != nullptr) {
        return timer->Lifetime <= 0;
    }
    return false;
}

我认为这很简单,但正如我所说。这不是世界上最漂亮的东西。

C++ 动画 计时器 raylib

评论


答:

-2赞 Adam Qureshi 10/15/2023 #1

那么,你渴望在 raylib 中创建精灵动画吗?太棒了,让我们一步一步地分解它。

首先,准备好你的精灵表。这是包含所有动画帧的一张大图像。你可能有一个网格布局或其他一些安排 - 只要它们都在那里并不重要。

接下来,您需要使用 LoadTexture 加载精灵表。就这么简单:

Texture2D spritesheet = LoadTexture("your_spritesheet.png");

现在,让我们谈谈你的动画帧。您需要定义它们。将每一帧视为精灵表的一小块。我们将使用矩形来指定精灵表的哪个部分表示每个帧。创建一个矩形数组来执行此操作:

Rectangle frames[] = {
    { 0, 0, frameWidth, frameHeight }, // Frame 1
    { frameWidth, 0, frameWidth, frameHeight }, // Frame 2
    // Add more frames as needed
};

明白了吗?非常好。

接下来,设置一些变量来控制动画 – currentFrame、frameRate 和 frameTimer。currentFrame 跟踪您在动画中的位置,frameRate 是每帧应显示的时间,frameTimer 帮助管理帧切换。以下是设置它们的方法:

int currentFrame = 0;
float frameRate = 0.1f; // Time in seconds for each frame
float frameTimer = 0.0f; // Timer to control frame switching

现在,有趣的部分!在游戏循环中,您需要通过根据时间更改当前帧来更新动画。这就像翻阅翻书的框架一样。下面是一个片段来帮助你做到这一点:

frameTimer += GetFrameTime();
if (frameTimer >= frameRate) {
    frameTimer = 0.0f;
    currentFrame++;
    if (currentFrame >= numFrames) {
        currentFrame = 0;
    }

最后,要查看动画的运行情况,您必须使用 DrawTextureRec 绘制当前帧。这就像展示翻书中的幻灯片一样。这是你如何做到的:

DrawTextureRec(spritesheet, frames[currentFrame], position, WHITE); 该位置是您要将精灵放在屏幕上的位置。

别忘了自己清理。完成后,卸载资源以防止任何内存泄漏。将 UnloadTexture 用于精灵表。

这就是在 raylib 中创建精灵动画的基本纲要。请记住,您可以利用它并在此基础上构建您的特定游戏需求。享受动画!

评论

2赞 Eldinur the Kolibri 10/16/2023
我感谢为创建这个答案所投入的时间。然而,它更像是我已经知道的事情的教程,并没有触及我问题的核心。我特别好奇定时器与帧延迟,仅此而已。(这里没有回答)。此外,我不会创建必须手动设置的帧数组。模块化算术通过简单的迭代就更适合这种事情。无论如何,我很欣赏您的建议。
0赞 Peter Mortensen 10/18/2023
你使用的人工智能似乎有一种开朗的性格。你是怎么做到的?当警察并不容易
0赞 Peter Mortensen 10/18/2023
"我想我不能再忍受那个机器人了。"
0赞 Peter Mortensen 10/19/2023
后备人格