我使用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();
}
我添加了一个初始对象,因此该对象只能是目标或初始对象:)
答案 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
返回到起始位置。
现在主要部分:
怎么做,如果你不能预测物体的起始位置?现在,当我们知道如何处理已知的坐标时,这就是挑战。我假设存在这种功能的几种实现。最好的方法之一是设置其他参数,例如开始拖动时拖动对象的startingY
和onDown
。例如。在我们的示例中调用Sprite
函数时。我猜你在处理MovieClip
或Dictionary
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
要保存坐标,我们需要y
和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];
}
我们示例中的整个代码如下所示:
{{1}}