|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Candidat au titre de Membre du Club
![]() Inscription : janvier 2004 Messages : 33 ![]() |
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 |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Inscription : mai 2006 Messages : 1 294 ![]() |
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 |
|
00
|
|
|
#3 | |||
|
Candidat au titre de Membre du Club
![]() Inscription : janvier 2004 Messages : 33 ![]() |
Citation:
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 :
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 |
|||
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : mai 2006 Messages : 1 294 ![]() |
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 |
|
00
|
|
|
#5 | |||
|
Candidat au titre de Membre du Club
![]() Inscription : janvier 2004 Messages : 33 ![]() |
Citation:
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 :
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. |
|||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : mai 2006 Messages : 1 294 ![]() |
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 |
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : janvier 2004 Messages : 33 ![]() |
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 |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com