我正在使用SDL为图形制作C ++中的RTS。
每次我运行游戏时,它都会在编译器调试窗口中无错误地崩溃。它不会立即或持续崩溃,有时需要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;
}
}
当鼠标移动或点击时,是否可能会让它混淆退出?我不认为ram是否超载,因为它只显示它需要的瓦片。
我的编译器VisualC ++是否也可能搞砸了?
答案 0 :(得分:6)
如何将代码段末尾的开关更改为:
if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE) {
quit = true;
}
因为可能只是,你的代码中的那个你检查所有事件的keyym,所以当你测试它是否为escape时,通常事件是错误的类型,并且你获得了“垃圾”值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
}