Поэтому я недавно попал в SDL2 с C++, и я сделал этот очень простой код:
int main(int argc, char** argv)
{
SDL_Event *event;
bool done = false;
if(SDL_Init(SDL_INIT_VIDEO) != 0)
{
std::cerr << "Problèmes pour initialiser la SDL : " << SDL_GetError() << std::endl;
return 1;
}
SDL_Window *window = 0;
window = SDL_CreateWindow("Mopion", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);
if(window == 0)
{
done = true;
}
while(!done)
{
while(SDL_PollEvent(event))
{
switch(event->type)
{
case SDL_QUIT:
done = true;
break;
case SDL_KEYUP:
if(event->key.keysym.sym == SDLK_q)
{
done = true;
}
break;
default:
break;
}
}
}
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}
Хотя этот код выполняется вначале довольно хорошо, когда я нажимаю клавишу "Q", окно закрывается, но у меня появляется окно с ошибкой Windows, в котором говорится, что "Моя программа перестала работать". что не очень удобно.
Используя отладчик, я обнаружил, что все нормально, пока не вызывается SDL_Quit().
Кто-нибудь знает, почему это происходит? Большое спасибо !
Вы используете неинициализированный указатель:
SDL_Event *event;
И вам нужно исправить некоторые ошибки:
1. Если SDL_CreateWindow()
возвращает 0
, это означает, что нет окна, и вы не должны использовать SDL_DestroyWindow()
.
2. Вы используете события, поэтому вы должны вызвать SDL_Init()
следующим образом: SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS)
.
Вы не резервируете память для своего SDL_Event и, скорее всего, повредите свой стек. Объявите его как автоматическое и передайте его по адресу SDL_PollEvent().