Flex-AS3遇到了Point的问题

时间:2011-12-19 08:39:15

标签: actionscript-3 flex

我试图使用下面的代码使用下面的代码将全局坐标转换为我的flex项目中UIComplenent的本地坐标

var gp:Point = new Point(e.stageX,e.stageY);  //global point
var lp:Point = uic.globalToLocal(gp); //local point

uic是UIComponent,其中我有Sprite的子类来绘制东西

我已将精灵的mouseEnabled和mouseChildren设置为false,以免中断鼠标事件。

上面的代码是在uic的mousemove事件中,我在跟踪gp和lp gp给出了正确的值,令人惊讶的是lp给出了negetive值。当我将移动移动到uic的左上角时,我希望lp为0,0但是它给出了uic的-width。我打破了几个小时,最后通过使用补偿找到了替补。事实上,我的原始代码更简单,就像这个问题一样

var lp:Point = new Point(e.localX,e.localY);

我不确定究竟是什么导致了这个问题。解决方法有很多问题,并且在我的其余算法中造成混乱。

刚才我发现了更有趣的事情(实际上很奇怪)。出于某种原因,我去创建了一个新的lp2

var lp2:Point = new Point(e.localX,e.localY);

现在令人惊讶的是,它正如预期的那样提供了正确的值,我回过头来将代码更改为

var gp:Point = new Point(e.stageX,e.stageY);  //global point
var lp:Point = uic.globalToLocal(gp); //local point
var lp2:Point = new Point(e.localX,e.localY);
var lp2:Point = uic.globalToLocal(gp);

现在预计所有的lp,lp2和lp3变量都是相同的,但我们希望lp两个给出错误的值,lp2和lp3给出正确的。我怀疑使用变量lp有事可做。我不确定,但上面证明了它现在我正在使用lp2。

有没有人知道为什么会出现这种行为?这是一个错误吗?还是我监督了什么?

1 个答案:

答案 0 :(得分:0)

不可否认,在离开我的评论之前,我没有看过你之前的问题:)我认为你的问题似乎让人感到非常困惑......这可能是因为你把它们呈现为完全抽象的行为。

以上面的例子为例,我不确定你是否正确地采用了globalToLocal方法。

我对globalToLocal的理解是,给定Point和DisplayObject,globalToLocal将返回Point相对于DisplayObject的位置。

      var pt:Point = new Point ( 10, 20 ); // x, y in relation to the Stage
      var shape:Shape = new Shape();
      shape.x = 10;
      shape.y = 30;

      // x, y should trace 0 , 10 , which is the position of the 
      //point in relation to shape.
      pt = shape.globalToLocal(pt );

      //or if you prefer to declare a new variable
      var pointToShape:Point = shape.globalToLocal(pt ); 

在您的示例中,您声明您正在尝试获取uic的本地坐标,即UIComponent,而实际上您只返回与uic相关的Mouse位置的值。然后你说:

   "now it is expected to have all the lp, lp2 and lp3 variables to be the same "

不,因为你一直在重新声明变量:

   var lp2:Point = new Point(e.localX,e.localY);
   //the next declaration/statement cancels the previous one
   var lp2:Point = uic.globalToLocal(gp); 

请注意,一旦声明了变量,就没有必要在后续声明中重新声明它。在上面的例子中,两个lp2声明之间没有关系,你也可以写:

   var x:int = 10;
   x = 20;
   x = whatever;// each statement practically cancels the previous one.