我试图使用下面的代码使用下面的代码将全局坐标转换为我的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。
有没有人知道为什么会出现这种行为?这是一个错误吗?还是我监督了什么?
答案 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.