[EDIT] : je viens de voir qu'il y avait une section Audio pour l'aide , si il est possible de déplacer ma demande dans la bonne section.
Bonjour,
Je suis actuellement en train de faire un projet pour mon école en deuxième année sous ogre3d,
il s'agit d'un jeux vidéo 3d, un mix entre un Bomberman et un Gauntlet
J'aimerais pouvoir jouer du son en fonction de mon placement sur mon environnement 3d, ma scène, j'ai hélas un fort problème, mon son s'entends que je sois de loin ou de prêt
Voici comment je procède selon la documentation SFML audio, tous d'abord mon endroit de départ :
,
Ensuite l'endroit où le son est censé être émis :
Le Squelette qui se frappe le torse est censé émettre un son quand il effectue cette action,
Voici un bout du code en exemple :
là où je set la position du squelette
_cesar->setPosition(710.6, 30, 557.64);
Ensuite là ou je set le Listener qui est ma caméra
sf::Listener::setGlobalVolume(50);
sf::Listener::setPosition(_cameraMan->getCamera()->getPosition().x,
_cameraMan->getCamera()->getPosition().y, _cameraMan->getCamera()->getPosition().z);
evt::EventManager::getSingletonPtr()->emit<evt::SoundEffectSpatialization>(effect::ImpactBoom, _cesar->getPosition(), true);
(_cameraman) est donc ma position actuelle de ma camera, moi , et mon Listener,
le Event Manager emit un type d’évent, qui prends en paramètre ce qui me permet de construire mon objet, l'enumeration relative au son, la position du son , ici c'est celle du Squelette dans l'arene, et si je veut faire loop le son, en effet je veut qu'on puisse entendre le Squelette ce frappé le torse en boucle alors j'envoie true)
Maintenant là où j'update mon Listener a chaque frame :
_soundMgr->update(evt.timeSinceLastFrame,
TestScene::getSingletonPtr()->_cameraMan->getCamera()->getPosition(),
TestScene::getSingletonPtr()->_cameraMan->getCamera()->getDirection());
void SoundEffectsManager::update(float timeSinceLastFrame, const Ogre::Vector3& position,
const Ogre::Vector3& direction)
{
sf::Listener::setPosition(static_cast<float> (position.x),
static_cast<float> (position.y),
static_cast<float> (position.z));
//sf::Listener::setDirection(direction.x, direction.y, direction.z);
}
là où le son est joué :
void SoundEffectsManager::playSound(const effect& effectId, const Ogre::Vector3& position, bool loop)
{
if (!_effects.isLoaded(effectId))
_effects.loadResource(effectId, _effectsPath[effectId]);
_sndBuffer = _effects.getResource(effectId);
_snd.setBuffer(_sndBuffer);
_snd.setVolume(100);
_snd.setPosition(position.x, position.y, position.z);
_snd.setRelativeToListener(true);
//test
_snd.setAttenuation(10.f);
_snd.setMinDistance(5.f);
//Volume factor = MinDistance / (MinDistance + Attenuation * (max(Distance, MinDistance) - MinDistance))
_snd.setLoop(loop);
_snd.play();
}
Donc voilà peut importe ma position sur ma scene , j'entends le son de partout et au même volume, l'atténuation/la min distance n'as pas l'air d'être pris en compte !
Merci d'avance!
Cordialement