2013-03-07 77 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