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