【问题标题】:Window closes too fast窗口关闭太快
【发布时间】:2015-07-22 19:06:32
【问题描述】:

所以我希望这段代码创建一个带有图像的窗口(hello world),然后使用 SDL2、Visual Studio 和 c++ 在 5 秒后退出。我认为它应该足够简单。我写了代码,当我构建它时没有错误,但问题是窗口在创建后立即退出。我最初认为添加 SDL_Delay(5000) 会产生预期的效果,但我想它不会那样工作。谁能告诉我这是为什么?

#include <SDL.h>
#include <iostream>

bool init();
bool load_media();
void close();
const int s_height = 300;
const int s_width = 400;

SDL_Window* new_window = NULL;
SDL_Surface* new_surface = NULL;
SDL_Surface* new_image = NULL;

using namespace std;

bool init()
{
    bool success = true;
    if (SDL_Init(SDL_INIT_VIDEO) < 0)
    {
        cout << "couldn't initialize" << endl;
        success = false;
    }
    else
    {
        new_window = SDL_CreateWindow(
            "SDL Tutorial 2", 
            SDL_WINDOWPOS_UNDEFINED, 
            SDL_WINDOWPOS_UNDEFINED, 
            s_width, 
            s_height, 
            SDL_WINDOW_SHOWN);
        if (new_window == NULL)
        {
            cout << "there's no window" << endl;
            success = false;
        }
        else
        {
            new_surface = SDL_GetWindowSurface(new_window);
        }

    }
    return success;
}

bool load_media()
{
    bool success = true;
    new_image = SDL_LoadBMP("SDL Tutorial 2/hello_world.bmp");
    if (new_image == NULL)
    {
        cout << "couldn't load image" << endl;
        success = false;
    }
    return success;
}

void close()
{
    SDL_FreeSurface(new_image);
    SDL_DestroyWindow(new_window);
    SDL_Quit;

}


int main(int argc, char *argv[])
{
    if (!init())
    {
        cout << "FAILED to Initialize!" << endl;
        if (!load_media())
        {
            cout << "FAILED to Load Media!" << endl;
        }
        else
        {
            SDL_BlitSurface(new_image, NULL, new_surface, NULL);
            SDL_UpdateWindowSurface(new_window);
            SDL_Delay(5000);
            SDL_Quit;
        }
    }

close();
return 0;
}

【问题讨论】:

  • 这段代码编译没有警告? SDL_Quit 没有括号。
  • 没错,这段代码编译没有任何错误
  • 也许你在编译时没有任何警告,但是 SDL_Quit;是一个没有效果的简单声明。此外,如果它被正确调用,你会调用它两次,这是不好的(一次在main 中,第二次在close 函数中)。最后一件事:close 不是一个好名字的函数,因为标准库中有同名的函数。
  • 您在 main 中的“else”似乎在错误的位置。当前代码只会在初始化失败时调用SDL_Delay。写if(!...) 似乎会使代码复杂化;尝试使用积极的ifs 和使用elses。

标签: c++ visual-studio window sdl-2


【解决方案1】:

您只初始化了视频子系统;要使用SDL_Delay等时间相关功能,需要初始化Timer子系统。

将您的 SDL_Init(SDL_INIT_VIDEO) 更改为 SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER)

【讨论】:

    【解决方案2】:

    你的第一行应该是...

    if (init())
    

    仅当 init() 失败时,调用 'if (!init())' 才会继续执行其余代码。 我认为窗口短暂出现是因为在 init() 中创建了窗口,但跳过了其余代码(包括时间)并且窗口立即关闭。

    我会修改为:

    int main(int argc, char* argv[])
    {
        if( init()) {
    
            //other code executes if init() is successful
            SDL_Delay(5000);
        }
    
        else {
            cout << "Failed to initialize!";
        }
    
        close();
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      这里有有效的代码,以及来自 cmets 的所有建议和其他答案:

      #include <SDL.h>
      #include <iostream>
      
      int const s_height = 300;
      int const s_width  = 400;
      
      SDL_Window  *new_window  = NULL;
      SDL_Surface *new_surface = NULL;
      SDL_Surface *new_image   = NULL;
      
      using namespace std;
      
      bool init(void) {
          if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0) {
              cout << "couldn't initialize" << endl;
              return false;
          }
          new_window = SDL_CreateWindow("SDL Tutorial 2", 
                                        SDL_WINDOWPOS_UNDEFINED, 
                                        SDL_WINDOWPOS_UNDEFINED, 
                                        s_width, 
                                        s_height, 
                                        SDL_WINDOW_SHOWN
          );
          if (new_window == NULL) {
              cout << "there's no window" << endl;
              return false;
          }
      
          new_surface = SDL_GetWindowSurface(new_window);
          if (new_surface == NULL) {
              cout << "there's no surface" << endl;
              return false;
          }
          return true;
      }
      
      bool load_media(void) {
          new_image = SDL_LoadBMP("SDL Tutorial 2/hello_world.bmp");
          if (new_image == NULL) {
              cout << "couldn't load image" << endl;
              return false;
          }
          return true;
      }
      
      void finish(void) {
          if (new_image) {
              SDL_FreeSurface(new_image);
          }
          if (new_window) {
              SDL_DestroyWindow(new_window);
          }
          SDL_Quit();
      }
      
      int main(int argc, char *argv[]) {
          if (init()) {
              if (load_media()) {
                  SDL_BlitSurface(new_image, NULL, new_surface, NULL);
                  SDL_UpdateWindowSurface(new_window);
                  SDL_Delay(5000);
                  finish();
              } else {
                  cout << "FAILED to Load Media!" << endl;
              }
          } else {
              cout << "FAILED to Initialize!" << endl;
          }
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 2015-08-21
        • 1970-01-01
        • 2010-09-13
        • 2012-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-26
        • 1970-01-01
        相关资源
        最近更新 更多