DEV Community

Discussion on: Une musique de jeu évolutive grâce à JavaScript

Collapse
 
bcalou profile image
Bastien Calou

J'ai volontairement écarté toute ligne de JavaScript du contenu de l'article, mais un mot tout de même !

Manipuler des audio en JS est très direct :

music = new Audio("music.mp3"); // Charger un fichier
music.volume = 0.5; // Régler le volume
music.play(); // Lancer la lecture
music.stop(); // Arrêter la lecture
Enter fullscreen mode Exit fullscreen mode

Pour avancer de 15 secondes dans une piste audio :

music.currentTime += 15;
Enter fullscreen mode Exit fullscreen mode

J'ai appris au passage qu'on ne pouvait pas jouer deux fois le même fichier en parallèle (ce qui pourtant est nécessaire si deux bruitages identiques sont joués de façon rapprochée). Le problème se résoud avec la fonction cloneNode :

music.cloneNode().play();
music.cloneNode().play(); // Deuxième lecture en parallèle
Enter fullscreen mode Exit fullscreen mode

Par ailleurs, le nombre de joueurs étant très variable, chaque nouveau zombie ne fait pas progresser la musique d'un cycle précisément, contrairement à ce qui est expliqué dans l'article pour simplifier. Nous avons une fonction progressTo(progression) qui prend un nombre entre 0 et 1, reflétant l'évolution du jeu (0 étant de le début, et 1 la fin). Ainsi, appeler progressTo(0.5) signifie que le jeu est à la moitié de sa progression (la moitié des joueurs sont des zombies). La musique peut alors avancer en fonction du nombre de cycles disponibles et, éventuellement, sauter des cycles si nécessaire.

C'est tout ! Le reste du travail n'était que du JS classique.

Cependant, mon implémentation n'est pas ultra précise. Mon code utilise des setTimeout et setInterval, et rien ne garantit qu'ils seront appelé exactement au bon moment.

Je n'avais pas le temps d'expérimenter au-delà, et c'est totalement spéculatif, mais peut-être faudrait-il aller voir du côté des service workers, ou de WebAssembly, ou d'une autre manière de gérer l'audio que j'ignore totalement ?