Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Flash/Flex > Flex
Flex Forum d'entraide sur la programmation Adobe Flex : applications Internet riches (RIA)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/01/2011, 13h18   #1
Invité de passage
 
Sakura
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Sakura

Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
Par défaut Probleme avec Remove Element

Bonjour,

Je suis nouvelle sur ce forum, j'ai fait des recherches mais je n'ai pas trouve de reponse donc je me permets de creer une nouvelle discussion. Si la question a ete deja postee, je m'en excuse d'avance.

Je debute dans la programmation avec Flex, cela fait a peu pres quelques semaines que j'ai commence.
A la base, j'ai un personnage (cree sous 3DSMAX) et les png pour les utiliser sous Flex. Mon but est de faire un pseudo-jeu avec mon personnage qui disparait (si possible avec des effets comme une explosion ou autre) lorsque l'on clique dessus. Le personnage, qui apparait a un intervalle donne sur l'ecran, parcourt l'ecran du bas vers le haut.
En gros, c'est comme un balloon shooter (?), avec des ballons qui grimpent et il faut les faire exploser en cliquant dessus. Je sais pas si c'est vraiment clair...

Bref, je suis arrivee jusqu'au point ou:
->Les "mobs" apparaissent bien en bas et grimpent jusqu'a sortir de l'ecran
->L'event onClick fait en sorte que la vitesse entre chaque "apparition" augmente (c'est pour que ca devienne de plus en plus difficile)

Mais je n'arrive pas a supprimer chaque element ("mobs") lorsque je clique dessus. J'ai tente un "removeElement(this)" mais ca ne change rien, rien n'est supprime.

Voici le code pour le lancement du jeu:
Code :
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
 
private function startGame(diff:int):void{
 
	this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
	switch (diff){
		case 0: 
			interval=100;
			break;
		case 1: 
			interval=40;
			break;
		case 2: 
			interval=20;
			break;
	}
	characterPkg.Character.setDifficulties(diff);
	if (nCHAR<1)
		nCHAR=1;
	else {
		for (var j:int=0; j<nCHAR; j++){
			delete charA[i];
		}
		this.removeAllElements();
		this.addElement(About);
		this.addElement(e);
		this.addElement(h);
		this.addElement(m);
 
		nCHAR=1;
	}
 
	for (var i:int=0; i<nCHAR; i++){
		//Declare new character instance
		var newChar:characterPkg.Character = new characterPkg.Character;
		//Add to array for easy reference
		charA.push(newChar);
		//Add to top level display container to make visible
		this.addElement(charA[i]);
		//Set position in window
		charA[i].x=Math.round(Math.random()*600);
		charA[i].y=this.height/2;
 
	}
 
}
Pour la fonction onClick, je n'ai que 2 lignes:
Code :
1
2
3
 
	this.removeElement(this);
	Character.speed=Character.speed+10;
Si je n'ai pas poste assez d'information, faites moi savoir, je serai ravie de completer.

Merci d'avance.
sk316 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2011, 19h58   #2
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour et bienvenue sur le forum

As tu essayé quelque chose de ce style ?

Code :
1
2
 
this.removeElement(IVisualElement(event.target));
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/01/2011, 23h47   #3
Invité de passage
 
Sakura
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Sakura

Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
Merci pour votre reponse, j'ai teste, j'ai eu cette erreur:

Code :
1180: Call to a possibly undefined method IVisualElement.
Je me suis renseigne sur le site de Adobe, je sais pas vraiment quelle fonction utiliser pour pouvoir get l'element. (avec le parametre event je suppose...?)
sk316 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2011, 10h24   #4
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Regarde ici (propriété target et currentTarget)

Sinon pour supprimer, teste ceci :

Code :
1
2
 
this.removeElement(Mobs(event.target));
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2011, 13h59   #5
Invité de passage
 
Sakura
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Sakura

Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
Encore merci, je viens de me rendre compte que le programme ne passe pas par le "onClick".
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
private function init():void{
//load all the images into an array for easier reference
//this is a bit nasty as I'm using it as untyped data
for (var i:int=0; i<this.numElements; i++) {
	imgA.push(this.getElementAt(i));
}
//Add a mouse click handler to this character:
this.addEventListener(MouseEvent.CLICK, onClick);
 
//Start walking by default
startWalk();
}
J'ai regarde sur internet, il y a beaucoup de tuto pour mx:script mais pas pour fx:script.
Est-ce qu'il y a une erreur dans mon init? J'ai egalement un onEnterFrame, il passe bien dedans (j'ai teste avec Alert).
Est-ce qu'il y a moyen de mettre en highlight la hitbox du character? Ca se trouve je clique pas sur le bon pixel?
sk316 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2011, 14h22   #6
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Sur le CLICK de l'événement, teste ceci afin de voir sur quoi tu cliques :

Code :
1
2
3
4
5
 
protected function onClick(event:MouseEvent):void
{
   Alert.show(getQualifiedClassName(event.target));
}
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2011, 14h23   #7
Invité de passage
 
Sakura
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Sakura

Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
Je l'ai teste mais j'ai meme pas eu de message d'alert (pas de pop-up). C'est la ou je me suis rendu compte que le programme passait pas par la...
sk316 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2011, 14h30   #8
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
La classe Mobs est celle sur lequel tu ajoute l'événement CLICK ? Elle étend quelle autre classe ?
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2011, 14h44   #9
Invité de passage
 
Sakura
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Sakura

Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
Desolee je me suis mal exprimee.
Quand j'ai appele "mobs" c'etait juste pour parler du mobile object.
Voici quelques details sur la structure de mon application.

->Premierement, je n'ai pas de classe. Je me suis basee sur les codes d'un autre programme (exactement les memes je pense) dans lequel le "onclick" marche tres bien.
->J'ai deux fichiers .mxml
#Gecko_part.mxml:
c'est celui qui ressemble le plus a un main (avec une fonction startGame)
#Character.mxml:
c'est celui qui contient les images png

Je post mon code vu que j'ai un peu du mal a expliquer avec des mots. Desolee d'avance, ce sera un peu long.

1.Gecko_part.mxml
Code :
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
 
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"   xmlns:s="library://ns.adobe.com/flex/spark" 
xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
applicationComplete="init();" xmlns:characterPkg="characterPkg.*">
 
<fx:Script>
	<![CDATA[
		//Get access to the Character component
		import characterPkg.Character;
 
		import mx.controls.Alert;
		public static var started:Boolean;
		public static var interval:int;
		private static var nCHAR:int = 0; //Number of Characters
		//var started:Boolean; (wanted to use to change the label the button)
		//var stopped:Boolean;
		private var ownTimer:int = 0;
		private function about():void{
		   var desc:String = "This Flash program shows how you can use ActionScript ";
		   Alert.show(desc, "About: "+ this.name);
		}
 
		//Decare array to keep characters in for ease of reference
		private var charA:Array=new Array;
 
		private function init():void{
			this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
			started=false;
		}
 
		private function onEnterFrame(e:Event):void{
			if (!started)
				return;
			ownTimer++;
			if (ownTimer > interval){
				ownTimer = 0;
				charA.push(new characterPkg.Character);
				nCHAR++;
	//Add to top level display container to make visible
				this.addElement(charA[nCHAR-1]);
				charA[nCHAR-1].x=Math.round(Math.random()*600);
				charA[nCHAR-1].y=this.height/1.5;
			}
			for (var i:int=0; i<nCHAR; i++){
				if (charA[i].y < 0) {
					delete(charA[i]);
					nCHAR--;
				}
			}
 
		}
 
		private function startGame(diff:int):void{
			//Alert.show('coucou');
			started = true;
			switch (diff){
				case 0: 
					interval=100;
					break;
				case 1: 
					interval=40;
					break;
				case 2: 
					interval=20;
					break;
			}
			characterPkg.Character.setDifficulties(diff);
			if (nCHAR<1)
				nCHAR=1;
			else {
				for (var j:int=0; j<nCHAR; j++){
					delete charA[i];
				}
				this.removeAllElements();
				this.addElement(About);
				this.addElement(e);
				this.addElement(h);
				this.addElement(m);
					nCHAR=1;
			}
 
			for (var i:int=0; i<nCHAR; i++){
				//Declare new character instance
				var newChar:characterPkg.Character = new characterPkg.Character();
				//Add to array for easy reference
				charA.push(newChar);
				//Add to top level display container to make visible
				this.addElement(charA[i]);
				//Set position in window
				charA[i].x=Math.round(Math.random()*600);
				charA[i].y=this.height/2;
 
			}
 
		}
 
 
	]]>
</fx:Script>
<s:Button  id="About" label="About" click="about();"  fontSize="18" right="10" top="10"/>
 
<s:Button id="e" label="Start Easy" click="startGame(0);" fontSize="24" right="10" top="50"/>
<s:Button id="m" label="Start Medium" click="startGame(1);" fontSize="24" right="10" top="100"/>
<s:Button id="h" label="Start Hard" click="startGame(2);" fontSize="24" right="10" top="150"/>
 
</s:Application>
2.Character.mxml
Code :
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
 
<?xml version="1.0" encoding="utf-8"?>
<s:Group xmlns:fx="http://ns.adobe.com/mxml/2009" 
		 xmlns:s="library://ns.adobe.com/flex/spark" 
		 xmlns:mx="library://ns.adobe.com/flex/mx" width="150" height="130"
		 creationComplete="init();">
<fx:Declarations>
</fx:Declarations>
 
<fx:Script> 
	<![CDATA[
		/*
		Basic flick-book animation component with with two behaviours	
		*/
		import mx.controls.Alert;
 
		private var frame:int=0;
		private static var speed:int=0;
		private var mode:int=0;
		private const WALK:int=1;
		private const FALL:int=2;
		private var imgA:Array=new Array;
		private function init():void{
			//load all the images into an array for easier reference
			//this is a bit nasty as I'm using it as untyped data
			for (var i:int=0; i<this.numElements; i++) {
				imgA.push(this.getElementAt(i));
			}
			//Add a mouse click handler to this character:
			this.addEventListener(MouseEvent.CLICK, onClick);
 
			//Start walking by default
			startWalk();
		}
		public static function setDifficulties(diff:int):void{
			switch (diff){
				case 0: speed=2;
					break;
				case 1: speed=5;
					break;
				case 2: speed=10;
					break;
			}
		}
		private function blankFrames():void{
			//set all images to invisible (except for the first one)
			for (var i:int=0; i < this.numElements; i++) imgA[i].visible=false;
		}
 
		private function onClick(e:Event):void{
			Alert.show('test');
				this.removeElement(Character(e.currentTarget));
 
			Character.speed=Character.speed*5;
 
		}
 
		private function onEnterFrame(e:Event):void{
			if (this.visible){
			  var img:Image;
			  switch (mode){		
				case WALK:
					// make current image invisible
					imgA[frame].visible=false;
					//Advance the frame
					frame++; if(frame>50) frame=0;
					//increment x position OF THIS COMPONENT
					//NOTE: I'm going to check for boundary condirions in this component's parent
					this.y-=speed;
					//make new image visible
					imgA[frame].visible=true;
					//img = this.getElementAt(frame) as Image; img.visible=true;				
					break;
 
				case FALL:
					// make current image invisible
					imgA[frame].visible=false;
					//Advance the frame
					frame++;  
					if(frame<=2) {
						// if another frame thenmake it visible
						imgA[frame].visible=true;
					}
					else {
						//if last frame, then leave visible and top animation
						imgA[frame-1].visible=true;
					this.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
					}
					break;
			}
			}
		}	
 
		public function startWalk():void{
			mode=WALK;
			frame=0;
			blankFrames();
			this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
 
		public function startFall():void{
			mode=FALL;
			frame=1;
			blankFrames();
			this.addEventListener(Event.ENTER_FRAME, onEnterFrame);
		}
 
	]]>
</fx:Script>
<mx:Image  source="characterPkg/pictures/slide0000.png" bottom="0" />
[...]	
</s:Group>
Merci beaucoup pour votre temps.
sk316 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2011, 14h59   #10
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
ton :

Code :
1
2
 
this.addEventListener(MouseEvent.CLICK, onClick);
s'applique sur un élément de type Group qui contient une multitude d'images constituant toutes ensemble un character c'est ca ?

Dans tous les cas, je pense que tu as oublié d'importer la classe d'événement MouseEvent dans Character.mxml :

Code :
1
2
 
import flash.events.MouseEvent;
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2011, 15h28   #11
Invité de passage
 
Sakura
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Sakura

Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
En effet, le group se compose de plusieurs images pour l'animation.
J'ai ajoute l'import, le message d'Alert s'affiche!! Merci beaucoup!

Mais le "character" est toujours visible, j'ai meme tente de mettre:

Code :
1
2
3
 
	Character(e.target).visible=false;
	this.removeElement(Character(e.target));
Je pense que c'est faux vu que cela ne change rien.

J'ai egalement essaye de changer la partie "onEnterFrame" lorsque le mode est FALL (dans le switch) mais je n'ai pas eu de resultat.

Maintenant, je sais que le click marche, meme si je dois bien viser le milieu du "character" mais la disparition ne se fait pas...
Je voulais aussi savoir est-ce qu'il y a un moyen d'etendre la hitbox?
sk316 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2011, 15h35   #12
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
En laissant seulement le Alert dans la méthode onClick, essaye de déplacer cette méthode dans le contenur parent qui est Application. Je pense que tu essayes de supprimer un composant à partir de ce même composant ce qui n'est pas possible.

Les événements se propageant vers le haut, tu doit pouvoir le catcher dans Application
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2011, 15h51   #13
Invité de passage
 
Sakura
Inscription : janvier 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Sakura

Informations forums :
Inscription : janvier 2011
Messages : 7
Points : 0
Points : 0
Voici ce que j'ai tente:

#dans Character.mxml(fonction onClick)
Code :
1
2
3
 
Alert.show(getQualifiedClassName(e.target));
Gecko_part.deleteChar(e, this);
#dans Gecko_part.mxml(qui contient la balise Application)
Code :
1
2
3
4
 
public static function deleteChar(e:Event, c:Character):void{
	c.removeElement(Character(e.target));
}
J'ai verifie que j'ai pas supprime des imports, tout est la mais le resultat est le meme.

Je suis vraiment reconnaissante pour votre aide, de plus tres rapide. Merci beaucoup encore.
sk316 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2011, 18h50   #14
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Essaies ceci :

Dans Application au lieu de :
Code :
1
2
 
charA.push(new characterPkg.Character);
mettre :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
import characterPkg.Character;
 
protected c:Character;
 
protected function onEnterFrame(e:Event):void
{
...
c = new Character();
c.addEventListener(MouseEvent.CLICK, onClick);
charA.push(c);
...
}
 
protected function onClick(event:MouseEvent)
{
   removeElement(Character(event.Target));
}
Sans oublier de faire les imports nécessaires
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h10.


 
 
 
 
Partenaires

Hébergement Web