【问题标题】:Window doesn't load — c++/SDL窗口不加载——c++/SDL
【发布时间】:2013-06-07 08:59:57
【问题描述】:

我对 SDL 很陌生。我正在尝试将图像添加到窗口中,我已按照本教程进行操作:http://lazyfoo.net/SDL_tutorials/lesson02/index.php

我正在 xcode 中编写所有代码,当我运行它时,窗口不会加载。我只是闪现然后消失,我知道我已经完成了我应该做的所有步骤。这是我的代码:

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

SDL_Surface *message = NULL;
SDL_Surface *background = NULL;
SDL_Surface *screen = NULL;

SDL_Surface *load_image(std::string filename)
{
    SDL_Surface *loadedImage = NULL;
    SDL_Surface *optimizedImage = NULL;

    loadedImage = SDL_LoadBMP( filename.c_str() );

    if (loadedImage != NULL)
    {
        optimizedImage = SDL_DisplayFormat(loadedImage);
        SDL_FreeSurface(loadedImage);

    }

    return optimizedImage;
}

void apply_surface(int x, int y, SDL_Surface *source, SDL_Surface *destination)
{
    SDL_Rect offset;

    offset.x = x;
    offset.y = y;

    SDL_BlitSurface(source, NULL, destination, &offset);
}



int main( int argc, char* args[] )
{
    //Start SDL
    SDL_Init( SDL_INIT_EVERYTHING );

    //Quit SDL
    SDL_Quit();

    if (SDL_Init(SDL_INIT_EVERYTHING)==-1)
    {
        return 1;
    }

    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);

    if (screen == NULL)
    {
        return 1;
    }

    SDL_WM_SetCaption("Hellow world!", NULL);

    message = load_image("images.bmp");
    background = load_image("images.bmp");

    apply_surface(0, 0, background, screen);

    apply_surface(180, 140, message, screen);

    return 0;

}

【问题讨论】:

    标签: c++ xcode sdl


    【解决方案1】:

    您在主函数中过早地调用了SDL_Quit()。此函数会关闭所有 SDL 子系统,而应在程序结束时调用。

    如果您希望窗口在您明确关闭之前一直保留,请添加如下循环:

    int main() {
      if (SDL_Init(SDL_INIT_EVERYTHING) == -1) {
        return 1;
      }
    
      screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);
      if (!screen) {
        return 1;
      }
    
      bool running = true;
    
      SDL_Event event;
      while (running) {
        while (SDL_PollEvent(&event)) {
          if (event.type == SDL_QUIT) {
            running = false;
          }
        }
      }
    
      SDL_Quit();
      return 0;
    }
    

    当某些事件发生时,您可以将running设置为false,例如当窗口关闭时。

    【讨论】:

    • 当我将所有内容放入 while 循环(SDL_INIT 和 SDL_QUIT 除外)时,窗口确实出现了。但是彩虹加载光标加载并且永不停止?
    • @WilhelmMichaelsen 您不需要将所有内容都放在 while 循环中。我更新了我的答案以提供更详细的示例,请查看。
    【解决方案2】:

    你已经把 SDL_Quit();在您的程序开始时。这就像把 return 0;在你所有的代码之前。它在读取该行时关闭。为避免这种情况,您应该创建一个循环,当它按下窗口顶部的“x”时会中断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-12
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多