SDLハプティックサブシステムはハプティックデバイス(力覚装置)を扱う.
基本的な使い方は次の通りである.
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ハプティックサブシステムはスレッドセーフではないので注意すること.