IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ActionScript 3 Discussion :

Bonne pratique pour la gestion du son


Sujet :

ActionScript 3

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 33
    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

  2. #2
    Membre Expert Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Par défaut
    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.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 33
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Membre Expert Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Par défaut
    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 .

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 33
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre Expert Avatar de Lorenzo77
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    1 472
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 472
    Par défaut
    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)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Bonnes pratiques pour gestion technique d'un projet
    Par Kajan dans le forum Débuter
    Réponses: 2
    Dernier message: 22/01/2012, 01h43
  2. Réponses: 5
    Dernier message: 08/04/2011, 10h55
  3. Réponses: 5
    Dernier message: 12/09/2006, 18h06
  4. Tutoriel SEO : Introduction et bonnes pratiques pour l'optimisation de pages Web
    Par Community Management dans le forum Référencement
    Réponses: 0
    Dernier message: 06/07/2006, 00h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo