我们知道了[如何用SDL使用操纵杆],现在我们可以使用新的触觉API来使控制器震动。
//带有触力反馈的游戏控制器1处理程序
SDL_Joystick* gGameController = NULL;
SDL_Haptic* gControllerHaptic = NULL;
触觉设备是一种能提供某种物理反馈的东西。在本例中,它使控制器发出隆隆声。触觉设备的数据类型直观地命名为SDL_haptic。
//Initialize SDL
if( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_HAPTIC ) < 0 )
{
printf( "SDL could not initialize! SDL Error: %s\n", SDL_GetError() );
success = false;
}
与操纵杆子系统一样,你需要确保初始化触觉专用子系统才能使用触觉。
//Check for joysticks
if( SDL_NumJoysticks() < 1 )
{
printf( "Warning: No joysticks connected!\n" );
}
else
{
//Load joystick
gGameController = SDL_JoystickOpen( 0 );
if( gGameController == NULL )
{
printf( "Warning: Unable to open game controller! SDL Error: %s\n", SDL_GetError() );
}
else
{
//Get controller haptic device
gControllerHaptic = SDL_HapticOpenFromJoystick( gGameController );
if( gControllerHaptic == NULL )
{
printf( "Warning: Controller does not support haptics! SDL Error: %s\n", SDL_GetError() );
}
else
{
//Get initialize rumble
if( SDL_HapticRumbleInit( gControllerHaptic ) < 0 )
{
printf( "Warning: Unable to initialize rumble! SDL Error: %s\n", SDL_GetError() );
}
}
}
}
在我们初始化操纵杆之后,我们需要在打开的操纵杆上使用SDL_HapticOpenFromJoystick[1]从操纵杆上获取触觉设备。如果我们设法从控制器中获得触觉设备,我们必须使用SDL_HapticRumbleInit[2]来初始化隆隆声。
void close()
{
//Free loaded images
gSplashTexture.free();
//Close game controller with haptics
SDL_HapticClose( gControllerHaptic );
SDL_JoystickClose( gGameController );
gGameController = NULL;
gControllerHaptic = NULL;
//Destroy window
SDL_DestroyRenderer( gRenderer );
SDL_DestroyWindow( gWindow );
gWindow = NULL;
gRenderer = NULL;
//Quit SDL subsystems
IMG_Quit();
SDL_Quit();
}
一旦我们完成了一个触觉设备,我们就调用SDL_HapticClose[3]。
//Handle events on queue
while( SDL_PollEvent( &e ) != 0 )
{
//User requests quit
if( e.type == SDL_QUIT )
{
quit = true;
}
//Joystick button press
else if( e.type == SDL_JOYBUTTONDOWN )
{
//以75%的强度播放隆隆声,持续500毫秒。
if( SDL_HapticRumblePlay( gControllerHaptic, 0.75, 500 ) != 0 )
{
printf( "Warning: Unable to play rumble! %s\n", SDL_GetError() );
}
}
}
要真正让控制器发出隆隆声,你需要让它播放某种隆隆声。最简单的方法是调用SDL_HapticRumblePlay[4],它需要输入触觉设备、强度(百分比)和隆隆声的持续时间。在这里,每当SDL_JoyButtonEvent[5]发生时,我们都会让控制器以75%的强度轰鸣半秒。
现在,SDL 2触觉API还有很多功能没有在这里介绍,包括制作自定义效果,处理多个隆隆声设备,以及处理触觉鼠标。你可以在SDL2力反馈文档[6]中查看。
在 这里[7]下载本教程的媒体和源代码。
原文链接[8]
「关注我的公众号:编程之路从0到1」
[1]
SDL_HapticOpenFromJoystick: http://wiki.libsdl.org/SDL_HapticOpenFromJoystick
[2]
SDL_HapticRumbleInit: http://wiki.libsdl.org/SDL_HapticRumbleInit
[3]
SDL_HapticClose: http://wiki.libsdl.org/SDL_HapticClose
[4]
SDL_HapticRumblePlay: http://wiki.libsdl.org/SDL_HapticRumblePlay
[5]
SDL_JoyButtonEvent: http://wiki.libsdl.org/SDL_JoyButtonEvent
[6]
SDL2力反馈文档: http://wiki.libsdl.org/CategoryForceFeedback
[7]
这里: http://www.lazyfoo.net/tutorials/SDL/20_force_feedback/20_force_feedback.zip
[8]
原文链接: http://www.lazyfoo.net/tutorials/SDL/20_force_feedback/index.php