2014-09-13 84 views
1

我正在学习使用SDL2进行编程。目前,我正在做一个基本的练习。我的程序加载背景图像,并在背景上加载完整的精灵图。但是我在执行程序时遇到问题。当我执行二进制文件时,程序窗口会立即自动关闭;我看不到任何东西。我认为这是主循环的一个问题,但它看起来适合我。这是我的代码编译SDL测试期间出错

#include "SDL.h" 


void main() { 

int gameover = 0; 


SDL_Init(SDL_INIT_VIDEO); 

SDL_Window* TheWindow; 
SDL_Renderer* RenderEngine; 
SDL_Surface* LoadedSurface; 
SDL_Surface* LoadedImage; 
SDL_Texture* CharacterImg; 
SDL_Texture* BackgroundImg; 

TheWindow = SDL_CreateWindow("Character Test", 
    SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, 640, 580, SDL_WINDOW_RESIZABLE); 

RenderEngine = SDL_CreateRenderer(TheWindow, -1, SDL_RENDERER_ACCELERATED); 

LoadedSurface= SDL_LoadBMP("./maptest.bmp"); 
BackgroundImg = SDL_CreateTextureFromSurface(RenderEngine, LoadedSurface); 
SDL_FreeSurface(LoadedSurface); 

LoadedImage = SDL_LoadBMP("./sprite.bmp"); 
CharacterImg = SDL_CreateTextureFromSurface(RenderEngine, LoadedImage); 
SDL_FreeSurface(LoadedImage); 



SDL_Event event; 

while (!gameover) 
{ 

    if (SDL_PollEvent(&event)) { 

    switch (event.type) { 

     case SDL_QUIT: 
     gameover = 1; 
     break; 

     case SDL_KEYDOWN: 
     switch (event.key.keysym.sym) { 
     case SDLK_ESCAPE: 
     case SDLK_q: 
     gameover = 1; 
       break; 
      } 
     } 
     break; 
     } 

    SDL_RenderClear(RenderEngine); 
    SDL_RenderCopy(RenderEngine, BackgroundImg, NULL, NULL); 
    SDL_RenderCopy(RenderEngine, CharacterImg, 120, 80); 
    SDL_RenderPresent(RenderEngine); 


    } 



    SDL_Quit(); 



} 
+2

如果你的程序运行,那么它是不是编译时错误。 – 2014-09-13 03:33:23

+0

另外,你是否尝试过在关键点添加一些printf来记录日志,然后从命令行运行它?这应该会给你更多的答案... – 2014-09-13 03:40:15

回答

3

您的代码将退出while -loop如果任何SDL_PollEvent情况:

while (!gameover) 
    { 
    if (SDL_PollEvent(&event)) //Any SDL_PollEvent that gets into if... 
     { 
     switch (event.type) 
      {  
      case SDL_QUIT: 
      gameover = 1; 
      break; 
      case SDL_KEYDOWN: 
      switch (event.key.keysym.sym) 
       { 
       case SDLK_ESCAPE: 
       case SDLK_q: 
       gameover = 1; 
       break; 
       } 
      } 
     break;  //...will eventually hit this break if it didn't break before 
     } 
    SDL_RenderClear(RenderEngine); 
    SDL_RenderCopy(RenderEngine, BackgroundImg, NULL, NULL); 
    SDL_RenderCopy(RenderEngine, CharacterImg, 120, 80); 
    SDL_RenderPresent(RenderEngine); 
    } 
+0

是的,最后的休息会让程序退出while循环。此外,代码确实可以在创建/加载资源之后以检查NULL的方式使用一些安全检查。 – Zammalad 2014-09-13 11:23:49

+0

那些埃及方括号会帮助你。请注意EOF如何清理它,以便明确问题出在哪里。 – 2014-09-17 20:33:08