0

私は現在、ゲームを作るために SDL をいじっていますが、SDL がいくつかのイベントを取得しないという問題に遭遇しました。たとえば、「w」を押して前進すると同時に、マウスを動かして周りを見回します。しかし、'a' または 'd' を押すと、SDL はこれらのイベントを取得しません。また、'w' を離しても、SDL は KEYUP イベントを取得しません。最初にこのコードを Windows で書き、すべて正常に動作しましたが、ubuntu に切り替えた後、期待どおりに動作しなくなりました。イベントをポーリングするメインループは次のとおりです。

while(Running)
{
    while(SDL_PollEvent(&event))
        Events(&event);
    if( active ){
        Loop();
        Render();
    }
}

Events() 内のコードは次のとおりです。

switch(Event->type)
    {
        case SDL_QUIT:
            Running = false;
            break;
        case SDL_KEYDOWN:
            switch(Event->key.keysym.sym)
            {
                case SDLK_ESCAPE:
                    Running = false;
                    break;
                case SDLK_a:
                    keyStates['a'] = true;
                    break;
                case SDLK_s:
                    keyStates['s'] = true;
                    break;
                case SDLK_d:
                    keyStates['d'] = true;
                    break;
                case SDLK_w:
                    keyStates['w'] = true;
                    break;
                case SDLK_LSHIFT:
                    camera.setSpeed(2.0f);
                    break;
            }
            break;
        case SDL_KEYUP:
            switch(Event->key.keysym.sym)
            {
                case SDLK_a:
                    keyStates['a'] = false;
                    break;
                case SDLK_s:
                    keyStates['s'] = false;
                    break;
                case SDLK_d:
                    keyStates['d'] = false;
                    break;
                case SDLK_w:
                    keyStates['w'] = false;
                    break;
                case SDLK_LSHIFT:
                    camera.setSpeed(1.0f);
                    break;
            }
            break;
        case SDL_MOUSEBUTTONDOWN:
            switch(Event->button.button)
            {
                case SDL_BUTTON_MIDDLE:
                    mouse.middle = true;
                    break;
            }
            break;
        case SDL_MOUSEBUTTONUP:
            switch(Event->button.button)
            {
                case SDL_BUTTON_MIDDLE:
                    mouse.middle = false;
                    break;
            }
            break;
        case SDL_MOUSEMOTION:
            if( moving ){
                camera.lookat(float(Event->motion.x - winWidth/2),float(Event->motion.y - winHeight/2), MOUSE_SENSITIVITY, dt);
                SDL_EventState(SDL_MOUSEMOTION, SDL_IGNORE);
                SDL_WarpMouse(winWidth/2, winHeight/2);
                SDL_EventState(SDL_MOUSEMOTION, SDL_ENABLE);
            }
            break;
    }
4

1 に答える 1

1

keyStates['a'] = true;

これにはありSDL_GetKeyStateます。配列を手動で維持する代わりに使用してください。

Uint8 keys[SDLK_LAST];
Uint8* sdlKeys = SDL_GetKeyState(0);
memcpy(keys, sdlKeys, sizeof(keys));

.

bool keyPressed(SDLKey key){
    return keys[key] == SDL_PRESSED;
}

ドキュメントも確認してください。

于 2012-05-09T01:10:44.833 に答える