我正在制作游戏并遇到了一个我无法弄清楚的问题。玩家是一艘船,船可以放下地雷(通过太空钥匙)。我在init()中创建了一个Mine()数组:
function initGame():void
{
level = 1;
player = new Player();
//Create an enemies array
enemies = new Array();
//Create a plane array
planes = new Array();
crates = new Array();
explosions = new Array();
mines = new Array();
var tempMine:MovieClip;
for(var i:Number = 1; i < 4; i++){
tempMine = new Mine();
mines.push(tempMine);
minesTxt.text = String(mines.length);
}
gameState = STATE_START_PLAYER;
rightKeyIsDown = false;
leftKeyIsDown = false;
upKeyIsDown = false;
downKeyIsDown = false;
trace(gameState);
}
我有一个叫做releaseKey()的函数来处理键盘事件,这里的地雷被添加到屏幕上:
function releaseKey(event:KeyboardEvent):void
{
var thisKey:uint = event.keyCode;
if (thisKey == Keyboard.RIGHT)
{
rightKeyIsDown = false;
}
if (thisKey == Keyboard.LEFT)
{
leftKeyIsDown = false;
}
if (thisKey == Keyboard.UP)
{
upKeyIsDown = false;
}
if(thisKey == Keyboard.SPACE){
var tempMine:MovieClip;
if(mines.length > 0){
tempMine = new Mine();
tempMine.y = player.y;
tempMine.x = player.x;
addChild(tempMine);
mines.length--;
minesTxt.text = String(mines.length);
}else if(mines.length == 0){
minesTxt.text = String(0);
}
}
}
我的碰撞检查功能出现问题。我得到一个TypeError:错误#2007:参数hitTestObject必须是非null。我想我创建地雷并将它们添加到阵列的方式存在问题,但我看不出问题出在哪里。
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]);
}
}
}
}
}
答案 0 :(得分:1)
只是想在处理显示对象时给出一条建议,这些显示对象也是在单独的数组中维护的。
我可以看到: - 您正在使用您制作的阵列解析对象(板条箱或敌人)。 - 您将它们从各自的显示列表中删除,但不要将它们从阵列中删除。
除非有将其保留在那里的目的,否则你应该建立一个同样从数组中删除它们的机制。例如,函数如:
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
[....]
}
拼接数组可能不是最优化的解决方案(链表应该更好),但对于小数组(数十,甚至数百),它应该没关系。
最后一件事......不从数组中删除对象将继续引用它们,这将使垃圾收集器跳过它们
希望它有所帮助。
- 米赫内亚