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.