C++初探(SDL2库)

Elementary inquiry about C++ (SDL2 library)

我对编程还很陌生,所以这个问题可能很基础。我正在使用 SDL2 库(Visual Studio 2013)用 C++ 编写一个非常基本的程序。我在写的时候遇到了一个问题。我写了以下内容:

    int controles(){
        //declare actions that will happen when a key is pressed
        const Uint8 * estado = SDL_GetKeyboardState(NULL);
        if (estado[SDL_SCANCODE_UP]){ y--; SDL_UpdateWindowSurface(ventana); }
        if (estado[SDL_SCANCODE_DOWN]){ y++; SDL_UpdateWindowSurface(ventana); }
        return 0;
    }

问题是我需要在y的值修改后更新window表面,但是我得到一个错误,因为ventana ,window 的名称,是在另一个函数中定义的。我试图在全局范围内定义 ventana,但该程序将无法运行。然后我想到了以下几点;在graficos中写一个goto语句,定义ventana的函数,以便每隔一个跳过该函数中的语句,除了更新 window 表面的语句。然而,当我这样做时,程序甚至没有编译:

int graficos(int caso){
    if (caso == 1) {goto reload;} //skip to reload if (1)
    SDL_Init(SDL_INIT_VIDEO); //load SDL
    //load graphics in memory
    SDL_Window * ventana = SDL_CreateWindow("ventana", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
    SDL_Surface * superficie = SDL_GetWindowSurface(ventana);
    SDL_Surface * pantallainicio = SDL_LoadBMP("pantallainicio.bmp");
    SDL_Surface * paleta = SDL_LoadBMP("paleta.bmp");
    SDL_Rect rpantallainicio = { 0, 0, 640, 480 };
    SDL_Rect rpaleta = { x, y, 16, 16 };
    //render graphics
    SDL_BlitSurface(pantallainicio, NULL, superficie, &rpantallainicio);
    SDL_BlitSurface(paleta, NULL, superficie, &rpaleta);
    SDL_UpdateWindowSurface(ventana);
    reload:SDL_UpdateWindowSurface(ventana);
    return 0;
}

我收到以下错误:

error C4533: initialization of 'rpaleta' is skipped by 'goto reload'
error C4533: initialization of 'rpantallainicio' is skipped by 'goto reload'

我希望我对我的问题的解释足够好。我能做些什么?有没有办法来解决这个问题?或者我可以用其他方式引用 ventana 吗?这个问题可能非常基础,对此深表歉意,在此先感谢您!

您可以通过完全不使用 goto 来解决此问题 - 请改用子函数。另外,提取变量 ventana,因为您需要存储它并随时供 graficos 使用。

void init()
{
    SDL_Init(SDL_INIT_VIDEO); //load SDL
    //load graphics in memory
    ventana = SDL_CreateWindow("ventana", SDL_WINDOWPOS_UNDEFINED,       SDL_WINDOWPOS_UNDEFINED, 640, 480, 0);
    SDL_Surface * superficie = SDL_GetWindowSurface(ventana);
    SDL_Surface * pantallainicio = SDL_LoadBMP("pantallainicio.bmp");
    SDL_Surface * paleta = SDL_LoadBMP("paleta.bmp");
    SDL_Rect rpantallainicio = { 0, 0, 640, 480 };
    SDL_Rect rpaleta = { x, y, 16, 16 };
    //render graphics
    SDL_BlitSurface(pantallainicio, NULL, superficie, &rpantallainicio);
    SDL_BlitSurface(paleta, NULL, superficie, &rpaleta);
}

int graficos(int caso)
{
    if (caso != 1) { init(); } //skip to reload if (1)
    SDL_UpdateWindowSurface(ventana);
    return 0;
}

SDL_Window * ventana;

通常 应避免使用 goto。尽可能使用子程序或其他替代方法。在这里,代码做的事情与最初预期的完全相同,但是当 caso 不为 1 时发生的 "extra" 流程被包装在它自己的名为 'init'.

的子例程中