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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 59
    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

+ 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