目次 - SDL 3.0 API(機能別) - 力覚フィードバック

力覚フィードバック

概要

SDLハプティックサブシステムはハプティックデバイス(力覚装置)を扱う.

基本的な使い方は次の通りである.

  1. サブシステム(SDL_INIT_HAPTIC)を初期化する
  2. ハプティックデバイスを開く
  3. 効果を生成する (SDL_HapticEffect)
  4. 効果をアップロードする SDL_CreateHapticEffect()
  5. 効果をSDL_HapticRunEffect()で再生する SDL_RunHapticEffect()
  6. (任意) 効果をSDL_DestroyHapticEffect()で解放する
  7. ハプティックデバイスをSDL_CloseHaptic()で閉じる

振動させる簡単な例

   SDL_Haptic *haptic = NULL;

   // デバイスを開く
   SDL_HapticID *haptics = SDL_GetHaptics(NULL);
   if (haptics) {
       haptic = SDL_OpenHaptic(haptics[0]);
       SDL_free(haptics);
   }
   if (haptic == NULL)
      return;

   // 単純な振動で初期化する
   if (!SDL_InitHapticRumble(haptic))
      return;

   // 50%の強さで2秒間再生する
   if (!SDL_PlayHapticRumble(haptic, 0.5, 2000))
      return;
   SDL_Delay(2000);

   // 終了する
   SDL_CloseHaptic(haptic);

完全なコード

bool test_haptic(SDL_Joystick *joystick)
{
   SDL_Haptic *haptic;
   SDL_HapticEffect effect;
   SDL_HapticEffectID effect_id;

   // デバイスを開く
   haptic = SDL_OpenHapticFromJoystick(joystick);
   if (haptic == NULL) return false; // ジョイスティックにハプティックがない場合が大半

   // サイン波が可能か調べる
   if ((SDL_GetHapticFeatures(haptic) & SDL_HAPTIC_SINE)==0) {
      SDL_CloseHaptic(haptic); // サイン効果がない
      return false;
   }

   // 効果を生成する
   SDL_memset(&effect, 0, sizeof(SDL_HapticEffect)); // 安全のためデフォルトを0にする
   effect.type = SDL_HAPTIC_SINE;
   effect.periodic.direction.type = SDL_HAPTIC_POLAR; // 極座標系
   effect.periodic.direction.dir[0] = 18000; // 効果は南から来る
   effect.periodic.period = 1000; // 1000ミリ秒
   effect.periodic.magnitude = 20000; // 20000/32767 の強さ
   effect.periodic.length = 5000; // 5秒間
   effect.periodic.attack_length = 1000; // 1秒間で最大に達する
   effect.periodic.fade_length = 1000; // 1秒間で停止する

   // 効果をアップロードする
   effect_id = SDL_CreateHapticEffect(haptic, &effect);

   // 効果をテストする
   SDL_RunHapticEffect(haptic, effect_id, 1);
   SDL_Delay(5000); // 効果が終わるまで待つ

   // 効果を破棄する. これはデバイスを閉じても行われる
   SDL_DestroyHapticEffect(haptic, effect_id);

   // デバイスを閉じる
   SDL_CloseHaptic(haptic);

   return true; // 成功
}

SDLハプティックサブシステムはスレッドセーフではないので注意すること.

関数

  1. SDL_CloseHaptic
  2. SDL_CreateHapticEffect
  3. SDL_DestroyHapticEffect
  4. SDL_GetHapticEffectStatus
  5. SDL_GetHapticFeatures
  6. SDL_GetHapticFromID
  7. SDL_GetHapticID
  8. SDL_GetHapticName
  9. SDL_GetHapticNameForID
  10. SDL_GetHaptics
  11. SDL_GetMaxHapticEffects
  12. SDL_GetMaxHapticEffectsPlaying
  13. SDL_GetNumHapticAxes
  14. SDL_HapticEffectSupported
  15. SDL_HapticRumbleSupported
  16. SDL_InitHapticRumble
  17. SDL_IsJoystickHaptic
  18. SDL_IsMouseHaptic
  19. SDL_OpenHaptic
  20. SDL_OpenHapticFromJoystick
  21. SDL_OpenHapticFromMouse
  22. SDL_PauseHaptic
  23. SDL_PlayHapticRumble
  24. SDL_ResumeHaptic
  25. SDL_RunHapticEffect
  26. SDL_SetHapticAutocenter
  27. SDL_SetHapticGain
  28. SDL_StopHapticEffect
  29. SDL_StopHapticEffects
  30. SDL_StopHapticRumble
  31. SDL_UpdateHapticEffect

  1. SDL_Haptic
  2. SDL_HapticDirectionType
  3. SDL_HapticEffectID
  4. SDL_HapticEffectType
  5. SDL_HapticID

構造体

  1. SDL_HapticCondition
  2. SDL_HapticConstant
  3. SDL_HapticCustom
  4. SDL_HapticDirection
  5. SDL_HapticEffect
  6. SDL_HapticLeftRight
  7. SDL_HapticPeriodic
  8. SDL_HapticRamp

マクロ

  1. SDL_HAPTIC_AUTOCENTER
  2. SDL_HAPTIC_CARTESIAN
  3. SDL_HAPTIC_CONSTANT
  4. SDL_HAPTIC_CUSTOM
  5. SDL_HAPTIC_DAMPER
  6. SDL_HAPTIC_FRICTION
  7. SDL_HAPTIC_GAIN
  8. SDL_HAPTIC_INERTIA
  9. SDL_HAPTIC_INFINITY
  10. SDL_HAPTIC_LEFTRIGHT
  11. SDL_HAPTIC_PAUSE
  12. SDL_HAPTIC_POLAR
  13. SDL_HAPTIC_RAMP
  14. SDL_HAPTIC_RESERVED1
  15. SDL_HAPTIC_RESERVED2
  16. SDL_HAPTIC_RESERVED3
  17. SDL_HAPTIC_SAWTOOTHDOWN
  18. SDL_HAPTIC_SAWTOOTHUP
  19. SDL_HAPTIC_SINE
  20. SDL_HAPTIC_SPHERICAL
  21. SDL_HAPTIC_SPRING
  22. SDL_HAPTIC_SQUARE
  23. SDL_HAPTIC_STATUS
  24. SDL_HAPTIC_STEERING_AXIS
  25. SDL_HAPTIC_TRIANGLE

SDL Wikiへのリンク

SDL3/CategoryHaptic - SDL Wiki