SDL编程入门(20)触力反馈

触力反馈

我们知道了如何用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从操纵杆上获取触觉设备。如果我们设法从控制器中获得触觉设备,我们必须使用SDL_HapticRumbleInit来初始化隆隆声。

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

//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,它需要输入触觉设备、强度(百分比)和隆隆声的持续时间。在这里,每当SDL_JoyButtonEvent发生时,我们都会让控制器以75%的强度轰鸣半秒。

现在,SDL 2触觉API还有很多功能没有在这里介绍,包括制作自定义效果,处理多个隆隆声设备,以及处理触觉鼠标。你可以在SDL 2力反馈文档中查看。

这里下载本教程的媒体和源代码。

原文链接

关注我的公众号:编程之路从0到1
编程之路从0到1

血色v残阳 CSDN认证博客专家 编程达人
掌握C、Java、Python、Go、Dart语言等多种编程语言,擅长GUI开发,曾从事Android原生开发,Flutter跨平台开发等等工作
微信公众号:
“编程之路从0到1”
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页