我有一个数组,其中我持有每隔一秒钟从舞台顶部落下的影片剪辑。影片剪辑名为acorn
,这就是我如何将它设置为舞台上的橡子阵列落下的地方:
private function addAcorn():void
{
TweenLite.delayedCall(acornNumber, addAcorn);
var newAcorn = new mcAcorn;
addChild(newAcorn);
aAcornArray.push(newAcorn);
}
在我的输入框架事件监听器中我有checkAcornHitSquirrel();
以下是我设置函数的方法:
private function checkAcornHitSquirrel():void
{
for (var i:int = 0; i < aAcornArray.length; i++)
{
var currentAcorn:mcAcorn = aAcornArray[i];
if (currentAcorn.hitTestObject(squirrel))
{
//Have Current Acorn Stack on Squirrel mouth and have mouth expand
acorn = currentAcorn;
currentAcorn.addEventListener(Event.ENTER_FRAME, trackAcorn);
//aAcornArray.splice(i, 1);
trace("SQUIRREL_ACORN_HIT_TEST");
}
}
}
我有Enter Frame事件trackAcorn
所以当玩家移动时,橡子随玩家移动。这是函数:
private function trackAcorn(e:Event):void
{
acorn.x = squirrel.x;
acorn.y = squirrel.y - 50;
}
所以我的主要想法是实现双循环而不是1 for循环。但不确定这是否是最好的方法或如何真正实现它。如果你明白我想要做什么,请帮助我真的很感激。
这就是我尝试的但是只有两个橡子相互堆叠,其他橡子通过:/
private function checkAcornHitSquirrel():void
{
for (var i:int = 0; i < aAcornArray.length; i++)
{
var currentAcorn:mcAcorn = aAcornArray[i];
for (var j:int = 0; j < aAcornArray.length; j++)
{
var stackAcorn:mcAcorn = aAcornArray[j];
if (currentAcorn.hitTestObject(squirrel))
{
//Have Current Acorn Stack on Squirrel mouth and have mouth expand
currentAcorn.x = squirrel.x;
currentAcorn.y = squirrel.y;
currentAcorn.stopAcorn();
//aAcornArray.splice(i, 1);
trace("SQUIRREL_ACORN_HIT_TEST");
}
if (currentAcorn.hitTestObject(stackAcorn) && currentAcorn.hitTestObject(squirrel) )
{
stackAcorn.x = currentAcorn.x;
stackAcorn.y = currentAcorn.y - 30;
}
}
}
}
答案 0 :(得分:1)
我认为您的问题是acorn
中对trackAcorn
的引用。此变量不再引用添加eventListener时所执行的相同橡子,因为它在for循环的每次迭代中都会更改。
你可以有一个单独的for循环遍历连接到松鼠的所有橡子。您只需要附加和未附加橡子的单独列表。我猜这是你的意思&#34;双循环&#34;
您还可以创建一个新的Acorn类,其中包含对MovieClip的引用和用于移动它的逻辑。这将更加面向对象,并使更明显的橡树被移动到哪里。