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

Flex Discussion :

Probleme avec Remove Element


Sujet :

Flex

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    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 : 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
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Bonjour et bienvenue sur le forum

    As tu essayé quelque chose de ce style ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.removeElement(IVisualElement(event.target));

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Par défaut
    Merci pour votre reponse, j'ai teste, j'ai eu cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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...?)

  4. #4
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Regarde ici (propriété target et currentTarget)

    Sinon pour supprimer, teste ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.removeElement(Mobs(event.target));

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Par défaut
    Encore merci, je viens de me rendre compte que le programme ne passe pas par le "onClick".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  6. #6
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Sur le CLICK de l'événement, teste ceci afin de voir sur quoi tu cliques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    protected function onClick(event:MouseEvent):void
    {
       Alert.show(getQualifiedClassName(event.target));
    }

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Par défaut
    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...

  8. #8
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    La classe Mobs est celle sur lequel tu ajoute l'événement CLICK ? Elle étend quelle autre classe ?

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Par défaut
    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 : 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
    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 : 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
    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.

  10. #10
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    ton :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    import flash.events.MouseEvent;

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  12. #12
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    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

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2011
    Messages : 7
    Par défaut
    Voici ce que j'ai tente:

    #dans Character.mxml(fonction onClick)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Alert.show(getQualifiedClassName(e.target));
    Gecko_part.deleteChar(e, this);
    #dans Gecko_part.mxml(qui contient la balise Application)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  14. #14
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Essaies ceci :

    Dans Application au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    charA.push(new characterPkg.Character);
    mettre :

    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
     
    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

Discussions similaires

  1. probleme avec l'element liste
    Par dhay06 dans le forum Forms
    Réponses: 3
    Dernier message: 28/09/2009, 14h54
  2. probleme avec fusion de 2 llc trié element par element !
    Par Tshik3StyLe dans le forum Débuter
    Réponses: 1
    Dernier message: 03/05/2009, 04h10
  3. [DW9] Probleme avec element PA
    Par max336 dans le forum Dreamweaver
    Réponses: 1
    Dernier message: 22/09/2008, 10h07
  4. [C#] Petit problème avec un élément du FAQ
    Par matech dans le forum ASP.NET
    Réponses: 11
    Dernier message: 24/01/2008, 14h11
  5. Probleme avec visibilite element inline sous IE
    Par nabab dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 15/06/2007, 14h28

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