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 :

AS3: sound_channel.stop(); -> ne fonctionne pas avec un ENTER_FRAME handler!


Sujet :

ActionScript 3

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Par défaut AS3: sound_channel.stop(); -> ne fonctionne pas avec un ENTER_FRAME handler!
    Bonjour.
    Je travaille sur un jeu de platform 2D.
    Quand le personnage tombe, je voudrais qu’un son démarre.
    Quand le personnage touche la platforme, Je voudrais que ce son cesse immediatement.

    Voici le code concerné:
    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
     
    // "ed" est le nom de l’instance de l’objet qui correspond au personnage contrôlé. 
     
    //Boolean pour la detection de contact, je l’ai beaucoup tracé, ca fonctionne bien (En l’occurrence, j’utilise la simple classe hitTestPoint pour detecter)
    var edPlatformContact:Boolean=false;
     
    //Listener principal
    stage.addEventListener(Event.ENTER_FRAME, gameloop);
     
    //Appel des fonctions
    function gameloop(e:Event) 
            { // (les frames 9 et 10 du movie-clip "ed" correspondent aux animations de chute)
    	         if (ed.currentFrame == 9 || ed.currentFrame == 10 && ! edPlatformContact) //personage tombe = le son démarre.
    	         {
         	                  SoundFallStart();
    	         }
    	         if (edPlatformContact==true) //personnage touche le sol = le son s’arrête. 
    	         {
    		         SoundFallStop();
    	         }
             } 
     
    //Variable du son (Fall_Sound = class name du fichier son)
    var SoundFall:Sound = new Fall_Sound(); 
     
    //Channel du son
    var ChannelFall:SoundChannel= new SoundChannel();
     
    //Transformateur du son
    var TransformFall = new SoundTransform();
     
    //Fonction qui démarre le son quand le personnage tombe
    function SoundFallStart()
    	{
    		trace("Sound Starts");
    		ChannelFall = SoundFall.play();
    		TransformFall.volume=0.2;
    		ChannelFall.soundTransform = TransformFall;
    	}
     
    //Fonction qui tente d’arrêter le son quand le personnage touche le sol. 
    function SoundFallStop()
    	{
    		trace("Sound Stops");
    		TransformFall.volume=0.0;
    		ChannelFall.stop();
    	}
    Quand je test le jeu, je n’ai pas de bugs.
    Les tracers fonctionnent ("Sound Starts" quad le personnage tombe avec ses animation de chute, "Sound Stops" quand le personnage touche le sol. Malheureusement le channel ne s’arrete pas. Le son persiste jusqu’a la fin de l’échantillon.

    Pour résoudre le problème, considérons que le boolean edPlatformContact fonctionne bien à la base. Je ne pense qu’on doit s’attarder là dessus pour résoudre le problème. En gros, les valeurs de cette variable (true, false) sont définies par le ENTER_FRAME (30 fps). Ainsi, cette variable est en effet TRUE quand le personnage touche le sol, et FALSE quand le personnage est en l’air.

    Voici un autre partie de mon code qui pourrait vous aider a mieux comprendre comment fonctionne mon moteur physique:
    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
     
    // "platforms" est le nom d’instance de l’objet qui correspond a la plateforme/sol dans le jeu
     
    //Autres variables 
    var vy:Number=0; // Vitesse axe Y 
    var gv:Number=1; // Gravité
    var jumped:Boolean=false; //Detection de saut (fait plus ou moins le même boulot que le boolean edPlatformContact, si vous voulez) 
     
    //Fonction qui est appelée par le gameloop 
    function jumpgravity () 
              { 
              // Fait tomber le personnage (gravité et saut) 
              vy+=gv; // Cela va constamment accélérer la chute
              if (!platforms.hitTestPoint(ed.x,ed.y,true))
              {
                       ed.y+=vy; 
                       edPlatformContact=false; 
              } 
              // Ajuste la position du personnage sur la plateforme de manière à ce qu’il soit au dessus, et pas au milieu de celle-ci.
              for(vari=0;i<platforms.height;i++) // platforms.height correspond à la hauteur de la platform
              { 
                       if (platforms.hitTestPoint(ed.x,ed.y,true)) 
                       { 
                                 ed.y--; 
                                 vy=0; 
                                 jumped=false; 
                                 edPlatformContact=true; 
                        }
               } 
               }
    Quelqu’un sait-il pourquoi le son ne s’arrête pas ?
    Merci pour votre lecture.

  2. #2
    Membre expérimenté Avatar de gustave02
    Homme Profil pro
    aucune
    Inscrit en
    Février 2013
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Février 2013
    Messages : 162
    Par défaut
    bonjour
    je précise que j'ai pas testé. mais il y a un truc qui me choque.
    tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ChannelFall = SoundFall.play();
    SoundFall.play(); donc SoundFall.stop(); et pas ChannelFall.stop();

    a essayer si c'est pas ca je ferais un test
    @+gustave02

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Par défaut
    Merci pour ta réponse gustave02.

    L'idée était bonne mais malheureusement la classe "Sound" de flash ne gère pas la méthode ".Stop"! Seule la classe "SoundChannel" le fait.
    Voice un petit article à ce sujet (en anglais):

    -----------------------

    Stopping A Sound:

    In addition the ability to play a sound, you will obviously also want to know how to stop your sound after you play it. The Sound Class does not have a method for stopping a sound. The SoundChannel Class must be used to perform that task. A SoundChannel is a class that is used to hold a raw sound object and then manipulate it using the methods and properties of the SoundChannel Class. The methods and properties you should be aware of are:

    • stop() - this method stops the sound playing through the channel.

    • position - this property is used to retrieve the current playback position of the sound playing through the channel.

    • soundTransform - this property is used to set and retrieve sound transformations such as volume and panning.


    - Source: http://www.republicofcode.com/tutorials/flash/as3sound/

    -----------------------

    N.B. Je pense que la source du problème vient du listener utilisé. Par exemple, ces mêmes lignes de code utilisées avec un MOUSE event fonctionnent bien. j'ai aussi testé d'autres types de listeners (e.g. SOUND_COMPLETE), mais je n'obtiens jamais le résultat voulu (le son ne s'arrête pas immédiatement).

  4. #4
    Membre Expert
    Avatar de Archimède
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2005
    Messages
    1 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 644
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ChannelFall=SoundFall.play();
    //et :
    ChannelFall.stop();
    bonne soirée

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Par défaut
    Bonsoir.
    Ces lignes de codes sont bien celles que j'utilise dans mes fonctions.
    Le problème reste le même.

  6. #6
    Membre expérimenté Avatar de gustave02
    Homme Profil pro
    aucune
    Inscrit en
    Février 2013
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Février 2013
    Messages : 162
    Par défaut
    je fais un test pour me remettre en tete la facon de faire. ca marche

    le code
    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
    import flash.events.MouseEvent;
     
     
    play_btn.addEventListener(MouseEvent.CLICK, fplay);//un bouton  lecture
    stop_btn.addEventListener(MouseEvent.CLICK, fstop);//un bouton stop 
     
    var alerte:Sound ;
    var myChannel:SoundChannel = new SoundChannel();
    var myTransform:SoundTransform = new SoundTransform();
     
    function fplay(event:MouseEvent):void{
    		alerte = new Alerte();
    		myChannel = alerte.play();
    		myTransform.volume = 0.4;
    		myChannel.soundTransform = myTransform;
    }
     
    function fstop(event:MouseEvent):void{
    		myChannel.stop();
     
    }
    comme ca ca marche donc pourquoi pas pour toi
    est ce que t'as condition

    if (ed.currentFrame == 9 || ed.currentFrame == 10 && ! edPlatformContact) est bonne elle dit si tu est sur l'image 9 ou si tu est (sur la 10 et edPlatformContac == false)

    on est d'accord que si tu est sur la 9 est edPlatformContac == false le son play();

    et pas if (ed.currentFrame == 9 && ! edPlatformContact || ed.currentFrame == 10 && ! edPlatformContact)

    @+gustave02

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Par défaut
    Merci pour ton test.

    Oui comme je l'ai dit plus haut, ces lignes de codes fonctionnent bien avec des listeners du type MOUSE (e.g. avec bouton play, bouton stop). Par contre, ici, on ne tente pas de gérer la lecture du son avec de tels listeners.
    Je pense que mes conditions fonctionnent bien étant donné que mes traceurs confirment l'appel des fonctions:

    Console:

    Personnage n'est plus en contact avec la plate-forme et est en animation 9 ou 10: (= personnage tombe)
    false = edContactPlatform
    Sound Starts
    false = edContactPlatform
    Sound Starts
    false = edContactPlatform
    Sound Starts
    false = edContactPlatform
    Sound Starts

    .... 30 fois par seconde (gameloop)

    Personnage est en contact avec la plate-forme: (= personnage atterrit)
    true = edContactPlatform
    Sound Stops
    true = edContactPlatform
    Sound Stops
    true = edContactPlatform
    Sound Stops
    true = edContactPlatform
    Sound Stops

    .... 30 fois par seconde (gameloop)

    Résultat:

    Le son démarre bien quand le personnage tombe (ce que l'on veut), mais il ne s'arrête pas immédiatement quand le personnage atterrit (ce que l'on ne veut pas). En revanche, le son est lu jusqu'au bout (long cri).

    Comme je l'ai dit plus au en N.B., je pense que la source du problème vient peut être du listener utilisé. j'ai aussi testé d'autres types de listeners (e.g. SOUND_COMPLETE), mais je n'obtiens jamais le résultat voulu (le son ne s'arrête pas immédiatement = le problème reste exactement le même).

    Comme dit le titre du post: AS3: sound_channel.stop(); -> ne fonctionne pas avec un ENTER_FRAME handler!

    En d'autre thermes, notre problème ne concerne pas le son directement, mais plutôt comment gérer la lecture d'un son à l'aide de listeners adéquats et de conditions booleans.

  8. #8
    Membre expérimenté Avatar de gustave02
    Homme Profil pro
    aucune
    Inscrit en
    Février 2013
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Février 2013
    Messages : 162
    Par défaut
    je modifi le test
    mon mouseEvent appel une fonction qui stop le son ca marche
    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
    import flash.events.MouseEvent;
     
     
    play_btn.addEventListener(MouseEvent.CLICK, fplay);
    stop_btn.addEventListener(MouseEvent.CLICK, fstop);
     
    var alerte:Sound ;
    var myChannel:SoundChannel = new SoundChannel();
    var myTransform:SoundTransform = new SoundTransform();
     
    function fplay(event:MouseEvent):void{
    		alerte = new Alerte();
    		myChannel = alerte.play();
    		myTransform.volume = 0.4;
    		myChannel.soundTransform = myTransform;
    }
     
    function fstop(event:MouseEvent):void{
    	sonStop();
     
     
    }
     
    function sonStop():void{
    	myChannel.stop();
    }

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Par défaut
    Ceci utilise les objets play_btn et stop_btn.
    Dans notre cas, nous aimerions exécuter ces fonctions à l'aide de variables, de propriétés d'objets et de listeners qui ne sont pas du type MOUSE.

  10. #10
    Membre expérimenté Avatar de gustave02
    Homme Profil pro
    aucune
    Inscrit en
    Février 2013
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Février 2013
    Messages : 162
    Par défaut
    nouveaux test au bout de 30 frame coupe le son

    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
    import flash.events.MouseEvent;
    import flash.events.Event;
     
     
    play_btn.addEventListener(MouseEvent.CLICK, fplay);
     
     
    var n:uint = 0;
    var alerte:Sound ;
    var myChannel:SoundChannel = new SoundChannel();
    var myTransform:SoundTransform = new SoundTransform();
     
    function fplay(event:MouseEvent):void{
    		alerte = new Alerte();
    		myChannel = alerte.play();
    		myTransform.volume = 0.4;
    		myChannel.soundTransform = myTransform;
    		addEventListener(Event.ENTER_FRAME, sonStop2);
    }
     
     
     
     
    function sonStop2(event:Event):void{
    	n++;
    	if(n > 30){
    		sonStop();
    		n = 0;
    		removeEventListener(Event.ENTER_FRAME, sonStop2);
    	}
    }
     
     
     
    function sonStop():void{
    	myChannel.stop();
    }

  11. #11
    Membre expérimenté Avatar de gustave02
    Homme Profil pro
    aucune
    Inscrit en
    Février 2013
    Messages
    162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Février 2013
    Messages : 162
    Par défaut
    nouveaux test avec enterframe et des conditions et tu sur de tes conditions.
    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
    import flash.media.SoundTransform;
     
    var lecture:Boolean=false;
     
    //Listener principal
    addEventListener(Event.ENTER_FRAME, gameloop);
     
    //Appel des fonctions
    function gameloop(e:Event):void{ // (les frames 9 et 10 du movie-clip "ed" correspondent aux animations de chute)
    	         if (currentFrame > 20  && currentFrame < 40  && lecture == false) //personage tombe = le son démarre.
    	         {
         	                  SoundFallStart();
    						  lecture = true;
    	         }
    	         if (currentFrame == 100 && lecture == true) //personnage touche le sol = le son s’arrête. 
    	         {
    		         SoundFallStop();
    				 lecture = false;
    	         }
             } 
     
    //Variable du son (Fall_Sound = class name du fichier son)
    var SoundFall:Sound = new Alerte(); 
     
    //Channel du son
    var ChannelFall:SoundChannel= new SoundChannel();
     
    //Transformateur du son
    var TransformFall:SoundTransform = new SoundTransform();
     
    //Fonction qui démarre le son quand le personnage tombe
    function SoundFallStart()
    	{
    		trace("Sound Starts");
    		ChannelFall = SoundFall.play();
    		TransformFall.volume=0.2;
    		ChannelFall.soundTransform = TransformFall;
    	}
     
    //Fonction qui tente d’arrêter le son quand le personnage touche le sol. 
    function SoundFallStop()
    	{
    		trace("Sound Stops");
    		ChannelFall.stop();
    	}

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Août 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2012
    Messages : 9
    Par défaut
    Incroyable !
    J'ai utilisé ta variable boolean "lecture" comme tu l'a fais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function gameloop(e:Event) {
        if (ed.currentFrame == 9 && ! edPlatformContact && lectur==false || ed.currentFrame == 10 && ! edPlatformContact && lectur==false)
            {
            //edPlatformContact = true;
            SoundFallStart();
    		lectur=true;
            }
    	if (edPlatformContact==true || ed.currentFrame==(11) && ed.y<479.6 || ed.currentFrame==(12) && ed.y<479.6)
    	{
    	SoundFallStop();
    		lectur=false;
    	}	
    }
    Utiliser cette variable comme une nouvelle condition (&& lectur== false) résoud le problème!
    Merci beaucoup gustave02 !

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

Discussions similaires

  1. [cargo:stop] ne fonctionne pas avec Jboss 4
    Par vain_mich dans le forum Maven
    Réponses: 2
    Dernier message: 16/08/2007, 09h32
  2. Réponses: 1
    Dernier message: 25/01/2007, 18h19
  3. evenement onclick ne fonctionne pas avec explorer??
    Par nath-0-0 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 15/03/2006, 12h13
  4. Réponses: 7
    Dernier message: 24/01/2006, 11h03
  5. window.resizeTo ne fonctionne pas avec firefox?
    Par FrankOVD dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/06/2005, 15h07

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