Question

Quelqu'un peut-il me aider à comprendre ce qui suit?

Je crée quelques sprites au carré puis retirez le premier et afficher les coords. Le résultat est:

  (x=0, y=0, w=208, h=40) 0 208
  (x=42, y=0, w=166, h=40) 0 166

La coordonnée x est toujours 0, bien que la largeur a changé, getBounds affiche les valeurs correctes. Je me attends x à changer. En raison de la mauvaise valeur de x, globalToLocal et localToGlobal fonctionnent correctement.

Si vous cliquez quelque part sur le côté gauche du second rectangle (toujours visible) vous obtenez:

2 28 (x=2, y=28)

ce qui est bon pour rien. Les valeurs entre parenthèses doivent être en coords stade et ils ne sont pas.

Le code:

    public function test():void {
        var s:Sprite;
        var i:int;

        var arr:Array = new Array();
        for (i = 0; i < 5; ++i)
        {
            s = new Sprite();
            s.graphics.beginFill(0x999);
            s.graphics.drawRect(0, 0, 40, 40);
            s.graphics.endFill();
            s.x = i * 42;
            arr.push(s);
            addChild(s);
        }
        trace(this.getBounds(stage), x, width);
        removeChild(arr[0]); arr[0] = null;
        trace(this.getBounds(stage), x, width);
        addEventListener(MouseEvent.CLICK, click);
    }

    private function click(e:MouseEvent):void {
        trace(e.localX, e.localY, localToGlobal(new Point(e.localX, e.localY)));
    }
Était-ce utile?

La solution

Vous êtes confus sur deux points distincts, mais je pense qu'ils chaque tige d'une vue incomplète de la façon dont traite Flash avec des systèmes de coordonnées. Rappelons que chaque objet d'affichage porte autour de son propre système coord. Dans votre première question, les propriétés « de x » et de « y » d'un objet ne sont pas calculés dynamiquement pour refléter le coin supérieur gauche de l'objet, ils indiquent simplement l'emplacement de l'origine de cet objet, en ce qui concerne le système de coordonnées de son parent. Ainsi, la valeur « x » d'un objet ne changera pas simplement parce que le contenu de l'objet a changé -. Il change lorsque vous déplacez l'objet lui-même

Le problème avec votre coordonnées de la scène est que la méthode localToGlobal convertit les coordonnées du champ d'application dans laquelle il est appelé - et vous l'appelez du parent des rectangles, mais vous passez en coordonnées du système local à l'intérieur du rectangle. Stare qui suit un peu et il devrait donner un sens:

function click(e:MouseEvent):void {
    // bad - uses rectangle coords in scope of "this"
    //trace(e.localX, e.localY, localToGlobal(new Point(e.localX, e.localY)));
    // works - call localToGlobal from the scope of the rectangle
    trace( e.target.localToGlobal(new Point(e.localX, e.localY)));
    // alternately, call it from any scope with coordinates taken from that scope:
    trace( localToGlobal( new Point( mouseX, mouseY )));
    trace( e.target.localToGlobal( new Point( e.target.mouseX, e.target.mouseY )));
}

Mise à jour: Une partie de ce qui rend cette confusion est comment fonctionne bouillonnant événement dans AS3. Lire les premiers paragraphes de cet excellent article pour obtenir l'idée générale , puis comprendre que, dans cet exemple, les événements sont initialement émis à partir d'un rectangle (parce que c'est où le graphique qui a obtenu cliqué est), mais vous ne les attrapent comme ils barboter dans le champ où vous définissez votre auditeur. Alors e.target est le rectangle et e.currentTarget est la portée de votre auditeur. Ensuite, la dernière pièce du puzzle est de comprendre que e.localX et e.localY sont toujours dans le système de coordonnées de la cible d'origine de l'événement. (Ceci est parce qu'ils sont des propriétés de l'événement, et il ne serait pas logique pour eux de continuer à changer comme l'événement barboter la liste d'affichage.)

Comme note finale, si vous vous demandez comment les débutants à faire face habituellement avec ce genre de choses, la réponse est que les gens attachent généralement les auditeurs directement à l'objet d'affichage qui a le contenu graphique qui sera cliqué. Dans ce cas, e.target et e.currentTarget sera toujours le même, et la plupart des débutants ne seront pas besoin de comprendre tout cela.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top