2009-10-20 7 views
0

Je suis encore en train de travailler sur une programmation ActionScript assez simple (en Flex), et je suis un peu pris par les événements et les propriétés des objets.J'ai de la difficulté à mettre à jour les propriétés d'un objet dans le programme actionScript de base

J'ai trois fichiers ci-dessous, une application et deux composants. L'objectif de base est très simple - commencer avec deux toiles de localisation et une toile d'un joueur. Lorsque vous cliquez sur un canevas d'emplacement, le joueur mettra à jour ses coordonnées x et y sur ce canevas. Cliquer sur l'autre toile mettra alors à jour les coordonnées x et y du joueur. Répéter.

Je pense que je suis proche, mais je n'arrive pas à comprendre comment obtenir un clic dans location1 ou location2 pour renvoyer leurs coordonnées x et y respectives aux valeurs playerX et playerY. Toutes les suggestions sur cette question spécifique, ou même des suggestions plus larges pour accomplir ceci plus facilement, seraient grandes.

Voici mon dossier de candidature principal:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" 
    xmlns:ns1="components.*"> 

    <mx:Script> 
     <![CDATA[ 
      [Bindable] 
      private var playerX:int = 20; 
      [Bindable] 
      private var playerY:int = 20; 

      private function clickEventHandler(evt:Event):void 
      { 
       playerX = evt.x; 
       playerY = evt.y; 
      } 
     ]]> 
    </mx:Script> 

    <ns1:location x="139" y="168" id="location1" 
     playerMove="clickEventHandler(event)"/> 
    <ns1:location x="629" y="168" id="location2" 
     playerMove="clickEventHandler(event)"/> 
    <ns1:player x="{playerX}" y="{playerY}"/> 

</mx:Application> 

Voici mon "emplacement" composant:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" 
    width="200" height="200" 
    click="clickHandler()"> 
    <mx:Script> 
     <![CDATA[   
      import flash.events.Events 

      private function clickHandler():void 
      { 
       var moveClick:Event = new Event("playerMove"); 
       moveClick.x = target.x; 
       moveClick.y = target.y; 
       dispatchEvent(moveClick); 
      } 
     ]]> 
    </mx:Script> 

    <mx:Metadata> 
     [Event(name="playerMove")] 
    </mx:Metadata> 

</mx:Canvas> 

Et voici mon composant joueur:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" 
    width="50" height="100">  
</mx:Canvas> 

MISE À JOUR:

J'ai été en mesure de simuler l'effet désiré avec le code suivant:

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"> 

    <mx:Script> 
     <![CDATA[ 
      [Bindable] 
      private var playerX:int = 20; 
      [Bindable] 
      private var playerY:int = 20; 
     ]]> 
    </mx:Script> 

    <mx:Canvas x="139" y="168" id="location1" width="200" height="200" 
     click="playerX = location1.x, playerY = location1.y" backgroundColor="#F60D0D"/> 
    <mx:Canvas x="629" y="168" id="location2" width="200" height="200" 
     click="playerX = location2.x, playerY = location2.y" backgroundColor="#EDE513"/> 
    <mx:Canvas id="player1" x="{playerX}" y="{playerY}" 
     width="100" height="100" backgroundColor="#3458F5"/> 

</mx:Application> 

Maintenant, je suis en train de travailler modularisation pour atteindre mon véritable objectif final, qui est en vous assurant que je comprends comment les événements, les objets et les objets d'événement travail .

+0

Quelles sont les valeurs de evt.x et evt.y qui finissent avec? – CookieOfFortune

+0

CookieOfFortune, je ne peux même pas arriver à ce point car il ne me laissera pas compiler jusqu'à ce que j'ai résolu les erreurs que j'ai mentionnées ci-dessous dans la suggestion de Eric. – IanWhalen

Répondre

0

Vous devez définir une classe d'événements personnalisée appelée PlayerMove avec les propriétés x et y. et comme eric a dit, mettre les propriétés des bulles à true.

public class PlayerMove extends Event { 

     public static const PLAYER_MOVE : String = "playerMove"; 
     public var x : int; 
     public var y : int; 

     public function PlayerMove(x:int, y:int; type:String, bubbles:Boolean=true, cancelable:Boolean=false) { 
      super(type, bubbles, cancelable); 
      this.x = x; 
      this.y = y; 
     } 
} 

aussi, sur votre toile de joueur où vous avez le mx: Canvas xmlns: x = "http://www.adobe.com/2006/mxml" width = hauteur "200" = "200" click = "clickHandler()" vous devez ajouter l'événement mot-clé à la fonction comme clic = "clickHandler (event)" et même à votre fonction

private function clickHandler(event : MouseEvent) : void { 
    dispatchEvent(new PlayerMove(event.target.x, event.target.y, PlayerMove.PLAYER_MOVE)); 
}

cela devrait fonctionner

0

Vous ne faites pas bouillir l'événement, donc le document parent (l'application) ne l'entend pas.

Essayez de changer cette situation

var moveClick:Event = new Event("playerMove"); 

à ceci:

var moveClick:Event = new Event("playerMove", true); 

Le ajouté true définit la propriété bubbles de l'événement à true.

+0

Bien que ce soit probablement l'un de mes problèmes, Eric, ce n'est pas mon seul depuis le 'moveClick.x = target.x;' et la ligne juste après lui donne toutes les deux des erreurs 1119 et 1120. Je suppose que le problème est soit un du côté gauche, que moveClick n'a pas de paramètre 'x' ou 'y', ou du côté droit où 'target' ne fait pas référence au canvas lui-même comme je le veux . – IanWhalen

Questions connexes