Architecture d'un jeu vidéo 3D


précédentsommairesuivant

IV. Le moteur audio

Le moteur audio est le plus simple de tous les modules. Je me suis appuyé sur IrrKlang, il ne reste donc plus qu'à implémenter une gestion basique des sons. IrrKlang est encore en plein développement, certaines des fonctionnalités finales ne sont donc pas encore disponibles, notamment la détection des fins des sons, je n'ai donc implémenté aucune fonctionnalité touchant à cet aspect.

Le moteur audio est le seul à posséder les chemins physiques vers les ressources audio (wav, ogg ...). Tous les modules qui souhaitent lancer la lecture d'un son vont fournir le nom logique du son à jouer. Le moteur audio possèdera une table de correspondance entre les noms logiques et les noms physiques.

 
Sélectionnez
class sound_engine : public engine{
public:
	sound_engine(game*, bool);
	~sound_engine();
	void frame(){}

	inline void play_ambiance(std::string& s){s_engine->play2D(sound_names[s].c_str());}
	inline void play_spatial(std::string& s, irr::core::vector3df v){s_engine->play3D(sound_names[s].c_str(), v);}

	std::map<std::string, std::string> sound_names;

	void process_event(engine_event&);
protected:
	void get_config_data();
	irr::audio::ISoundEngine *s_engine;
	std::vector&std::string> playlist;
};

Le constructeur du moteur audio est similaire à celui du moteur graphique : les options de création de l'objet principal vont dépendre du mode passif ou actif.

Constructeur
Sélectionnez
sound_engine::sound_engine(game* g, bool passif):engine(g){
	passive_mode = passif;
	if (passive_mode)	
		s_engine = irr::audio::createIrrKlangDevice(irr::audio::ESOD_NULL);
	else
		s_engine = irr::audio::createIrrKlangDevice();

	// configuration du moteur audio
	get_config_data();
}

Le moteur audio devra être capable d'associer un nom physique aux noms logiques, au démarrage il doit donc créer sa table de correspondance sound_names. Il peut la créer à partir d'un fichier XML, d'un fichier INI ...

De la même manière, le moteur audio doit repérer toutes les musiques qu'il a à sa disposition pour l'élaboration d'une playlist. Et à chaque fois qu'une musique est terminée, il enchaînera sur la musique suivante. La création de la playlist peut par exemple se faire en analysant tous les fichiers présents dans un répertoire donné :

 
Sélectionnez
	boost::filesystem::path dir("./data/sound/playlist");
	boost::filesystem::directory_iterator i(dir), end;

	for (; i!=end; i++){
		if (boost::filesystem::is_directory("./data/sound/playlist/"+i->leaf()))
			continue;

		playlist.push_back("./data/sound/playlist/"+i->leaf());
	}

Les sons 3D pourront également être mis directement dans le graphe de scène, de manière à regrouper en un seul endroit tous les sons en cours de lecture. Cette solution nous permet de largement simplifier la gestions des sons. Cela permet également de ne plus avoir à se préoccuper de la perception d'un son par divers joueurs du réseau. Tout sera géré en temps qu'objets du graphe de scène. Un bon réglage des distances maximales de perceptions permettra de limiter le nombre de sons à jouer simultanément, économisant ainsi des ressources CPU.


précédentsommairesuivant

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

Copyright © 2007 Pierre Schwartz. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.