0

CでSDLを使用していて、キーを押すと画面上でキャラクターを動かし、離すと停止しようとしていますが、キーを押したままでKEYUPイベントがトリガーされているようです。下。Pressed()でKEYUPセクションを削除すると、文字は画面上をスライドしますが、明らかに自動的に停止しません。KEYUPセクションをそのままにしておくと、キーを繰り返し押して画面上を移動する必要があります。私が間違っていることについて何か考えはありますか?

これが私が持っているものです:

...

int done = 0;
while (done==0)
{
    pressed();
    if (kenter == 1)
    {
        state = 1;
        subscreen();
    }
    if (kescape == 1)
    {
        done = 1;
    }
    if (kup == 1)
    {
        playery += -2;
    }
    if (kdown == 1)
    {
        playery += 2;
    }

    if (kright == 1)
    {
        playerx += 2;
    }
    if (kleft == 1)
    {
        playerx += - 2;
    }

...

int pressed ()
{

SDL_Event keyevent;

while (SDL_PollEvent(&keyevent))
{
    switch(keyevent.type)
    {
        case SDL_KEYDOWN:
        switch(keyevent.key.keysym.sym)
        {
            case SDLK_RETURN:
            {
                kenter = 1;
                break;
            }
            case SDLK_ESCAPE:
            {
                kescape = 1;
                break;
            }
            case SDLK_a:
            {
                ka = 1;
                break;
            }
            case SDLK_s:
            {
                ks = 1;
                break;
            }
            case SDLK_UP:
            {
                kup = 1;
                break;
            }
            case SDLK_DOWN:
            {
                kdown = 1;
                break;
            }
            case SDLK_RIGHT:
            {
                kright = 1;
                break;
            }
            case SDLK_LEFT:
            {
                kleft = 1;
                break;
            }
            default:
            break;
        }
    }
    switch(keyevent.type)
    {
        case SDL_KEYUP:
        switch(keyevent.key.keysym.sym)
        {
            case SDLK_RETURN:
            {
                kenter = 0;
                break;
            }
            case SDLK_ESCAPE:
            {
                kescape = 0;
                break;
            }
            case SDLK_a:
            {
                ka = 0;
                break;
            }
            case SDLK_s:
            {
                ks = 0;
                break;
            }
            case SDLK_UP:
            {
                kup = 0;
                break;
            }
            case SDLK_DOWN:
            {
                kdown = 0;
                break;
            }
            case SDLK_RIGHT:
            {
                kright = 0;
                break;
            }
            case SDLK_LEFT:
            {
                kleft = 0;
                break;
            }
            default:
            break;
        }
    }
}
return 0;
}
4

2 に答える 2

3

switch ステートメントが壊れていると思います。

この混乱の少ない方法を使用してください

int pressed ()
{

    SDL_Event event;

    while(SDL_PollEvent(&event) )
    {
        if(event.type == SDLK_KEYDOWN)
        {
                switch(event.key.keysym.sym)
                {
                    case SDLK_RETURN:
                        doStuff = 1
                        break;
                    default:
                        break;
                }
        }
        if(event.type == SDLK_KEYUP)
        {
                switch(event.key.keysym.sym)
                {
                    case SDLK_RETURN:
                        doStuff = 0;
                        break;
                    default:
                        break;
                }
        }
    }   
}

また重要:

SDL チュートリアル: 実用的なキーボード入力

ああ、グローバル変数の使用は避けてください!

于 2013-01-03T02:36:18.433 に答える
1

2 つのswitchステートメントの使用は奇妙で紛らわしいため、おそらく修正する必要があります。

表示されている問題は、キーボードの繰り返しが原因である可能性がありますSDL_EnableKeyRepeat()。それを無効にする方法については、呼び出しを参照してください。

于 2012-12-31T14:26:18.223 に答える