0

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

所以,我在 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();
    }

解决了

在阅读了下面的课程后,我最终得到了这个并且它完美地工作!(不完全像课程那样,但至少它有效......)

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

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

4

1 回答 1

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)

这不是很简单吗?您会看到它s1s2(dimenions: 400, 400vs 30, 30) 大得多现在放置s2到我们 big 的中心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将返回 true 。更多有用的功能在这里。让我们检查一下。以这种方式更改功能:Sprite s2Sprite s1onUp

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


现在主要部分:

如果无法预测物体的起始位置怎么办?现在,当我们知道如何处理已知坐标时,这就是挑战。我假设存在此功能的几种实现。最好的方法之一是设置附加参数,例如在开始拖动startingXstartingY为拖动对象设置参数。例如,在我们的示例中,当onDown函数被调用时。我猜你处理Sprites 或MovieClips 并且没有能力这样做。

让我们换一种方式使用Dictionary对象。Dictionary是一种Hash Map能够将对象用作键的传统方法。

哈希映射是一种存储,您可以在其中放置由您提供的键映射的任何值。在 actionscript 3 中,我们将ObjectHash Map 作为有限的实现。为什么要使用它?简而言之,因为它简单快捷。但是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();

为了保存坐标,我们需要xy属性。


仅供参考:new 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];
}
于 2013-08-08T22:19:35.187 回答