我只是从YouTube上复制了一个非常简单的动画代码来学习如何在raylib中制作动画。但是整个代码都写在main()
函数中。我希望它能被组织和分离。
代码如下:
#include "include/raylib.h"
int main()
{
const int screenWidth = 1200;
const int screenHeight = 800;
InitWindow(screenWidth, screenHeight, "2D Platformer");
SetTargetFPS(60);
Texture2D run_sprite = LoadTexture("sprites/Fighter/Run.png");
Rectangle source = {0.f, 0.f, (float)run_sprite.width / 8.0f, (float)run_sprite.height};
Vector2 position = {0, screenHeight / 2};
int frame = 0;
float runningTime{};
const float updateTime{1.f/12.f};
while (WindowShouldClose() == false)
{
//UPDATE VARIABLES
float deltaTime = GetFrameTime();
runningTime += deltaTime;
if (runningTime >= updateTime)
{
runningTime = 0.f;
source.x = (float)frame * source.width;
frame++;
if (frame > 8)
{
frame = 0;
}
}
//START DRAWING
BeginDrawing();
ClearBackground(RAYWHITE);
DrawTextureRec(run_sprite, source, position, WHITE);
EndDrawing();
}
CloseWindow();
}
字符串
我试着把它分成这些功能:
Texture2D run_sprite;
void load_textures()
{
run_sprite = LoadTexture("sprites/Fighter/Run.png");
}
int frame = 0;
float runningTime{};
const float updateTime{1.f/12.f};
Rectangle source = {0.f, 0.f, (float)run_sprite.width / 8.0f, (float)run_sprite.height};
void update_run_animation()
{
runningTime += deltaTime;
if (runningTime >= updateTime)
{
runningTime = 0.f;
source.x = (float)frame * source.width;
frame++;
if (frame > 8)
{
frame = 0;
}
}
}
Vector2 position = {0, screenHeight / 2};
void render_run_animation()
{
DrawTextureRec(run_sprite, source, position, WHITE);
}
型
下面是main()
函数内部代码的更新版本:
int main()
{
const int screenWidth = 1200;
const int screenHeight = 800;
InitWindow(screenWidth, screenHeight, "2D Platformer");
SetTargetFPS(60);
load_textures();
while (WindowShouldClose() == false)
{
update_run_animation();
BeginDrawing();
ClearBackground(RAYWHITE);
render_run_animation();
EndDrawing();
}
CloseWindow();
}
型
但是当我运行这个程序时,它只是创建一个窗口,而不是绘制纹理。
我试着从每个函数的变量中获取输出来调试它。结论是当涉及到update_run_animation()
函数时,source.width
变量给出的默认值是0。
我不知道问题到底出在哪里,所以我发布了整个代码。
2条答案
按热度按时间igetnqfo1#
全局变量的初始化发生在
main
函数运行之前。所以你在source
(和position
)的初始化中使用的值将不是你所期望的。当
main
函数中的变量所依赖的值已知时,需要显式初始化(赋值)这些变量。lhcgjxsq2#
这里有一个问题
字符串
因为
source
是一个全局变量,所以这段代码在load_textures
被调用之前执行,而它应该在之后执行(就像它在原始程序中一样)。最简单的修复似乎是将声明移到
main
型
然后将变量作为引用参数传递给
update_run_animation
函数,型
并对该函数进行相应的更改
型
我想还有很多其他的变化需要做。一般来说不要使用全局变量。
这一切都是 *。