我正在用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;
}
}
}
测试只是一个bool,一旦真实将意味着我的敌人开始产卵。我还在主
中进行了检查if (SDL_Init( SDL_INIT_VIDEO | SDL_INIT_JOYSTICK ) < 0)
{
fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
done = true;
}
当我运行游戏时,它正常加载,但无论我移动操纵杆多少,它都不会将测试设置为真。
我还尝试在while poll事件循环中使用以下内容。
if (event.type == SDL_JOYAXISMOTION)
{
if(SDL_JoystickGetAxis(joystick, 1) > 0)
{
test = true;
}
}
任何想法都是我错过的?
答案 0 :(得分:2)
我认为emartel有最好的答案来确保SDL_joystick正常工作。
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.
}
答案 1 :(得分:2)
我在SDL2中发现了一个奇怪的行为:
如果没有事件放入队列,请尝试在SDL_Init调用之前添加以下内容:
SDL_SetHint(SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS,"1");
答案 2 :(得分:1)
您确定joystick
指向有效的操纵杆吗?
你声明你在Constructor
中得到它...在用SDL_INIT_JOYSTICK
初始化SDL之前,是否恰好调用了这个构造函数?如果您的播放器是全局变量,则可能会发生这种情况。
请确保按顺序:
SDL_Init
| SDL_INIT_JOYSTICK
或致电SDL_InitSubSystem(SDL_INIT_JOYSTICK);
SDL_NumJoysticks() > 0
joystick = SDL_JoystickOpen(0);
SDL_JoystickEventState(SDL_ENABLE);
SDL_PollEvent
此外,请确保在Windows中正确检测到操纵杆并正确报告其输入。
答案 3 :(得分:1)
看起来您的SDL不适合初始化。
替换
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK)
与
SDL_Init(SDL_INIT_EVERYTHING)
答案 4 :(得分:0)
这是SDL 1.2还是2.0?在我的例子中,在2.0 SDL_PollEvent(&amp; event)上并没有实际将任何数据放入事件结构中。在那次调用之后,我不得不使用SDL_JoystickGetAxis(joystick_id,axis)和朋友来获取数据。
因此,在您的情况下,尝试将SDL_JoystickGetAxis调用移出事件类型的if-test。
答案 5 :(得分: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.....
答案 6 :(得分:-1)
我不知道这对你有什么帮助,但我知道pygame支持操纵杆。而pygame是SDL库的python端口。如果一切都失败了,我想你总是可以在python中编写那段特定的代码。