実装テストに使用したプログラムでよろしければどうぞ
上下左右キーでリスナーの位置を移動、Z/Xキーでリスナーの向きを変更します
緑の四角形が音の位置で、赤い四角はリスナーの位置、赤い四角から伸びる白い線は
リスナーの向きを示しています
#include "DxLib.h"
#include <math.h>
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int SoundHandle ;
VECTOR SoundPos ;
VECTOR ListenerBackPos ;
VECTOR ListenerPos ;
float ListenerAngle ;
VECTOR Temp ;
// ウインドウモードで起動
ChangeWindowMode( TRUE );
// 64.0f で1メートルとする
Set3DSoundOneMetre( 64.0f ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1;
// サウンドの読み込みとループ再生開始
SetCreate3DSoundFlag( TRUE ) ;
SoundHandle = LoadSoundMem( "Test.wav" ) ;
SetCreate3DSoundFlag( FALSE ) ;
PlaySoundMem( SoundHandle, DX_PLAYTYPE_LOOP ) ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK );
// リスナーの位置と向きを初期化
ListenerPos = VGet( 220.0f, 0.0f, 240.0f ) ;
ListenerAngle = 0.0f ;
// サウンドの座標を設定
SoundPos = VGet( 320.0f, 0.0f, 240.0f ) ;
Set3DPositionSoundMem( SoundPos, SoundHandle ) ;
// サウンドが届く( 音が聞こえる )範囲を設定
Set3DRadiusSoundMem( 256.0f, SoundHandle ) ;
// メインループ
while( ProcessMessage() == 0 )
{
// 画面のクリア
ClearDrawScreen();
// 動く前の位置を保存
ListenerBackPos = ListenerPos ;
// キー操作
if( CheckHitKey( KEY_INPUT_LEFT ) ) ListenerPos.x -= 4.0f ;
if( CheckHitKey( KEY_INPUT_RIGHT ) ) ListenerPos.x += 4.0f ;
if( CheckHitKey( KEY_INPUT_UP ) ) ListenerPos.z += 4.0f ;
if( CheckHitKey( KEY_INPUT_DOWN ) ) ListenerPos.z -= 4.0f ;
if( CheckHitKey( KEY_INPUT_Z ) ) ListenerAngle -= DX_PI / 30.0f ;
if( CheckHitKey( KEY_INPUT_X ) ) ListenerAngle += DX_PI / 30.0f ;
// 向きを計算
Temp.x = sin( ListenerAngle ) ;
Temp.y = 0.0f ;
Temp.z = cos( ListenerAngle ) ;
// 向きを画面に描画
DrawLine( ListenerPos.x, 480.0f - ListenerPos.z, ListenerPos.x + Temp.x * 40.0f, 480.0f - ( ListenerPos.z + Temp.z * 40.0f ), GetColor( 255,255,255 ) ) ;
// リスナーの位置を向きを設定
Set3DSoundListenerPosAndFrontPos_UpVecY( ListenerPos, VAdd( ListenerPos, Temp ) ) ;
// リスナーの速度を設定( 60倍しているのは、指定の単位が秒速なので、60fpsで動作する場合は
// 1フレーム分の移動距離=60分の1秒分の距離であるため )
Set3DSoundListenerVelocity( VScale( VSub( ListenerPos, ListenerBackPos ), 60.0f ) ) ;
// リスナーの位置とサウンドの位置を画面に描画
DrawBox( ListenerPos.x - 8, 480.0f - ( ListenerPos.z + 8 ), ListenerPos.x + 8, 480.0f - ( ListenerPos.z - 8 ), GetColor( 255,0,0 ), TRUE ) ;
DrawBox( SoundPos.x - 8, 480.0f - ( SoundPos.z + 8 ), SoundPos.x + 8, 480.0f - ( SoundPos.z - 8 ), GetColor( 0,255,0 ), TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End();
// ソフトの終了
return 0;
}