Events 赢得';不能使用SDL工作

Events 赢得';不能使用SDL工作,events,sdl,joystick,Events,Sdl,Joystick,我正在用SDL构建一个简单的游戏。我已经通过无数的教程,我显然错过了一些东西,因为它仍然完全忽略了我的操纵杆 在我的构造函数中 SDL_JoystickEventState(SDL_ENABLE); joystick = SDL_JoystickOpen(0); 在我的更新中,我调用了一个测试来检查我是否已经初始化了操纵杆 if (SDL_NumJoysticks() <= 0) { done = true; } 你知道我错过了什么吗?我不知道这对你有什么帮助,但我知道pygame支持

我正在用SDL构建一个简单的游戏。我已经通过无数的教程,我显然错过了一些东西,因为它仍然完全忽略了我的操纵杆

在我的构造函数中

SDL_JoystickEventState(SDL_ENABLE);
joystick = SDL_JoystickOpen(0);
在我的更新中,我调用了一个测试来检查我是否已经初始化了操纵杆

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

你知道我错过了什么吗?

我不知道这对你有什么帮助,但我知道pygame支持操纵杆。pygame是SDL库的python端口。如果一切都失败了,我想您可以用python编写特定的代码

我不知道这对您有什么帮助,但我知道pygame支持操纵杆。pygame是SDL库的python端口。如果一切都失败了,我想您可以用python编写特定的代码

您确定
操纵杆
指向有效的操纵杆吗

您声明将在
构造函数中获取它。。。在您使用
SDL\u INIT\u操纵杆初始化SDL之前是否调用了该构造函数?如果您的播放器是全局变量,则可能会发生这种情况

确保您:

  • 使用
    |SDL_Init_操纵杆
    将操纵杆子系统添加到您的
    SDL_Init
    ,或调用
    SDL_Init_操纵杆子系统(SDL_Init_操纵杆)
  • 选中
    SDL\u NumJoysticks()>0
  • 获取操纵杆0:
    操纵杆=SDL_操纵杆打开(0)
  • 启用事件:
    SDL\u操纵杆安全状态(SDL\u启用)
  • 使用
    SDL\u PollEvent
  • 程序结束时,关闭操纵杆:SDL_JoystickClose(操纵杆)

另外,确保在Windows中正确检测到操纵杆,并正确报告其输入。

您确定
操纵杆
指向有效的操纵杆吗

您声明将在
构造函数中获取它。。。在您使用
SDL\u INIT\u操纵杆初始化SDL之前是否调用了该构造函数?如果您的播放器是全局变量,则可能会发生这种情况

确保您:

  • 使用
    |SDL_Init_操纵杆
    将操纵杆子系统添加到您的
    SDL_Init
    ,或调用
    SDL_Init_操纵杆子系统(SDL_Init_操纵杆)
  • 选中
    SDL\u NumJoysticks()>0
  • 获取操纵杆0:
    操纵杆=SDL_操纵杆打开(0)
  • 启用事件:
    SDL\u操纵杆安全状态(SDL\u启用)
  • 使用
    SDL\u PollEvent
  • 程序结束时,关闭操纵杆:SDL_JoystickClose(操纵杆)

另外,确保在Windows中正确检测到操纵杆并正确报告其输入。

我认为emartel有最好的答案来确保SDL\U操纵杆工作正常

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.
}

我认为emartel有最好的答案来确保SDL_操纵杆工作正常

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.
}

看起来你的SDL初始化不正确

替换

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK)


看起来你的SDL初始化不正确

替换

SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK)


这是SDL1.2还是2.0?在我的例子中,在2.0 SDL_PollEvent(&event)上,实际上没有将任何数据放入事件结构中。在那个电话之后,我不得不使用SDL_JoystickGetAxis(操纵杆id,axis)和朋友来获取数据


因此,在您的情况下,尝试将SDL_JoystickGetAxis调用移出事件类型的if测试。

这是SDL 1.2还是2.0?在我的例子中,在2.0 SDL_PollEvent(&event)上,实际上没有将任何数据放入事件结构中。在那个电话之后,我不得不使用SDL_JoystickGetAxis(操纵杆id,axis)和朋友来获取数据


因此,在您的情况下,尝试将SDL_JoystickGetAxis调用移出事件类型的if测试。

我在SDL2中发现了一个奇怪的行为:

如果没有事件放入队列,请尝试在SDL_Init调用之前添加以下内容:

SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS,"1");

我在SDL2中发现了一种奇怪的行为:

如果没有事件放入队列,请尝试在SDL_Init调用之前添加以下内容:

SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS,"1");

如果您调用
SDL\u NumJoysticks
获取连接的控制器数量,然后调用
SDL\u JoystickOpen
在游戏循环之前返回操纵杆标识符,则您将收到
SDL\u JOYAXISMOTION
事件

e、 g

int num\u joy;
num_joy=SDL_numjoy();
printf(“找到%d个操纵杆”,num\u joy);
for(int i=0;i

请参见如果您调用
SDL\u NumJoysticks
获取连接的控制器数量,然后调用
SDL\u JoystickOpen
,在游戏循环之前返回操纵杆标识符,则您将收到
SDL\u JOYAXISMOTION
事件

e、 g

int num\u joy;
num_joy=SDL_numjoy();
printf(“找到%d个操纵杆”,num\u joy);
for(int i=0;iSDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS,"1");
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.....