Actionscript 3 AS3将丢弃的对象返回到初始位置

Actionscript 3 AS3将丢弃的对象返回到初始位置,actionscript-3,flash,drag-and-drop,Actionscript 3,Flash,Drag And Drop,我使用的代码从制作一个拖放装饰游戏。我试图使它这样,当被丢弃的对象被拖出目标位置(在我的例子中是形状的轮廓)时,它会回到初始位置。。。基本上颠倒了拖放过程。我一直在乱搞随机代码,到目前为止,这一行是最接近我想要的,但我不认为代码是正确的,它也没有返回到初始位置,它只是到舞台的一边 因此,我向stopDragObject添加了else if行,该行将对象从目标位置移除,但它会随机移动到舞台的一侧,而不是初始位置: private function stopDragObject(evt:MouseE

我使用的代码从制作一个拖放装饰游戏。我试图使它这样,当被丢弃的对象被拖出目标位置(在我的例子中是形状的轮廓)时,它会回到初始位置。。。基本上颠倒了拖放过程。我一直在乱搞随机代码,到目前为止,这一行是最接近我想要的,但我不认为代码是正确的,它也没有返回到初始位置,它只是到舞台的一边

因此,我向stopDragObject添加了else if行,该行将对象从目标位置移除,但它会随机移动到舞台的一侧,而不是初始位置:

private function stopDragObject(evt:MouseEvent):void {
        if (evt.target.hitTestObject(getChildByName(evt.target.name + "Target"))) {
            evt.target.x = getChildByName(evt.target.name + "Target").x;
            evt.target.y = getChildByName(evt.target.name + "Target").y;
            
        }  else if (evt.target.x = null) {
            evt.target.x = xPos;
            evt.target.y = yPos;
        }
        
        evt.target.stopDrag();
    }

解决了的 在阅读了下面的课程后,我最终得出了这个结论,它非常有效!(与本课不完全一样,但至少它是有效的…)


我添加了一个初始对象,因此该对象只能位于target或initial:)

我将尝试教授这两种方法,但都不提供代码

让我们画两个矩形:

var s1:Sprite = new Sprite()
var s2:Sprite = new Sprite()
with (s1)
{
    graphics.beginFill(0xfcaaaa, .7)
    graphics.drawRect(0, 0, 400, 400)
    graphics.endFill()
}
with (s2)
{
    graphics.beginFill(0x00aaaa, .7)
    graphics.drawRect(0, 0, 30, 30)
    graphics.endFill()
}
addChild(s1)
addChild(s2)
这不是很简单吗?您可以看到
s1
s2
大得多(尺寸:
400400
vs
3030
),现在将
s2
放在我们大
s1
的中心:

s2.x = 200;
s2.y = 200;
我们将使用
s1
作为
s2
移动的边界

此代码是拖动
s2
矩形(
Sprite
)的最简单解决方案:

现在,将
Sprite
返回起始位置的基本解决方案是:
hitTestObject
将返回true,前提是
Sprite s2
仍然位于
Sprite s1
区域。更有用的功能。让我们检查一下。通过以下方式更改onUp的功能:

function onUp(e:MouseEvent):void
{
    var s:Sprite = (e.currentTarget as Sprite);
    s.stopDrag();
    if (!s.hitTestObject(s1))
    {
        s.x = 200;
        s.y = 200;
    }
}
您可以看到,现在如果将
s2
s1
区域拖出,它将返回到起始位置


现在是主要部分:

var s1:Sprite = new Sprite()
var s2:Sprite = new Sprite()
addChild(s1)
addChild(s2)
with (s1)
{
    graphics.beginFill(0xfcaaaa, .7)
    graphics.drawRect(0, 0, 400, 400)
    graphics.endFill()
}
with (s2)
{
    graphics.beginFill(0x00aaaa, .7)
    graphics.drawRect(0, 0, 30, 30)
    graphics.endFill()
}
s2.x = 200;
s2.y = 200;
s2.addEventListener(MouseEvent.MOUSE_DOWN, onDown)
s2.addEventListener(MouseEvent.MOUSE_UP, onUp)

var startCoordinates:Dictionary = new Dictionary()

function onDown(e:MouseEvent):void
{
    var s:Sprite = (e.currentTarget as Sprite);
    startCoordinates[s] = { x: s.x, y: s.y };
    s.startDrag();
}

function onUp(e:MouseEvent):void
{
    var s:Sprite = (e.currentTarget as Sprite);
    s.stopDrag();
    if (!s.hitTestObject(s1))
    {
        s.x = startCoordinates[s].x;
        s.y = startCoordinates[s].y;
    }
    delete startCoordinates[s];
}
如果无法预测物体的起始位置,该怎么办?现在,当我们知道如何处理已知的坐标时,这就是挑战。我假设存在此功能的多个实现。最好的方法之一是在开始拖动时为拖动对象设置附加参数,例如
startingX
startingY
。例如,在我们的示例中,当调用
onDown
函数时。我猜你正在处理的是
Sprite
s或
MovieClip
s,但你没有能力做到这一点

让我们换一种方式使用
字典
对象
Dictionary
是一种传统的
哈希映射
,能够将对象用作键

散列映射是一种存储,您可以在其中放置由您提供的键映射的任何值。在ActionScript3中,我们将
对象
作为哈希映射的有限实现。为什么要用它?两个字,因为它简单快速。但是对于
对象
我们不能使用其他
对象
作为键,只能使用字符串和数字等

使用
字典
我们可以使用对象作为键。 让我们创建它:

var startCoordinates:Dictionary = new Dictionary();
要保存坐标,我们需要
x
y
属性


仅供参考:
newobject()
相当于
{}

var capitals:Object = new Object();
capitals['Italy'] = 'Rome';
相当于

var capitals:Object = {Italy: 'Rome'};

要保存当前位置,我们将使用以下代码:

var s:Sprite = (e.currentTarget as Sprite);
startCoordinates[s] = { x: s.x, y: s.y };
我们示例中的整个代码如下所示:

var s1:Sprite = new Sprite()
var s2:Sprite = new Sprite()
addChild(s1)
addChild(s2)
with (s1)
{
    graphics.beginFill(0xfcaaaa, .7)
    graphics.drawRect(0, 0, 400, 400)
    graphics.endFill()
}
with (s2)
{
    graphics.beginFill(0x00aaaa, .7)
    graphics.drawRect(0, 0, 30, 30)
    graphics.endFill()
}
s2.x = 200;
s2.y = 200;
s2.addEventListener(MouseEvent.MOUSE_DOWN, onDown)
s2.addEventListener(MouseEvent.MOUSE_UP, onUp)

var startCoordinates:Dictionary = new Dictionary()

function onDown(e:MouseEvent):void
{
    var s:Sprite = (e.currentTarget as Sprite);
    startCoordinates[s] = { x: s.x, y: s.y };
    s.startDrag();
}

function onUp(e:MouseEvent):void
{
    var s:Sprite = (e.currentTarget as Sprite);
    s.stopDrag();
    if (!s.hitTestObject(s1))
    {
        s.x = startCoordinates[s].x;
        s.y = startCoordinates[s].y;
    }
    delete startCoordinates[s];
}

非常感谢你,尽管我没有使用你教的方式,但它帮助我思考它将如何工作。如果这成功地回答了你的问题,请确保将其标记为已接受的答案(通过单击问题左上角附近的复选标记)。要将问题标记为已解决,请按“勾号”根据提供的答案解决您的问题(如果有)。我知道有这样的答案。
var s:Sprite = (e.currentTarget as Sprite);
startCoordinates[s] = { x: s.x, y: s.y };
var s1:Sprite = new Sprite()
var s2:Sprite = new Sprite()
addChild(s1)
addChild(s2)
with (s1)
{
    graphics.beginFill(0xfcaaaa, .7)
    graphics.drawRect(0, 0, 400, 400)
    graphics.endFill()
}
with (s2)
{
    graphics.beginFill(0x00aaaa, .7)
    graphics.drawRect(0, 0, 30, 30)
    graphics.endFill()
}
s2.x = 200;
s2.y = 200;
s2.addEventListener(MouseEvent.MOUSE_DOWN, onDown)
s2.addEventListener(MouseEvent.MOUSE_UP, onUp)

var startCoordinates:Dictionary = new Dictionary()

function onDown(e:MouseEvent):void
{
    var s:Sprite = (e.currentTarget as Sprite);
    startCoordinates[s] = { x: s.x, y: s.y };
    s.startDrag();
}

function onUp(e:MouseEvent):void
{
    var s:Sprite = (e.currentTarget as Sprite);
    s.stopDrag();
    if (!s.hitTestObject(s1))
    {
        s.x = startCoordinates[s].x;
        s.y = startCoordinates[s].y;
    }
    delete startCoordinates[s];
}