拆分raylib动画代码main()函数后纹理无法渲染的问题
问题:拆分Raylib动画代码后纹理不渲染,source.width始终为0
将原main函数内的Raylib动画代码拆分为加载、更新、渲染函数后,程序仅能生成窗口但无法渲染纹理,调试发现update_run_animation()函数中source.width取值为默认值0。
问题原因分析
- 全局变量初始化时机错误:全局变量
Rectangle source在程序启动时就完成初始化,此时run_sprite还未通过load_textures()加载,run_sprite.width为默认初始值0,导致source.width计算结果为0。 - 未传递关键变量:
update_run_animation()中使用的deltaTime是main函数内的局部变量,未定义全局变量也未通过参数传递,编译运行都会出错。 - 依赖未初始化的值:全局变量
position初始化时依赖main函数内的screenHeight常量,此时screenHeight尚未定义,会导致position.y为垃圾值。
修复方案及修正代码
核心修复点
- 封装动画状态为结构体,避免零散全局变量的初始化时机问题
- 延迟
source和position的初始化,确保在纹理加载完成后再计算 - 通过参数传递
deltaTime和screenHeight,解决变量作用域问题 - 增加纹理卸载逻辑,避免内存泄漏
修正后的完整代码
#include "include/raylib.h" // 封装动画状态的结构体 typedef struct { Texture2D sprite; Rectangle source; Vector2 position; int frame; float runningTime; float updateTime; } Animation; Animation runAnim; void load_textures(int screenHeight) { runAnim.sprite = LoadTexture("sprites/Fighter/Run.png"); // 加载纹理后再计算帧的宽高 runAnim.source = (Rectangle){0.f, 0.f, (float)runAnim.sprite.width / 8.0f, (float)runAnim.sprite.height}; runAnim.position = (Vector2){0, screenHeight / 2}; runAnim.frame = 0; runAnim.runningTime = 0.f; runAnim.updateTime = 1.f / 12.f; } void update_run_animation(float deltaTime) { runAnim.runningTime += deltaTime; if (runAnim.runningTime >= runAnim.updateTime) { runAnim.runningTime = 0.f; runAnim.source.x = (float)runAnim.frame * runAnim.source.width; runAnim.frame++; if (runAnim.frame > 8) { runAnim.frame = 0; } } } void render_run_animation() { DrawTextureRec(runAnim.sprite, runAnim.source, runAnim.position, WHITE); } int main() { const int screenWidth = 1200; const int screenHeight = 800; InitWindow(screenWidth, screenHeight, "2D Platformer"); SetTargetFPS(60); load_textures(screenHeight); while (!WindowShouldClose()) { float deltaTime = GetFrameTime(); update_run_animation(deltaTime); BeginDrawing(); ClearBackground(RAYWHITE); render_run_animation(); EndDrawing(); } UnloadTexture(runAnim.sprite); // 卸载纹理,释放内存 CloseWindow(); }
内容的提问来源于stack exchange,提问作者ubersmurf
相关产品推荐
相关产品推荐

