0

現在、方向パッド(sdlの帽子)で方向を押したままにすると、コードは1回だけ実行されます。これが、私のコードです。

while (SDL_PollEvent( &event )) 
{
    switch (event.type)
    {
    case SDL_QUIT:
        exitapp = 1;
        break;
    case SDL_KEYDOWN:
        if (event.key.keysym.sym == SDLK_ESCAPE) 
        {
            exitapp = 1;
            // find other keys here: http://sdl.beuc.net/sdl.wiki/SDLKey
        }
        game->KeyDown( event.key.keysym.scancode );
        break;
    case SDL_KEYUP:
        game->KeyUp( event.key.keysym.scancode );
        break;
    case SDL_MOUSEMOTION:
        game->MouseMove( event.motion.x, event.motion.y );
        break;
    case SDL_MOUSEBUTTONUP:
        game->MouseUp( event.button.button );
        break;
    case SDL_MOUSEBUTTONDOWN:
        game->MouseDown( event.button.button );
        break;
    case SDL_JOYHATMOTION:  /* Handle Hat Motion */
        if ( event.jhat.value & SDL_HAT_UP )
        {
            game->HatUp();
        }

        if ( event.jhat.value & SDL_HAT_LEFT )
        {
            game->HatLeft();
        }

        if ( event.jhat.value & SDL_HAT_RIGHT )
        {
            game->HatRight();
        }
        if (event.jhat.value & SDL_HAT_DOWN )
        {
            game->HatDown();
        }
        break;
    default:
        // more info on events in SDL: http://sdl.beuc.net/sdl.wiki/SDL_Event
        break;
    }
}

理想的には、十字キーを押している間、game-> HatUp()を呼び出し続けます。

どうすればこれを機能させることができますか?

4

1 に答える 1

0

イベント投票の間に帽子の状態を保存します。

このようなもの:

map< Uint8, bool > HatStatus; 

while( running )
{
    while (SDL_PollEvent( &event )) 
    {
        switch (event.type)
        {
        ...
        case SDL_JOYHATMOTION:  /* Handle Hat Motion */
            HatStatus[ SDL_HAT_UP    ] = ( true == event.jhat.value & SDL_HAT_UP    );
            HatStatus[ SDL_HAT_LEFT  ] = ( true == event.jhat.value & SDL_HAT_LEFT  );
            HatStatus[ SDL_HAT_RIGHT ] = ( true == event.jhat.value & SDL_HAT_RIGHT );
            HatStatus[ SDL_HAT_DOWN  ] = ( true == event.jhat.value & SDL_HAT_DOWN  );
            break;
        ...
        }
    }

    if( HatStatus[ SDL_HAT_UP    ] )    game->HatUp();
    if( HatStatus[ SDL_HAT_LEFT  ] )    game->HatLeft();
    if( HatStatus[ SDL_HAT_RIGHT ] )    game->HatRight();
    if( HatStatus[ SDL_HAT_DOWN  ] )    game->HatDown();

    ...
}
于 2013-01-07T16:01:14.570 に答える