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

XNA/Monogame Discussion :

Gestion du sons ?


Sujet :

XNA/Monogame

  1. #1
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 43
    Points : 38
    Points
    38
    Par défaut Gestion du sons ?
    Bonjour !


    Je suis entrain de travailler sur l'intégration de sons dans mon jeux.
    Cela ne semble pas bien compliqué, surtout avec SoundEffect.

    Ce que je voudrais, c'est un sons qu'un seul fois quand en fonction d'un évènement.
    Ce que je fais:
    -Chargement du sons dans LoadContent
    - je crée une fonction qui contient la méthode "play();"

    et enfin, j'appelle cette fonction dans la méthode Update quand une collision est détecté ( sons d'explosion ). De cette manière, le sons sera joué à chaque appelle de la methode Update. Du coup j'ai contourné le problème comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                    time += gameTime.ElapsedGameTime.TotalMilliseconds;
     
                    if (time <= gameTime.ElapsedGameTime.TotalMilliseconds + 1)
                    {
                        vaisseau.playSound();
                    }
    Mais c'est du bricolage
    Donc, il y aurait-il un moyen plus propre de jouer un sons qu'une seule fois ?


    Autre chose aussi. Pour le déplacement de ma fusée, j'ai crée un sons loop mais je ne sais pas comment faire pour le faire jouer en boucle tant que la touche 'espace' est appuyé ( par exemple )...

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    Salut le_viking,

    "...en fonction d'un évènement" donc utilises les évènements !
    Tu déclares un évènement à la racine du Namespace (comme ça toutes tes classes y auront accès):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public delegate void CollisionEvent(Vector2 CollisionPosition,object CollisionObject);
    Ensuite dans la classe de gestion des collisions (ClassCollisions par ex) tu crées l'évènement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public static CollisionEvent CollisionVaisseau;
    Dans ton Update (ou des évènements OnCollision de Farseer par exemple):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (collision) CollisionVaisseau (VaisseauPosition,Asteroid);
    Enfin dans la classe qui gère les sons (ou les explosions etc...)tu 't'abonnes'
    à l'évènement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ClassCollisions.CollisionVaisseau += new CollisionEvent(SonExplosion);//Initialize()
    void SonExplosion(Vector2 CollisionPosition, object CollisionObject)
    {
       vaisseau.playSound();
    }
    Pour le loop tu fais pareil, tu "t'abonnes" à l'évènement et tu le gères quand l'appuie d'une touche est détecté (barre espace par ex).

    Salutations

  3. #3
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    Merci Fabiani pour ces explications


    EDIT:

    Après réflexion, je me rend compte que je peux gérer l'explosion de ma fusée comme étant un évènement.

    Je fais une détection de collision, puis si il y a collision, j'appelle l'évènement ExplosionShip qui aura pour but de :

    - Remplacer la texture de la fusée par une texture d'explosion
    - jouer un sons d'explosion


    Je ne connaissais pas ce principe d'évènement. Je vais chercher des infos sur comment l'utiliser.

    j'ai bon ?

    En tout cas, merci Fabiani

  4. #4
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    Bon j'ai essayé d'implémenter un évènement avec tes explications Fabiani, mais le sons se joue plusieurs fois.

    Ce que j'ai fait:


    La class de mon vaisseau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    namespace Jeux
    {
        class PlayerShip
        {
     
            //Sons
            SoundEffect soundEffect;
     
            //Evènement 
            public delegate void CollisionEvent();
            public CollisionEvent CollisionShip;
     
     
     
            public PlayerShip() { }
     
            public void Initialize()
            {
                CollisionShip += new CollisionEvent(SonExplosion);
            }
     
            public void LoadContent(ContentManager content, string assetName)
            {
                //Sons d'explosion
                soundEffect = content.Load<SoundEffect>("Sons\\explosion");
            }
     
            public void Update(GameTime gameTime)
            {
                // si la fusée n'est pas détruite
                if (shipHit == false)
                {
                    //traitement
                }
     
                // si la fusée est détruite
                else
                {
                   //évènement de la destruction
                    CollisionShip();
     
                    shipHit = false;
                }
            }
     
     
            public void PlaySound()
            {
                soundEffect.Play();
            }
     
            void SonExplosion()
            {
                PlaySound();
            }
        }
    }
    Ai-je mal compris un étape ?

    Merci d'avance

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2002
    Messages : 255
    Points : 445
    Points
    445
    Par défaut
    Salut le_viking,

    Vu qu'il y a une latence, essaie ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
         shipHit = false;
         CollisionShip();
    Salutations.

  6. #6
    Nouveau membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2007
    Messages : 43
    Points : 38
    Points
    38
    Par défaut
    merci encore pour ton aide

    Cependant, cela ne fonctionne toujours pas. Le sons est joué plusieurs fois en même temps, je suppose que cela vient de la méthode update qui appelle plusieurs fois CollisionShip();. Ce qui est étrange, c'est que ça ce produit même avec un shiphit = false...

    Il doit y avoir un problème de ce coté la je pense.
    Je vais réfléchir dessus!


    Merci !

Discussions similaires

  1. gestion du son
    Par lord anubis dans le forum Allegro
    Réponses: 1
    Dernier message: 29/05/2006, 18h54
  2. Gestion de sons
    Par Ekinoks dans le forum C
    Réponses: 7
    Dernier message: 14/06/2005, 00h54
  3. [TP]Gestion du son
    Par JaVaCode dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 17/12/2004, 21h38
  4. Réponses: 4
    Dernier message: 14/12/2004, 17h37
  5. [flash mx]la gestion du son et de la video
    Par freshguicha dans le forum Flash
    Réponses: 5
    Dernier message: 03/04/2004, 12h50

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