关于C ++(SDL2库)的初步探究

时间:2015-02-19 17:17:43

标签: c++ variables window sdl-2

我对编程很新,所以这个问题可能是基本的。我正在使用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 的值后更新窗口表面,但是我收到错误,因为 ventana ,窗口的名称,在另一个函数中定义。我尝试在全球范围内定义 ventana ,但该程序当时不会起作用。然后我想到了以下几点;在 graficos 中编写一个 goto 语句,这是定义 ventana 的函数,以便跳过该函数中的所有其他语句,除了一个更新窗口表面。但是,当我这样做时,程序甚至无法编译:

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 吗?这个问题可能非常基础,对不起,并提前感谢!

1 个答案:

答案 0 :(得分:0)

你可以通过根本不使用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的使用通常应该 。尽可能使用子程序或其他替代方案。在这里,代码与最初的预期完全相同,但是" extra"当caso不是1时发生的流被包装在它自己的名为' init'的子程序中。