1

最近、SDL を使用して自分のゲーム (スペース インベーダーのクローン) を作成しようとしましたが、イベントに問題がありました... 2 つのイベントがあり、1 つはタイマーによって発行され、移動中の敵船を描画するために使用します。2 番目のイベントは、船を動かすために使用するキーボード イベントです。ゲームを開始すると、敵の船は思った通りに動き始めますが、キーを押したりマウスを動かしたりすると動きが遅くなります。船を動かしているときに同じ問題が発生します。マウスを動かそうとすると、フレームレートが大幅に遅くなります。私のイベントループ:

while(!exit)
{
    while(SDL_PollEvent(&event));
    {
        if(event.type == SDL_QUIT) exit=true;
        if(event.type == SDL_KEYDOWN)
        {
            switch(event.key.keysym.sym) 
            {
            case SDLK_LEFT:
                pship.move(pship.getPosition().x - 1, pship.getPosition().y);
                break;
            case SDLK_RIGHT:
                pship.move(pship.getPosition().x + 1, pship.getPosition().y);
                break;
            }
        }

        if(event.type == SDL_USEREVENT)
        {
            switch(event.user.code)
            {
            case 1:
                static int xOffset, yOffset;
                xOffset++;
                yOffset++;

                drawEnemyShips(eship,xOffset,yOffset);
                break;
            }
        }
    }
}

Visual c++ 2010 Express と SDL 1.2.15 を使用しています

4

1 に答える 1

6
while(SDL_PollEvent(&event));

あなたは間違いなく;そこにそれを望んでいません!あなたのやり方では、あなたはイベントを食べています。イベントを取得すると、イベントがSDL_PollEvent返されるので、もう一度呼び出しますSDL_PollEventwhileイベントがない場合は、ループから抜け出して処理します。しかし、2 番目のイベントがある場合、最初のイベントを処理することはありません。

しかし、いずれにせよ、回転しているポーリング ループは壊れています。それはまるで、毎分「まだそこにいるの?」と聞き続け、親に運転させない子供のようなものです。SDL_WaitEventイベントの CPU ポーリングをスピンするのではなく、イベントを待機するために使用します。

これを行う簡単な方法は、次のように変更することです。

while(SDL_PollEvent(&event));

これに:

while (SDL_WaitEvent(&event) != 0)

これにより、コードが少しぎこちなくなります (whileループはまだ不必要です。ループから抜けると、再入力するだけです) が、少なくとも壊れることはありません。

于 2012-08-21T13:25:31.127 に答える