前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >(译)SDL编程入门(20)触力反馈

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

作者头像
arcticfox
发布2021-01-06 11:41:25
5410
发布2021-01-06 11:41:25
举报

触力反馈

我们知道了[如何用SDL使用操纵杆],现在我们可以使用新的触觉API来使控制器震动。

代码语言:javascript
复制
//带有触力反馈的游戏控制器1处理程序
SDL_Joystick* gGameController = NULL;
SDL_Haptic* gControllerHaptic = NULL;

触觉设备是一种能提供某种物理反馈的东西。在本例中,它使控制器发出隆隆声。触觉设备的数据类型直观地命名为SDL_haptic。

代码语言:javascript
复制
//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;
}

与操纵杆子系统一样,你需要确保初始化触觉专用子系统才能使用触觉。

代码语言:javascript
复制
 //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]来初始化隆隆声。

代码语言:javascript
复制
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]。

代码语言:javascript
复制
//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」

Reference

[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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-12-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程之路从0到1 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 触力反馈
    • Reference
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档