Flash:获取 e.currentTarget 的绝对位置

Flash: get absolute position of e.currentTarget

好的,不确定标题。 但这是我想要实现的目标:

基本上我正在尝试做一些类似于测验的事情,您可以在其中将答案拖放到一个字段中。如果它们是正确的,它应该捕捉答案字段的位置。

应该是

if(myobject.hitTestObject(targetField) && isCorrectAnswer()) {
   myobject.x = targetField.x;
   myobject.y = targetField.y;
}

但这并没有真正起作用。

这就是我所拥有的:

/**
* Generating dragable answer fields based on an array.
**/

function generateAnswer():void {

// creating text format
var myFormat:TextFormat = new TextFormat(); 

myFormat.color = 0x0066FF;    
myFormat.size = 24;  
myFormat.align = TextFormatAlign.CENTER 

// reference array to store all textfields
var referenceArray:Array = new Array();

// iterate through all answers in vocabListItems and generate textfields
var i:int; 

for (i = 0; i < vocabListItems.length; i++) { 
    var answerField:TextField = new TextField();   
    // Setting text to current answer
    answerField.text = vocabListItems[i];    
    answerField.width = 140;    
    answerField.height = 40;    
    answerField.x = 60+ i*150;    
    answerField.y = 410;  
    answerField.background = true;
    answerField.backgroundColor = 0xffffff;
    answerField.setTextFormat(myFormat);  
    answerField.selectable = false;
    answerField.type = TextFieldType.DYNAMIC

    // store the textfield in a container so drag and drop
    // will work
    var textContainer:Sprite = new Sprite();
    textContainer.addChild(answerField);
    addChild(textContainer);
    referenceArray.push(textContainer);
}

for each (var item in referenceArray) {
    item.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
    item.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
}
}

然后我开始拖动

var start_x:Number;
var start_y:Number;

function startDragging(e: MouseEvent):void {

  var object = e.currentTarget;
  start_x = e.currentTarget.x;
  start_y = e.currentTarget.y;
  object.startDrag();
}

然后我停止拖拽

function stopDragging(e:MouseEvent):void {
e.currentTarget.stopDrag();

if (e.currentTarget.hitTestObject(targetField)) {
    e.currentTarget.x = targetField.x;
    e.currentTarget.y = targetField.y;

} else {
    e.currentTarget.x = start_x;
    e.currentTarget.y = start_y;
}
}

所以问题是,e.currentTarget.x 是从 0 开始的。而不是从屏幕上的绝对位置开始。它始终是一个相对值,所以如果我将它拖到 targetField,它的 x 和 y 类似于 -100、-40

如果我将它设置为 targetField x 和 y,它就会消失在屏幕的必杀技中。

targetField 在这种情况下只是在舞台上绘制的一个 x 和 y 为 160 的矩形

如何将它定位到绝对 x 和 y?

这是截图

所以顶部字段是 targetField,它只是一个 x 161 和 y 191 的矩形。

底部的字段是 e.currentTarget 的可拖动字段。但是 currentTarget.x 始终为 0。

编辑

你的 e.currentTarget 将成为 textContainer,你没有设置 x/y 所以它自然会是 0。

移动容器似乎更有意义,而不是在创建容器时移动实际的文本字段,如下所示:

for (i = 0; i < vocabListItems.length; i++) { 
    var answerField:TextField = new TextField();   
    // Setting text to current answer
    answerField.text = vocabListItems[i];    
    answerField.width = 140;    
    answerField.height = 40;    
    //answerField.x = 60+ i*150;      //don't move the text field, move the container later
    //answerField.y = 410;  
    answerField.background = true;
    answerField.backgroundColor = 0xffffff;
    answerField.setTextFormat(myFormat);  
    answerField.selectable = false;
    answerField.type = TextFieldType.DYNAMIC

    // store the textfield in a container so drag and drop
    // will work
    var textContainer:Sprite = new Sprite();
    textContainer.x = 60+ i*150;
    textContainer.y = 410;

    textContainer.addChild(answerField);
    addChild(textContainer);
    referenceArray.push(textContainer);

    //Also, as an aside, there is no reason to loop through the array after this, just add the listeners here
    textContainer.addEventListener(MouseEvent.MOUSE_DOWN, startDragging);
    textContainer.addEventListener(MouseEvent.MOUSE_UP, stopDragging);
}

结束编辑


要将坐标从一个对象转换到另一个对象,您可以使用显示对象的 localToGlobalglobalToLocal 方法。

像这样:

var globalPoint:Point = targetField.localToGlobal(new Point());
var destinationLocalPoint:Point = e.currentTarget.parent.globalToLocal(globalPoint);

e.currentTarget.x = destinationLocalPoint.x;
e.currentTarget.y = destinationLocalPoint.y;

我在这里所做的,首先是获取 targetField 的全局坐标。所以它相对于 targetField 取一个点(在 0,0)并将其转换为相对于 stage.

然后我正在制作一个新的 Point 对象,它采用该全局坐标集,并将其转换为 e.currentTarget 的父对象。