SDL事件循环退出?

Bla*_*ren 3 c++ sdl visual-c++

我正在使用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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

当鼠标移动或点击时,它是否有可能让它退出?我不认为ram是否超载,因为它只显示它需要的瓦片.

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

hyd*_*yde 8

如何将代码段末尾的开关更改为:

if (event.type == SDL_KEYDOWN && event.key.keysym.sym == SDLK_ESCAPE) {
    quit = true;
}
Run Code Online (Sandbox Code Playgroud)

因为它可能只是,在你的代码中检查所有事件的keysym,所以当你测试它是否为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
}
Run Code Online (Sandbox Code Playgroud)

  • 请记住,SDL_Event是一个联合(所有值共享相同的空间),并且检查SDL_KEYDOWN首先工作的原因是因为它专门查找键盘事件而不是任何看起来像SDLK_ESCAPE键的事件.任何类型的事件与Escape键具有相同的值将触发您的代码退出. (2认同)