4

我正在使用 SDL 为图形制作 C++ 中的 RTS。

每次我运行游戏时,它都会在没有错误或编译器调试窗口中出现任何错误的情况下崩溃。它不会立即或持续崩溃,有时需要 10 秒才能崩溃,有时需要 2 分钟才能崩溃。

当我玩弄返回值时(在 main 函数的末尾),结果发现它并没有崩溃,而是退出,因为返回值与我将其更改为一致。

我唯一的理论是我的民意调查事件循环出现故障并告诉程序在不应该退出时退出。

这是我的事件循环,包含在我的游戏循环中:

    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++ 是否也有可能搞砸了?

4

1 回答 1

10

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

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

因为在您的代码中您检查所有事件的键符号,所以当您测试它是否是转义时,通常事件类型错误,并且您得到键符号的“垃圾”值,有时它与 ESC 匹配。


event.type实际上测试with 开关可能是个好主意:

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
}
于 2013-03-07T15:01:32.233 回答