Comprendre et implémenter l'audio 3D dans GameMaker Studio

Ce que vous allez créer

L’audio est un élément crucial de l’expérience de jeu en général et GameMaker: Studio offre un moyen relativement simple d’implémenter l’audio 3D dans vos projets.. 

Pour mieux comprendre le concept de l'audio 3D, imaginez simplement ajouter une paire d'oreilles numériques à un objet de jeu contrôlé par le joueur. Lorsque le joueur s'approche d'une source de son dans le jeu, le volume de cette source devient plus fort. à mesure que le joueur s'éloigne, le volume diminue jusqu'à ce qu'il devienne finalement silencieux. La position du lecteur par rapport à la source audio entraînera également un son stéréo directionnel, et la vitesse du son appliquée à un objet en mouvement peut être appliquée pour créer un effet Doppler.. 

Cet ensemble de fonctions audio immersives peut être réalisé via un système de émetteurs audio Et un auditeur audio. Dans ce didacticiel, nous allons créer deux scènes qui intègrent l'audio 3D de différentes manières, comme le montre la vidéo de démonstration. Vous pouvez télécharger les fichiers sources et les démos EXE compilés à partir de GitHub..

Comprendre l'audio 3D

Les concepts impliqués dans l'audio 3D sont similaires dans tous les environnements de développement de jeux, car ils sont basés sur des règles connues du monde réel: le son devient plus fort lorsque vous approchez de la source et le son provenant de votre droite sera plus fort dans votre oreille droite. Ces principes de base peuvent être atteints manuellement en calculant le Gain et sortie d’une source audio par rapport à un objet de jeu spécifique, mais GameMaker: Studio fournit un ensemble de fonctions puissantes et faciles à utiliser qui vous permettent de contrôler directement l’API audio..

L'émetteur

L'émetteur audio joue le rôle de source d'un actif audio 3D dans GameMaker: Studio. L'émetteur est défini par une variable créée par l'utilisateur et une position (x, y, z) cela peut être soit statique ou dynamique. Le volume de l'émetteur est contrôlé par Gain et tomber valeurs, et des effets en temps réel peuvent être appliqués à travers le pas et rapidité valeurs. La façon dont l’émetteur gère la décélération audio est déterminée par le modèle de distance appliqué. Plusieurs émetteurs audio peuvent exister dans la même scène.

L'auditeur

L'auditeur audio agit comme une "oreille" qui reçoit le son 3D envoyé par l'émetteur. L'auditeur est situé à une position (x, y, z) qui peut aussi être statique ou dynamique, mais le orientation de l'auditeur est tout aussi important. 

L'orientation de l'auditeur détermine la direction et l'angle précis que "l'auditeur" regarde. L'orientation par défaut de l'auditeur dans GameMaker: Studio entraîne l'inversion des canaux audio gauche et droit pour l'audio 3D, ce que nous corrigerons ultérieurement lors de la mise en œuvre..

L'effet Doppler

Sans entrer dans une explication longue et approfondie de l'effet Doppler, on peut le décrire comme le changement de fréquence du son par rapport au mouvement et à la vitesse de l'émetteur ou de l'auditeur. Dans GameMaker: Studio, l'effet Doppler est obtenu en affectant des vecteurs à la vitesse de l'émetteur ou de l'auditeur audio. Pour une explication détaillée, lisez l'entrée de l'effet Doppler sur Wikipedia..

Implémentation audio 3D

L'implémentation de l'audio 3D dans votre projet GameMaker est un processus en trois étapes. Vous devez définir correctement l'émetteur dans un objet de jeu existant, le placer dans la pièce et indiquer à l'émetteur quand et comment jouer un son. Vous devez ensuite définir l'orientation et la position de l'auditeur dans un objet de jeu existant présent dans la même pièce que l'émetteur.. 

La première étape consiste toutefois à importer et à définir les ressources audio..

Importation d'actifs

Commencez par cliquer sur Ressources dans la barre d’outils principale de GameMaker et en sélectionnant Créer un son dans le menu déroulant. Entrez un nom pour la ressource audio et sélectionnez les attributs de son souhaités pour la diffusion en continu et la compression de fichier. Ensuite, dans le Options de cible section de la Propriétés du son Dans la fenêtre suivante, cliquez sur le premier menu déroulant et sélectionnez 3D dans la liste des options..

En désignant cet actif comme son 3D, nous pouvons tirer parti de l'API audio de GameMaker de manière unique..

Un émetteur fixe

Dans notre premier exemple, nous allons créer une sorte d'occurrence audio 3D de style Sim City isométrique avec un émetteur fixe. Notre auditeur sera lié à un objet du jeu qui suit le curseur de la souris et l’émetteur du son 3D restera dans un objet qui ne se déplace pas. Cet objet sera représenté par un petit groupe de bâtiments et l'émetteur jouera un son ambiant urbain avec une circulation intense et des klaxons de voitures.. 

Cela nous permettra de tester les propriétés d'atténuation audio du système audio 3D et de mieux comprendre l'importance de l'orientation de l'auditeur..

Créer l'écouteur

Notre auditeur audio 3D existera dans un objet qui suit le curseur de la souris. Dans cet exemple, l'objet sera identifié par un sprite ressemblant à un marqueur GPS. le obj_listener objet contient deux blocs de code importants: un dans la Créer événement, et un dans le Étape un événement.

Clique le Ajouter un évènement bouton et sélectionnez Créer ajouter un Créer événement à obj_listener. Faites glisser le Exécuter le code icône de la Contrôle onglet du obj_listener fenêtre de propriétés dans le actes section de la Créer un évènement panneau. Double-cliquez sur le Exécuter le code icône pour ouvrir l'éditeur de code GML et ajouter la ligne de code suivante:

audio_listener_orientation (0,1,0,0,0,1);

Ce code garantit que, dès que l'objet écouteur est créé, il sera positionné dans l'espace 3D pour vers l'écran, à droite. Le son provenant d'un émetteur situé à droite de l'auditeur sera plus présent dans le haut-parleur de droite, et inversement. Il s'agit de la configuration standard que vous souhaiterez utiliser dans presque tous les types d'implémentation d'écoute dans GameMaker: Studio. 

Si vous voulez échanger les fichiers audio gauche et droit, utilisez le code suivant pour l’orientation:

audio_listener_orientation (0,1,0,0,0, -1);

Ajouter un Étape événement à obj_listener et faites glisser un autre Exécuter le code icône dans le actes panneau. Ouvrez à nouveau l'éditeur de code GML et entrez les lignes de code suivantes:

x = souris_x; y = mouse_y; audio_listener_position (x, y, 0);

Ce code trouve la position actuelle du curseur de la souris et attribue ces coordonnées à la position du curseur. obj_listener objet. La position de l'auditeur audio est également définie par ces coordonnées. En plaçant ce code dans le Étape événement, nous nous assurons que le obj_listener l’objet qui l’accompagne et l’auditeur lui-même se trouvent toujours au même endroit, car le Étape le code d'événement est exécuté à chaque image pendant l'exécution. 

(Le 0 dans ce code est la position z de l'auditeur. Puisque notre jeu est en 2D, notre auditeur sera toujours à 0 sur l’axe des z.)

Ouvrez la pièce où vous voulez que l'objet écouteur apparaisse. Clique le Objets onglet et cliquez dans le panneau pour afficher la liste des objets disponibles. Sélectionnez votre objet écouteur et cliquez dans la pièce pour le placer. La position de départ de cet objet n'a pas d'importance, car il sera mis à jour pour correspondre à la position du curseur de la souris lors de l'exécution. 

Voilà pour l'auditeur. Maintenant, nous devons créer quelque chose pour que l'auditeur entende.

Création de l'émetteur

Comme pour l'auditeur, nous nous concentrerons exclusivement sur la Créer et Étape événements de l'objet émetteur. Dans ce cas, nous placerons l’émetteur dans le obj_city objet. 

Ajouter le Créer et Étape événements à obj_city ,et ajouter un Exécuter le code action aux deux événements.

Dans le code GML du Créer événement, ajoutez ce qui suit:

s_emit = audio_emitter_create (); audio_falloff_set_model (audio_falloff_exponent_distance); audio_emitter_falloff (s_emit, 50, 200, 1); audio_play_sound_on (s_emit, snd_cityaudio, true, 1);

(s_emit est le nom de notre nouvel émetteur.)

Nous avons choisi le Distance exponentielle modèle de repli pour cet exemple car il donne un gain constant avec une forte augmentation une fois que vous rencontrez le Distance de référence point. Cela permet au volume audio 3D de diminuer à mesure que vous vous éloignez de l'objet, en douceur, sans sauts brusques, jusqu'à ce que vous vous trouviez très près de la source. Pour une liste complète des modèles Falloff et leurs descriptions détaillées, consultez la documentation des modèles Falloff de GameMaker.

audio_emitter_falloff (émetteur, falloff_ref, falloff_max, falloff_factor) C'est ici que nous avons défini les attributs du modèle de réduction:

  • émetteur est notre s_emit variable. 
  • falloff_ref est le point auquel la diminution du volume commencera à commencer. 
  • falloff_max est le moment où l'auditeur ne pourra plus entendre l'émetteur.
  • falloff_factor est un numéro utilisé dans le audio_falloff_set_model calcul pour déterminer les résultats de la chute. Dans notre exemple, nous utilisons la valeur par défaut de 1 de sorte que notre s_emit l'émetteur commencera à tomber une fois que l'auditeur sera à 100 pixels de l'émetteur et que l'auditeur ne pourra pas entendre l'émetteur à une distance de 300 pixels ou plus.

audio_play_sound_on (émetteur, son, boucle, priorité) Voici comment nous obtenons que l’émetteur commence à jouer notre son 3D: 

  • émetteur est notre s_emit variable. 
  • du son est notre snd_cityaudio Ressource audio 3D que nous avons importée précédemment. 
  • boucle détermine si ce son doit être répété ou non. 
  • priorité est une valeur de 0 à 100 qui détermine "l'importance" du son joué - des nombres plus élevés représentent des sons de priorité plus élevée. 

Dans notre exemple, un seul son est joué, donc la priorité n'a pas d'importance. Et puisque ce code est exécuté dans le Créer événement et nous avons choisi de boucler le son, cet élément audio 3D sera lu dès que la salle sera chargée et continuera à jouer jusqu’à ce que l’arrêt soit donné. Et cela nous amène à un très étape importante:

Cet actif audio jouera même lorsque vous chargez une autre pièce qui ne contient pas l'émetteur. Afin d'empêcher efficacement cet actif de jouer dans une autre pièce que celle contenant l'émetteur, nous devons ajouter un Fin de la chambre événement à obj_city

dans le actes panneau de la Fin de la chambre événement, ajouter un autre Exécuter le code icône avec le code GML suivant:

sound_stop (snd_cityaudio);

Maintenant, tout ce qui reste à faire est de placer le obj_city objet dans la pièce comme vous avez placé l'auditeur auparavant. Exécutez le jeu et testez la position du curseur de la souris pour modifier l'emplacement de l'auditeur par rapport à l'émetteur afin de voir exactement comment fonctionne l'audio 3D dans la pratique..

Un émetteur en mouvement avec effet Doppler

Dans le deuxième exemple, nous allons attacher l'émetteur à un objet en mouvement et appliquer l'effet Doppler tout en utilisant le même objet écouteur que celui créé précédemment. 

Un objet balle se déplace du côté droit de l'écran vers la gauche. Lorsque la balle atteint le bord de l’écran, elle s’enroule et continue à son point de départ. (Nous ne verrons pas comment créer ce mouvement.) L'objet balle émet un son en boucle que l'on peut décrire comme un son "sifflant" ou "bourdonnant". Lorsque l'objet s'approche de l'auditeur, le la fréquence du son va changer, en raison de l'effet Doppler.

Création de l'émetteur

Ajouter un Créer et un Étape événement au obj_bullet objet, et ajoutez le Exécuter le code action aux deux événements.

dans le Créer événement, ajoutez le code suivant à l’éditeur GML:

s_emit2 = audio_emitter_create (); audio_emitter_falloff (s_emit2, 25, 200, 1.5); audio_play_sound_on (s_emit2, snd_bullet, true, 1);

Ici, s_emit2 est le nom de notre nouvel émetteur.

Cet émetteur utilisera le même modèle d'atténuation défini dans la salle précédente, car un seul type de modèle d'atténuation peut être actif à la fois, et notre modèle d'origine convient à cet exemple. Les nouvelles propriétés de réduction utilisent une référence de réduction de 25 pixels, un maximum de réduction de 200 pixels, et un facteur de réduction de 2,5 pour le calcul. le snd_bullet Le son 3D commence à jouer dès la création de l’objet, avec une priorité de 1, et bouclera indéfiniment.

Dans l'éditeur GML du Étape événement, ajoutez cette ligne de code:

audio_emitter_position (s_emit2, x, y, 0);

Puisque l'objet se déplace et que les valeurs x et y changent constamment, la position de l'émetteur sera également mise à jour à la nouvelle position à chaque étape..

N'oubliez pas d'ajouter l'objet balle dans la pièce et assurez-vous d'ajouter le sound_stop (snd_bullet) code à l'objet Fin de la chambre un événement.

Création de l'effet Doppler

Le système de son 3D est maintenant en place pour l'objet balle et l'auditeur fonctionne correctement, mais rendons les choses plus intéressantes avec l'effet Doppler. 

L'ajout de l'effet Doppler est très simple, en fait. Il suffit d'ouvrir le Exécuter le code action dans le obj_bullet Créer événement, et ajoutez la ligne de code suivante:

audio_emitter_velocity (s_emit2, -25, -25, 0);

audio_emitter_velocity (emitter, vx, vy, vz) permet de définir les propriétés de l’effet Doppler: 

  • émetteur est notre s_emit 2 variable. 
  • vx est la vitesse (en pixels par pas) le long de l'axe des x. 
  • vy est la vitesse (en pixels par pas) le long de l'axe des y. 
  • vz s’applique à la vitesse le long de l’axe des z, mais notre jeu est en 2D; nous réglons donc ce paramètre à 0

Les configurations d’effet Doppler typiques utilisent le vitesse élevée et vspeed les variables d'un objet pour déterminer les valeurs de vitesse, mais dans ce cas, nous utilisons simplement une valeur de -25 pour créer un son de balle plus réaliste. Vous pouvez tester l'objet avec le code suivant pour remarquer la différence:

audio_emitter_velocity (s_emit2, hspeed, vspeed, 0);

Idées de mise en œuvre

L'audio 3D peut ajouter beaucoup de profondeur et d'ambiance à votre projet de jeu avec un minimum d'effort. Voici quelques exemples pour vous aider à démarrer:

  • Un jeu de cache-cache où vous devez écouter des indices audio pour trouver un objet caché.
  • Risques d’électricité ou d’incendie dans une plateforme qui vous avertit des dangers à mesure que vous vous rapprochez.
  • Un jeu de style Frogger où les voitures passent devant vous en utilisant l'effet Doppler.
  • L'eau courante dans une grotte ou le vent soufflant à travers un conduit d'air pour vous conduire à la sortie.
  • Un jeu d'espionnage où vous devez vous approcher d'une cible pour entendre une conversation.