ActionScript 3. 拖放游戏出错
ActionScript 3. Drag and drop game going wrong
我有一个用 ActionScript 3 编写的 flash 游戏,这里有 4 个项目应该被拖到特定的字段,将项目拖到任何字段时它工作正常(如果正确的字段 -项目获取字段的 x
、y
位置,如果字段错误 - 项目 returns 到他的固定位置)。
当我试图将项目放在其他项目上时出错(例如试图将 Item1
拖放到 Item2
上),它们改变了位置。如果我拖动 Item1
但它不 hitTestObject 正确的字段 它应该回到 Items1
的位置,但它会去 Item2
x
、y
位置和 Item2
到 Item1 x
、y
位置。
我正在使用以下代码:
private function getPosition(target:Object):void
{
xPos = target.x;
yPos = target.y;
}
private function dragObject(e:MouseEvent):void
{
getPosition(e.target);
e.target.startDrag();
trace("Started drag");
}
private function stopDragObject(e:MouseEvent):void
{
if (e.target.hitTestObject(e.currentTarget.parent[field])) {
e.target.x = (e.currentTarget.parent[field]).x;
e.target.y = (e.currentTarget.parent[field]).y;
} else {
e.target.x = xPos; //here is part where item get's back to his position
e.target.y = yPos; //seems that here is problem
}
}
我认为这是你的项目的深度问题(索引位置),因为,例如,当你将深度为 1 的项目拖到另一个索引为 5 的项目上时,你的 MouseEvent.MOUSE_UP
事件将是第二个对象而不是第一个,所以我认为您可以通过将当前项目的索引设置为项目容器中的最高索引来避免这种情况,如下所示:
function dragObject(e:MouseEvent):void {
var container:DisplayObjectContainer = DisplayObjectContainer(e.target.parent);
container.setChildIndex(DisplayObject(e.target), container.numChildren - 1);
// other instructions
}
编辑:
为了避免第二个问题(将 MouseEvent.MOUSE_UP
事件的目标定位在 (0, 0) 或最后一个拖动的对象下方),您可以使用布尔变量来指示您是在拖动一个项目还是不是:
var is_dragging:Boolean = false;
function dragObject(e:MouseEvent):void
{
is_dragging = true;
// other instructions
}
function stopDragObject(e:MouseEvent):void
{
if(!is_dragging) return;
// other instructions
is_dragging = false;
}
boolean var只是一种方式,你也可以初始化你的xPos
和yPos
,...
注意:要重现该问题,您只需单击舞台上的任意位置并将鼠标悬停在某个项目上,该项目将位于 (0, 0),因为xPos
和 yPos
未定义,但如果您已经拖动了其他项目,则该项目位于 (xPos
, yPos
),因此在您最后拖动的项目下方。
希望能帮到你。
我有一个用 ActionScript 3 编写的 flash 游戏,这里有 4 个项目应该被拖到特定的字段,将项目拖到任何字段时它工作正常(如果正确的字段 -项目获取字段的 x
、y
位置,如果字段错误 - 项目 returns 到他的固定位置)。
当我试图将项目放在其他项目上时出错(例如试图将 Item1
拖放到 Item2
上),它们改变了位置。如果我拖动 Item1
但它不 hitTestObject 正确的字段 它应该回到 Items1
的位置,但它会去 Item2
x
、y
位置和 Item2
到 Item1 x
、y
位置。
我正在使用以下代码:
private function getPosition(target:Object):void
{
xPos = target.x;
yPos = target.y;
}
private function dragObject(e:MouseEvent):void
{
getPosition(e.target);
e.target.startDrag();
trace("Started drag");
}
private function stopDragObject(e:MouseEvent):void
{
if (e.target.hitTestObject(e.currentTarget.parent[field])) {
e.target.x = (e.currentTarget.parent[field]).x;
e.target.y = (e.currentTarget.parent[field]).y;
} else {
e.target.x = xPos; //here is part where item get's back to his position
e.target.y = yPos; //seems that here is problem
}
}
我认为这是你的项目的深度问题(索引位置),因为,例如,当你将深度为 1 的项目拖到另一个索引为 5 的项目上时,你的 MouseEvent.MOUSE_UP
事件将是第二个对象而不是第一个,所以我认为您可以通过将当前项目的索引设置为项目容器中的最高索引来避免这种情况,如下所示:
function dragObject(e:MouseEvent):void {
var container:DisplayObjectContainer = DisplayObjectContainer(e.target.parent);
container.setChildIndex(DisplayObject(e.target), container.numChildren - 1);
// other instructions
}
编辑:
为了避免第二个问题(将 MouseEvent.MOUSE_UP
事件的目标定位在 (0, 0) 或最后一个拖动的对象下方),您可以使用布尔变量来指示您是在拖动一个项目还是不是:
var is_dragging:Boolean = false;
function dragObject(e:MouseEvent):void
{
is_dragging = true;
// other instructions
}
function stopDragObject(e:MouseEvent):void
{
if(!is_dragging) return;
// other instructions
is_dragging = false;
}
boolean var只是一种方式,你也可以初始化你的xPos
和yPos
,...
注意:要重现该问题,您只需单击舞台上的任意位置并将鼠标悬停在某个项目上,该项目将位于 (0, 0),因为xPos
和 yPos
未定义,但如果您已经拖动了其他项目,则该项目位于 (xPos
, yPos
),因此在您最后拖动的项目下方。
希望能帮到你。