Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flash > AS3
AS3 Questions relatives à la programmation ActionScript 3 (Cours AS3)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/04/2011, 22h56   #1
Candidat au titre de Membre du Club
 
Inscription : janvier 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 33
Points : 12
Points : 12
Par défaut Bonne pratique pour la gestion du son

Bonjour,
je me suis mis à flash et actionscript3 récement, dans le but de faire des jeux.

J'aurais voulu savoir quelle est la meilleure pratique à adopter pour la gestion des sons.

Prenons le cas d'une classe Arme qui aurait différentes sous-classes (Pistolet, Mitraillettes). Je voudrais que lorsqu'on tire avec une arme, elle produise un son.

Il me semble logique que chaque arme ait un (ou plusieurs) Sound dans ses propriétés. Mais clairement, le son joué par une même arme serait toujours le même, donc déjà je me disais que ça serait plus logique que cette propriété soit statique.

La question principale se situe au niveau du SoundChannel.

3 possibilités d'après moi:
- Chaque instance d'Arme a sa propre instance de SoundChannel (créée à la construction)
- Le constructeur d'Arme prend un SoundChannel en paramètre (me semble la bonne si je veux par exemple pouvoir modifier le volume sonore de tous les SFX)
- La classe Arme ne devrait pas se soucier de jouer le son, cette logique n'a rien à voir avec l'arme en elle-même

quelle serait la meilleure pratique
jojolepabo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2011, 12h32   #2
Membre Expert
 
Avatar de Lorenzo77
 
Inscription : mai 2006
Messages : 1 294
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 1 294
Points : 1 220
Points : 1 220
salut,

en programmation objet la 3eme solution me semble la meilleur.

j'aurais tendance a avoir un soundChannel par piste audio -> essaye de créer une classe Son qui va te faciliter la lecture/gestion des sons.
__________________
Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
Mon blog : http://web.codeur.free.fr
Lorenzo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2011, 21h57   #3
Candidat au titre de Membre du Club
 
Inscription : janvier 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 33
Points : 12
Points : 12
Citation:
Envoyé par Lorenzo77 Voir le message
salut,

en programmation objet la 3eme solution me semble la meilleur.

j'aurais tendance a avoir un soundChannel par piste audio -> essaye de créer une classe Son qui va te faciliter la lecture/gestion des sons.
Ca me semble un peu overkill d'avoir un soundChannel par piste, d'autant plus qu'il me semble avoir lu quelque part qu'on est limité à 32 channel

J'ai fait la tentative avec une classe SoundPlayer contenant un Vecteur (statique) contenant tous les sons, un SoundChannel (statique aussi) et une série de constantes (chacune correspondant à l'index d'un son dans le vecteur)

Ensuite il ne me reste plus qu'à appeler une methode statique pour jouer les sons. J'emploie une autre propriété de la classe: soundVolume pour gérer le volume sonore.

Code :
1
2
3
4
 
public static function play(soundIndex:Number) {
      channel = soundArray[soundIndex].play(0,0,new SoundTransform(soundVolume));
}
Le seul problème qui reste pour moi, comme vous le voyez ci-dessus, c'est que je suis obligé de systématiquement faire un new SoundTransform(soundVolume);

Je me demande s'il ny a pas une façon moins barbare de gérer cela.

Je n'utilise pas SoundMixer car je veux un contrôle du volume séparé pour la musique et les SFX
jojolepabo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/04/2011, 23h00   #4
Membre Expert
 
Avatar de Lorenzo77
 
Inscription : mai 2006
Messages : 1 294
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 1 294
Points : 1 220
Points : 1 220
pourquoi faire compliqué quand on peut faire simple
si tu as 100 fichiers audio dans ton appli tu vas avoir besoin d'une sacré mémoire pour faire la relation : index > fichier audio

je pensais a une occurrence de la classe 'Son' pour la lecture/gestion d'un fichier audio, c'est plus simple et peut importe le nombre de sons dans ton appli.
c'est ce que je fais et j'ai jamais vu une limitation sur le nombre de SoundChannel, de plus c'est plus facile a utiliser car le nom de l’occurrence indique le fichier audio, ex :
var tir:Son = new Son('tir.mp3');
var explosion:Son = new Son('explosion.mp3');
dans ma classe Son j'ai regroupé Sound et SoundChannel .
__________________
Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
Mon blog : http://web.codeur.free.fr
Lorenzo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 08h38   #5
Candidat au titre de Membre du Club
 
Inscription : janvier 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 33
Points : 12
Points : 12
Citation:
Envoyé par Lorenzo77 Voir le message
pourquoi faire compliqué quand on peut faire simple
si tu as 100 fichiers audio dans ton appli tu vas avoir besoin d'une sacré mémoire pour faire la relation : index > fichier audio

je pensais a une occurrence de la classe 'Son' pour la lecture/gestion d'un fichier audio, c'est plus simple et peut importe le nombre de sons dans ton appli.
c'est ce que je fais et j'ai jamais vu une limitation sur le nombre de SoundChannel, de plus c'est plus facile a utiliser car le nom de l’occurrence indique le fichier audio, ex :
var tir:Son = new Son('tir.mp3');
var explosion:Son = new Son('explosion.mp3');
dans ma classe Son j'ai regroupé Sound et SoundChannel .
edité: {
Je crois que j'ai mal compris ce que tu voulais dire par "sacrée mémoire", je pensais que tu parlais de la mémoire vive :-) Pour ce qui est de ma mémoire, je n'en ai pas besoin puisque je fonctionne avec des constantes bien nommées.

un appel à la fonction play ressemble à ça:
Code :
1
2
 
SoundPlayer.play(SoundPlayer.TIR_LASER);
}

J'ai quelques questions par rapport à cette approche:

- Comment fais-tu pour gérer le volume sonore (en sachant que les SFX et la musique ont un volume indépendant) avec un SoundChannel par son?

je vois 2 possibilités:

Soit tu prends un volume en paramètre du constructeur de Son, mais à ce moment, tu ne mets pas à jour le volume des sons qui sont en train d'être joués.

Soit tu veux mettre à jour le volume des sons en cours également, à ce moment il faut maintenir un tableau avec toutes les instances de Son et itérer sur ce tableau pour mettre à jour le volume de chaque SoundChannel. Mais du coup il faut aussi ajouter un listener sur chaque Son pour le retirer du tableau chaque fois qu'un son a été joué.

peut-être y a-t-il une autre solution mais je ne vois pas laquelle


- Le fait de loader chaque son au moment de le jouer n'est-il pas un peu lourd? Si tu as 100 ennemis qui tirent sur toi, tu vas loader "tir.mp3" 100 fois, ou bien je me trompe sur le fonctionnement?

- mes fichiers son (les SFX seulement, pas la musique) sont importés dans la bibliothèque sous forme de symboles, donc ils font partie du swf, d'après ce que j'ai lu c'est une pratique courante. Erreur?

- En termes de mémoire finalement, même si j'ai 100 fichiers son, ça reste des SFX, donc des fichiers .mp3 qui ne dépassent pas 1 seconde. Le plus gros chez moi fait 40Kb, la pluspart ne dépassent pas 10kb.
jojolepabo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 11h30   #6
Membre Expert
 
Avatar de Lorenzo77
 
Inscription : mai 2006
Messages : 1 294
Détails du profil
Informations personnelles :
Âge : 40
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : mai 2006
Messages : 1 294
Points : 1 220
Points : 1 220
ok .. j'ai pas pensé aux constantes ... honte sur moi



-pour le volume j'ai une propriété (get/set) que je passe a la classe qui change le volume du soundChannel

faut éviter de passer des paramètres au constructeur quand c'est possible, les getter/setter sont la pour ca.
Méthodes accesseur get et set




-Le chargement d'un son ne ce fait qu'une seule fois ! heureusement !

je ne suis pas obligé de Loader le son, c'est juste une des possibilités de la classe, elle accepte aussi une classe comme source, donc je peux intégrer tous les fichiers audio dans une bibli (SWC = bibli externe) que je charge une fois (ou que j’insère dans mon projet), des que la bibli est chargé je crée toutes les occurences et je peux les utiliser.

par contre si je passe par des fichiers audio externe, je dois ajouter un écouteur sur chaque occurence et j'attends le chargement complet ...


-si les sons sont dans ta bibli, tu n'as pas besoin de chargement, dans ce cas la tu utilises son nom d'occurrence comme une classe.

-le probleme des sons c'est qu'il font grimper la taille du SWF final, si ton SWF reste dans les 300/400Ko tu peux les laisser dans la bibli. (ce qui est plus pratique)
__________________
Le plus grand arbre est né d'une graine menue, une tour de neuf étages est partie d'une poignée de terre.
Mon blog : http://web.codeur.free.fr
Lorenzo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 15h38   #7
Candidat au titre de Membre du Club
 
Inscription : janvier 2004
Messages : 33
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 33
Points : 12
Points : 12
Ah ben merci pour les infos :-)

J'ai aussi fait des recherches et il semble que l'appel à des fonctions statiques soit beaucoup moins performant, donc moins souhaitable (=> excellent article sur la question: http://active.tutsplus.com/tutorials...s-and-methods/ )

Ah oui tiens curieux cette façon de faire des get / set quand on vient de Java Je sens que je vais devoir repasser dans mon code et changer mes getMachin et setBazar pour me conformer aux habitudes d'AS3.
jojolepabo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h46.


 
 
 
 
Partenaires

Hébergement Web