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é:
Quand je test le jeu, je n’ai pas de bugs.
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 linstance de lobjet qui correspond au personnage contrôlé. //Boolean pour la detection de contact, je lai beaucoup tracé, ca fonctionne bien (En loccurrence, jutilise 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 sarrê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 darrêter le son quand le personnage touche le sol. function SoundFallStop() { trace("Sound Stops"); TransformFall.volume=0.0; ChannelFall.stop(); }
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:
Quelqu’un sait-il pourquoi le son ne s’arrête pas ?
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 dinstance de lobjet 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 quil 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; } } }
Merci pour votre lecture.
Partager