1

SDL で簡単なゲームを作成しています。私は数え切れないほどのチュートリアルを経験してきましたが、ジョイスティックを完全に無視しているため、明らかに何かを見逃していました

私のコンストラクタで

SDL_JoystickEventState(SDL_ENABLE);
joystick = SDL_JoystickOpen(0);

私の更新では、実際にジョイスティックを初期化したことを確認するテストを呼び出しています

if (SDL_NumJoysticks() <= 0)
{
done = true;
}

ここにも私のプレーヤーの更新があります

void World::playerMovement()
{
    SDL_Event event;

    while (SDL_PollEvent (&event))
    {
        switch (event.type)
        {
            case SDL_QUIT:
                done = true;
                break;
            case SDL_JOYAXISMOTION:
                if ( ( event.jaxis.value < -3200 ) || (event.jaxis.value > 3200 ) )
                {
                    test = true;
                }
                    break;
        }
   }
}

テストは単にブール値であり、真になると敵がスポーンし始めることを意味します。メインでチェックも実行します

if (SDL_Init( SDL_INIT_VIDEO | SDL_INIT_JOYSTICK ) < 0)
{
    fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
    done = true;
}

ゲームを実行すると、通常どおりロードされますが、ジョイスティックをどれだけ動かしても、test が true に設定されません。

また、代わりに while poll イベント ループで以下を使用してみました。

if (event.type == SDL_JOYAXISMOTION)
{
if(SDL_JoystickGetAxis(joystick, 1) > 0)
{
test = true;
}
}

私が見逃したアイデアはありますか?

4

7 に答える 7

2

SDL_joystickが機能していることを確認するには、emartelが最良の答えを持っていると思います。

World::playerMovement() はいつ発生しますか? これらのスニペットからプログラムの全体的な流れを判断するのは困難です。

ジョイスティックを処理するためのコードを共有できることをうれしく思います。このコードは、複数のジョイスティック、[-1,1] にスケーリングされた軸、デッドゾーンが削除された状態、およびボタンが押された状態を追跡します。

そして、これがメインループの一部としてどのように利用されるかのスニペットです:

// FIXME: SDL needs to be initialized before we get here.

JoystickManager Joy;
Joy.Initialize();
double deadzone = 0.02;

// Main loop.
bool done = false;
while( ! done )
{
    // Keep the list of joysticks up-to-date.
    Joy.FindJoysticks();

    // Handle all user input.
    SDL_Event event;
    while( SDL_PollEvent( &event ) )
    {
        // Let the JoystickManager track events relevant to it.
        Joy.TrackEvent( &event );

        // FIXME: Handle single-press events here (next target, etc).
        // Don't handle button-held-down events like firing (see below).

        if( event.type == SDL_QUIT )
            done = true;
    }

    // Read joystick 0 analog axes.
    double roll = Joy.Axis( 0, 0, deadzone );
    double pitch = Joy.Axis( 0, 1, deadzone );
    double yaw = Joy.Axis( 0, 3, deadzone );
    double throttle = Joy.AxisScaled( 0, 2, 1., 0., 0., deadzone );

    // Read joystick 0 buttons held down.
    bool firing = Joy.ButtonDown( 0, 0 );

    // FIXME: Update game objects and draw graphics.
}
于 2013-02-01T22:11:00.803 に答える
2

SDL2 で奇妙な動作を見つけました。

イベントがキューに入れられない場合は、SDL_Init 呼び出しの前に次を追加してみてください:

SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS,"1");
于 2016-01-27T22:04:10.843 に答える
0

SDL が適切に初期化されていないようです。

交換

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK)

SDL_Init(SDL_INIT_EVERYTHING)
于 2013-04-12T12:52:04.537 に答える
0

これは SDL 1.2 または 2.0 ですか? 私の場合、2.0 では SDL_PollEvent(&event) は実際にはイベント構造体にデータを入れませんでした。その呼び出しの後、SDL_JoystickGetAxis(joystick_id, axis) とその仲間を使用してデータを取得する必要がありました。

したがって、あなたの場合、SDL_JoystickGetAxis 呼び出しをイベント タイプの if-test から移動してみてください。

于 2015-10-26T13:51:32.870 に答える
0

を呼び出しSDL_NumJoysticksて接続されているコントローラーの数を取得し、SDL_JoystickOpenゲーム ループの前にジョイスティック識別子を返す呼び出しを行うと、SDL_JOYAXISMOTIONイベントを受け取ります。

例えば

int num_joy;
num_joy = SDL_NumJoysticks();
printf("%d joysticks found\n", num_joy);
for(int i = 0; i < num_joy; i++)
{
    SDL_Joystick *joystick = SDL_JoystickOpen(i);
    printf("Joystick name: %s\n", SDL_JoystickName(joystick));
}

SDL_Event event;
bool quit = false;
// Game loop
while(!quit)
{
    // event loop
    while(SDL_PollEvent(&event))
    {
        if (event.type == SDL_JOYAXISMOTION)
        {
            printf("Joystick______EVENT!\n");
        }
        // etc.....
        

https://wiki.libsdl.org/SDL_JoystickNameを参照してください

于 2020-07-18T15:20:32.703 に答える
-1

これがどのように役立つかはわかりませんが、pygame がジョイスティックをサポートしていることは知っています。pygame は SDL ライブラリの python ポートです。すべてが失敗した場合は、いつでもその特定のコードを Python で記述できると思います。

于 2013-01-27T03:21:18.253 に答える