4

グラフィックに 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;
        }
    }

マウスが動いたりクリックしたりすると、終了するのが混乱する可能性はありますか? タイルごとに必要なもののみを表示するため、ラムが過負荷になっているとは思いません。

私のコンパイラ、VisualC++ が台無しになっている可能性もありますか?

4

1 に答える 1

10

スニペットの最後にあるスイッチを次のように変更するのはどうですか:

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

コードではすべてのイベントの keysym をチェックするため、通常、イベントがエスケープかどうかをテストするとイベントのタイプが間違っており、keysym の「ガベージ」値が取得され、ESC と一致する場合があります。


実際にはevent.typewith スイッチをテストすることをお勧めします:

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 に答える