2013-03-07 4 views
2

Я делаю RTS на C++, используя SDL для графики.Завершение цикла событий 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

Я думаю, что это нормально. Не проблема в коде. Нам нужно больше кода. Если вы считаете, что это сбивает с толку (если другое - это ваш друг), и используйте debug с printf или write или другое, чтобы увидеть, в каком случае, если введите –

+0

, установите контрольную точку в вашем 'if (event.type == SDL_QUIT)' и посмотрите, действительно ли вы получает сообщение SDL_QUIT –

+0

Я предполагаю, что вы можете переполнять буфер или что-то в стеке, в глубине вашего графика вызовов функций, а структура событий повреждена. Иногда, случайно, «event.type» получает значение «SDL_QUIT», и программа выходит. – rodrigo

ответ

5

Как об изменении переключателя на конце вашего фрагмента кода на:

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

Поскольку это может быть просто, что в вашем коде вы проверяете символ клавиши для всех событий, поэтому обычно событие имеет неправильный тип, если вы проверяете, является ли это побегом, и вы получаете значение «мусора» для 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

+0

@talles Спасибо. И это не просто может быть, это, безусловно, проблема ... Исправлена ​​ошибка, я должен был сразу это увидеть. – hyde

+1

Ницца, имеет смысл, так как событие является объединением. – 2013-03-07 20:19:34

Смежные вопросы