You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

拆分raylib动画代码main()函数后纹理无法渲染的问题

问题:拆分Raylib动画代码后纹理不渲染,source.width始终为0

将原main函数内的Raylib动画代码拆分为加载、更新、渲染函数后,程序仅能生成窗口但无法渲染纹理,调试发现update_run_animation()函数中source.width取值为默认值0。

问题原因分析

  1. 全局变量初始化时机错误:全局变量Rectangle source在程序启动时就完成初始化,此时run_sprite还未通过load_textures()加载,run_sprite.width为默认初始值0,导致source.width计算结果为0。
  2. 未传递关键变量:update_run_animation()中使用的deltaTime是main函数内的局部变量,未定义全局变量也未通过参数传递,编译运行都会出错。
  3. 依赖未初始化的值:全局变量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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:07:11