Arrays Actionscript冲突不工作
我正在做一个游戏,遇到了一个我一直无法解决的问题。玩家是一只船,船可以投水雷(通过空格键)。我在init()中创建了一个Mine()数组: 问题出现在我的碰撞检查功能中。我得到一个TypeError:Error#2007:参数hitTestObject必须为非null。我想我创建地雷并将其添加到阵列中的方式存在问题,但我看不出问题出在哪里Arrays Actionscript冲突不工作,arrays,actionscript,collision,Arrays,Actionscript,Collision,我正在做一个游戏,遇到了一个我一直无法解决的问题。玩家是一只船,船可以投水雷(通过空格键)。我在init()中创建了一个Mine()数组: 问题出现在我的碰撞检查功能中。我得到一个TypeError:Error#2007:参数hitTestObject必须为非null。我想我创建地雷并将其添加到阵列中的方式存在问题,但我看不出问题出在哪里 function testCollisions():void { var tempEnemy:MovieClip; var tempCrate
function testCollisions():void
{
var tempEnemy:MovieClip;
var tempCrate:MovieClip;
var tempMine:MovieClip;
enemy:for (var i:int=enemies.length-1; i>=0; i--)
{
tempEnemy = enemies[i];
for (var j:int=crates.length-1; j>=0; j--)
{
tempCrate = crates[j];
if (tempEnemy.hitTestObject(tempCrate))
{
if (crates[j].parent)
{
crates[j].parent.removeChild(crates[j]);
}
break enemy;
}
if (tempEnemy.hitTestObject(player))
{
if (player.parent)
{
trace("Hit!!!!!!!!!!!!!!!!!!!!");
makeExplosion(player.x, player.y);
player.parent.removeChild(player);
}
break enemy;
}
tempMine=mines[i];
if (tempEnemy.hitTestObject(tempMine))
{
if (tempEnemy.parent)
{
trace("BOOM!!!!!!!!!!!!!!!!!!!!");
makeExplosion(tempEnemy.x, tempEnemy.y);
player.parent.removeChild(tempEnemy);
}
break enemy;
}
if (player.hitTestObject(tempCrate))
{
if (crates[j].parent)
{
crates[j].parent.removeChild(crates[j]);
}
}
}
}
}
我只想给你一条建议,当你处理显示对象的时候,你也会在不同的数组中维护它们 我可以看到: -您正在使用自己制作的数组分析对象(板条箱或敌人)。 -您可以将它们从各自的显示列表中删除,但不会将它们从阵列中删除 您应该建立一种机制,将它们从阵列中移除,除非有目的将它们保留在阵列中。例如,函数如下:
function RemoveCrate(index) : void
{
crates[index].parent.removeChild(crates[index]); /// remove from display list
crates.splice(index, 1); /// remove reference from the array;
}
我没有像你那样故意检查父级,因为我假设它应该有一个父级,如果没有,我想抛出一个错误,因为这意味着我的其余代码有问题
另外,如果您正在解析数组并删除元素,而没有在删除时中断迭代,则还应按如下方式减少迭代器:
for(var i:int = 0; i < crates.length; i++)
{
[....]
RemoveCrate(i);
i --; // not doing this after deletion will skip one element in the next iteration
[....]
}
for(变量i:int=0;i
拼接阵列可能不是最优化的解决方案(链表应该更好),但对于小型阵列(十个,甚至数百个),这并不重要
最后一件事。。。不从数组中删除对象将保留对它们的引用,这将使垃圾收集器跳过它们
希望能有帮助
--
米娜明白了。我创建了两个阵列,一个用于库存地雷,一个用于板上地雷。这似乎解决了问题。啊,谢谢米娜。这是一个很好的建议,我会记住的。
function RemoveCrate(index) : void
{
crates[index].parent.removeChild(crates[index]); /// remove from display list
crates.splice(index, 1); /// remove reference from the array;
}
for(var i:int = 0; i < crates.length; i++)
{
[....]
RemoveCrate(i);
i --; // not doing this after deletion will skip one element in the next iteration
[....]
}