Actionscript 3 Flex-AS3带点的weired问题

Actionscript 3 Flex-AS3带点的weired问题,actionscript-3,apache-flex,Actionscript 3,Apache Flex,在我的flex项目中,我试图使用下面的代码将UICompletent的全局坐标转换为本地坐标 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,以不中断鼠标事件

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

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给出了否定的值。当我移动到uic的左上角时,我希望lp为0,0,但它给出了uic的-宽度。我打破了我的头好几个小时,最后找到了一个替代使用补偿。事实上,我的原始代码比这简单得多,这是同一个问题

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变量都相同,但很遗憾,lp2给出了错误的值,lp2和lp3给出了正确的值。我怀疑使用变量lp与此有关。我不确定,但上面证明了这一点,所以现在我使用的是lp2


有人知道为什么会有这种行为吗?是虫子吗?还是我监督了什么?

无可否认,在发表评论之前,我没有看你之前的问题:我认为你的问题似乎让人们很困惑。。。这可能是因为你把它们表现为完全抽象的行为

以上面的例子为例,我不确定你对全局方法的选择是否正确

我对globalToLocal的理解是,给定一个点和一个DisplayObject,globalToLocal将返回该点相对于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(uic组件)的局部坐标,而实际上您只返回鼠标位置相对于uic的值。然后你说:

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

谢谢,帕特里克。这里有两点我不明白。你所说的//x,y应该跟踪0,10,这是//点相对于形状的位置。x、 什么原因?点还是形状?因为点是10,20,形状是10,20秒1,我从你给出的var x:int=10例子中了解到,globaltocal将改变作为参数传递的点变量的值?在我的例子中,只要我把它传递给globalToLocal函数,gp就会改变吗?我将立即测试代码片段,在全局颜色转换后跟踪pt,得到0,-10,如表达式所示。在最后一行之后跟踪pt和pointToShape,我得到了0,-10 pt,与我预期的一样没有变化,-10,-40,这是我没有得到的。为什么pointToShape是-10,-40,在什么关系中?你是对的,我给fast写信,它应该输出0,-10。由于您将pt作为一个参数传递,因此更改pt的值将在逻辑上更改pointToShape的结果。哦,是的,我已经监督了我们实际上正在第二次传递新的pt,这是预期的。然而,我的情况却不一样。我正在切换鼠标儿童和uic的启用。我想这就是问题所在。