2013-03-07 123 views
2

我正在C++中使用SDL为图形制作RTS。SDL事件循环退出?

每次运行游戏时,它都会在编译器调试窗口中崩溃而没有错误或任何错误。它不会立即或一致地崩溃,有时需要10秒才能崩溃,而其他时间则需要2分钟才能崩溃。

当我使用返回值(在主函数结尾处)时,事实证明它并没有崩溃,而是退出,因为返回值与我所改变的一致。

我唯一的理论是我的轮询事件循环有问题,并告诉程序退出时,它不应该。

这里是我的事件循环,包含我的游戏循环中:

if(SDL_PollEvent(&event)) 
    { 
     if(event.type == SDL_MOUSEMOTION) 
     { 
      mx = event.motion.x; 
      my = event.motion.y; 
     } 

     if(event.type == SDL_MOUSEBUTTONDOWN) 
     { 
      if(hut.getselected() && hut.getplacable()) 
      { 
       hut.place(map); 
      } 
     } 

     if(event.type == SDL_QUIT) 
     { 
      quit = true; 
     } 

     switch(event.key.keysym.sym) 
     { 
     case SDLK_ESCAPE: quit = true; break; 
     } 
    } 

是否有可能,当鼠标移动或点击,这是混淆了它退出?我不认为内存过载,因为它只显示它需要分片的内容。

我的编译器VisualC++是否也可能搞砸了?

+0

我认为这是好的。在你的代码中没有真正的问题。我们需要更多的代码。如果你认为如果混淆(如果其他人是你的朋友)并且使用printf或者debug或者其他的debug来查看,如果在你的if(event.type == SDL_QUIT)中输入 – 2013-03-07 13:20:42

+0

设置断点,看看你是否真的得到SDL_QUIT消息 – 2013-03-07 13:27:40

+0

我想你可能会溢出一个缓冲区或堆栈中的东西,深入你的函数调用图中,并且事件结构被破坏。有时,偶然的'event.type'恰好得到'SDL_QUIT'的值,程序退出。 – rodrigo 2013-03-07 13:30:49

回答

5

如何在你的代码段的结束改变开关:

if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE) { 
    quit = true; 
} 

因为 它可能只是,在你的代码 您检查keysym的所有事件,所以通常情况下是错误的类型时的你测试它是否逃跑,并且你得到keysym的“垃圾”值,有时它与ESC匹配。


实际上可能与开关测试event.type好主意:

switch(event.type) { 
case SDL_MOUSEMOTION: 
    //.... 
    break; 
case SDK_KEYDOWN: 
    switch(event.key.keysym.sym) { 
    case SDLK_ESCAPE: 
     quit = true; 
     break; 
    // cases for other keypresses 
    } 
    break; 
// cases for other events 
} 
+0

+1检查event.type,它可能是问题 – talles 2013-03-07 16:55:35

+0

@talles谢谢。这不仅仅是可能,它显然是问题...修正我的答案,应该马上看到。 – hyde 2013-03-07 18:15:30

+1

不错,有道理,因为事件是一个联盟。 – 2013-03-07 20:19:34