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);
}
结束编辑
要将坐标从一个对象转换到另一个对象,您可以使用显示对象的 localToGlobal
和 globalToLocal
方法。
像这样:
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
的父对象。
好的,不确定标题。 但这是我想要实现的目标:
基本上我正在尝试做一些类似于测验的事情,您可以在其中将答案拖放到一个字段中。如果它们是正确的,它应该捕捉答案字段的位置。
应该是
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);
}
结束编辑
要将坐标从一个对象转换到另一个对象,您可以使用显示对象的 localToGlobal
和 globalToLocal
方法。
像这样:
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
的父对象。