jeudi 10 février 2011

41 - Intégration des Musiques

Une fois les musiques composées et converties au format mp3, il n'y a plus qu'à les intégrer au jeu pour qu'elles soient jouées au bon moment. Mais les choses ne sont pas si simples...

Durant le jeu, les phases d'exploration et de combat s'alternent, ce qui se traduit entre autres par un changement de musique.
Quand le combat est terminé, si la musique d'exploration recommence depuis le début, le joueur risque de se lasser facilement de cette dernière ; en effet, pour peu que les combats s'enchainent rapidement, il est fort probable que le joueur n'entende guère plus que l'introduction du morceau !

Afin que le joueur ait l'occasion d'entendre autre chose que l'introduction, on peut par exemple faire en sorte que la musique d'exploration continue pendant le combat, mais en sourdine.
En ActionScript 2, cela peut se faire facilement en attachant la musique d'exploration et la musique de combat à des variables de type "Son" différentes ; cela revient à dire que chaque musique est sur une piste différente, et il suffit de mettre le son de la piste "exploration" à zéro au début du combat et à 100 à la fin pour obtenir l'effet désiré :

var musique_exploration: Sound = new Sound();
musique_exploration.attachSound("bgm1");
var musique_combat: Sound = new Sound();
musique_combat.attachSound("combat");

Au début du combat :
musique_exploration.setVolume(0) // la musique ne s'arrête pas, mais son volume est à 0.

À la fin du combat :
musique_exploration.setVolume(100) // la musique est de nouveau audible.

Le problème, c'est que le langage utilisé par SWiSH Max 3 (le logiciel que j'utilise pour programmer mon jeu) n'est pas l'ActionScript 2 mais le SWISHscript ; bien que similaires dans plus de 90% des cas, ces deux langages possèdent quelques différences subtiles, et le son en fait partie : Avec SWiSH Max 3, l'utilisation de "setVolume" affecte TOUTES les variables "Son" définies ! Si je décide de mettre le volume de la musique d'exploration à zéro pendant le combat, alors la musique de combat sera elle aussi à zéro !

Heureusement, j'ai une autre possibilité pour empêcher la musique d'exploration de recommencer depuis le début après un combat : La mettre en "pause" au début du combat et la faire reprendre là où elle en était quand ce dernier est terminé.


Il existe deux façon de faire jouer un son avec SWiSH Max 3 :
  • Le son est associé à un Clip ou une Scène ; dans ce cas, il est possible de contrôler la musique avec "play()", "stop()", "GotoAndPlay()"... Cela permet entre autres de sauter l'intro d'un morceau, de répéter en boucle un passage précis, etc.
  • Le son est appelé depuis un évènement "OnFrame()" d'un clip ou d'une Scène avec l'instruction "playSound()" ; dans ce cas la musique continue même si la lecture du Clip ou de la Scène est stoppée, et on a accès à de nombreuses options : Choix du volume et du nombre de répétitions du morceau, effets de fade in et de fade out... Un inconvénient majeur cependant : Impossible d'utiliser "playSound()" depuis une fonction, une boucle ou une condition...

J'ai donc créé un Clip "musique" contenant lui-même les Clips "bgm1", "bgm2", "bgm3"...
Chacun de ces Clips "bgm" est placé sur une frame différente du Clip "musique" (bgm1 est sur la frame 2, bgm2 sur la frame 3, etc.).
Le choix de la musique étant lié à la variable "_global.rang", je me retrouve avec le code suivant :

if (_global.rang == _global.bgmActuelle){ // la musique est inchangée
}
else { //on change de musique
_global.bgmActuelle = _global.rang;
musique.gotoAndStop(_global.rang + 1);
}
if (_global.soundSwitch == false){
bgm.setVolume(0)
}

Au début du combat le Clip "bgm" en cours de lecture est interrompu par un "stop()" et je joue la musique de combat depuis un autre Clip appelé "musique2" (qui permet de jouer la musique de combat, mais aussi la musique du Boss final). Une fois le combat terminé, la lecture du Clip "bgm" est relancée avec un "play()" et le morceau reprend là où il en était.

J'ai ensuite intégré les musiques des différentes cinématiques de fin et légèrement retravaillé leur timing.

J'ai aussi ajouté une commande "Toggle Sound ON/OFF" au Menu Clic Droit qui permet de passer du mode "volume normal" (setVolume(100)) au mode "muet" (setVolume(0)) et inversement ; un bouton "Son" ayant le même effet a aussi été ajouté à l'écran titre.
Si le jeu est en mode "muet" au moment de la dernière sauvegarde, il sera aussi en mode "muet" lors du prochain chargement.

Aucun commentaire:

Enregistrer un commentaire