c++ 将main()函数划分为独立的函数

wn9m85ua  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(148)

我只是从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。
我不知道问题到底出在哪里,所以我发布了整个代码。

igetnqfo

igetnqfo1#

全局变量的初始化发生在main函数运行之前。所以你在source(和position)的初始化中使用的值将不是你所期望的。
main函数中的变量所依赖的值已知时,需要显式初始化(赋值)这些变量。

lhcgjxsq

lhcgjxsq2#

这里有一个问题

Rectangle source = {0.f, 0.f, (float)run_sprite.width / 8.0f, (float)run_sprite.height};

字符串
因为source是一个全局变量,所以这段代码在load_textures被调用之前执行,而它应该在之后执行(就像它在原始程序中一样)。
最简单的修复似乎是将声明移到main

int main()
{
    ...
    load_textures();
    Rectangle source = {0.f, 0.f, (float)run_sprite.width / 8.0f, (float)run_sprite.height};
    ...
}


然后将变量作为引用参数传递给update_run_animation函数,

update_run_animation(source);


并对该函数进行相应的更改

void render_run_animation(Rectangle& source)
{
    DrawTextureRec(run_sprite, source, position, WHITE);
}


我想还有很多其他的变化需要做。一般来说不要使用全局变量。
这一切都是 *。

相关问题