AS3将对象丢弃到初始位置

时间:2013-08-08 20:24:53

标签: actionscript-3 flash drag-and-drop

我使用http://hub.tutsplus.com/tutorials/create-a-drag-and-drop-puzzle-in-actionscript-30--active-2920的代码制作拖放装饰游戏。我试图这样做,以便当被丢弃的对象被拖出目标位置(在我的情况下是形状的轮廓)时,它会回到初始位置...基本上反转拖放。我一直在乱用真正的随机代码,到目前为止,这条线是最接近我想要的但我不认为代码是正确的,它也没有回到初始位置,它只是走到舞台的一边

所以,我添加了else if行到stopDragObject,它将对象从目标位置移除,但它随机地转到舞台的一侧,而不是初始位置:

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();
    }

解决

在阅读了下面的课程之后,我最终得到了这个,它完美无缺! (不完全像课程一样,但至少它起作用......)

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 {
            evt.target.x = getChildByName(evt.target.name + "Int").x;
            evt.target.y = getChildByName(evt.target.name + "Int").y;
        }

        evt.target.stopDrag();
    }

我添加了一个初始对象,因此该对象只能是目标或初始对象:)

1 个答案:

答案 0 :(得分:1)

我会尽力教导不提供代码。

让我们绘制两个矩形:

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(维度:400, 400 vs 30, 30)现在将s2放在我们的s1的中心位置:

s2.x = 200;
s2.y = 200;

我们将s1用于s2移动的边界。

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

s2.addEventListener(MouseEvent.MOUSE_DOWN, onDown)
s2.addEventListener(MouseEvent.MOUSE_UP, onUp)

function onDown(e:MouseEvent):void
{
    (e.currentTarget as Sprite).startDrag();
}

function onUp(e:MouseEvent):void
{
    (e.currentTarget as Sprite).stopDrag();
}

现在,如果Sprite仍然位于hitTestObject区域内,则将Sprite s2返回到起始位置Sprite s1的基本解决方案将返回true。更多有用的功能here。让我们检查一下。以这种方式更改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,您会看到现在startingX返回到起始位置。


现在主要部分:

怎么做,如果你不能预测物体的起始位置?现在,当我们知道如何处理已知的坐标时,这就是挑战。我假设存在这种功能的几种实现。最好的方法之一是设置其他参数,例如开始拖动时拖动对象的startingYonDown。例如。在我们的示例中调用Sprite函数时。我猜你在处理MovieClipDictionary s并且没有能力这样做。

让我们走另一条路并使用Dictionary对象。 Hash Map是某种传统的Object,可以将对象用作键。

  

哈希映射是一种存储,您可以在其中放置由您提供的密钥映射的任何值。在动作脚本3中,我们将Object作为哈希映射的有限实现。为什么要用它?用两个词来说,因为它简单快捷。但是使用Objects,我们无法使用其他var sites:Object = new Object(); sites['stackoverflow'] = "http://stackoverflow.com/" trace(sites.stackoverflow) // outputs-> http://stackoverflow.com/ 作为键,只能使用字符串整数等。

Dictionary

使用var startCoordinates:Dictionary = new Dictionary(); ,我们可以使用对象作为键。 让我们创建它:

x

要保存坐标,我们需要ynew Object()属性。


仅供参考:{}相当于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];
}

我们示例中的整个代码如下所示:

{{1}}