我有一个for循环,可以检测敌人是否击中子弹或玩家。那些命中测试工作正常,但当敌人离开舞台时,我无法弄清楚如何从阵列中移除敌人。
这是for循环
for (var i:int = _enemies.length - 1; i >= 0; i--){
for(var j:int = _bullets.length - 1; j >= 0; j--){
if(_bullets[j] != null && _enemies[i] != null){
//Check if bullet hits enemy
if(_bullets[j].hitTestObject(_enemies[i])){
//Tells enemy he's hit
if (_enemies[i] != null && _bullets[j] != null){
_enemies[i].isHit(_bullets[j].getType());
if(_enemies[i].getHealth() <= 0){
_enemies.splice(i, 1);
}
}
//removes bullet
if(_bullets[j] != null){
if (_bullets[j].parent) {
_bullets[j].parent.removeChild(_bullets[j]);
_bullets.splice(j, 1);
}
}
if(_bullets[j] != null){
if(_bullets[j].x > _stage.stageHeight){
if (_bullets[j].parent) {
_bullets[j].parent.removeChild(_bullets[j]);
_bullets.splice(j, 1);
}
}
else{
_bullets.splice(j, 1);
}
}
}
//Check if player hit
else if(_enemies[i] != null && _player != null){
if(_enemies[i].hitTestObject(_player)){
if (_enemies[i] != null){
_enemies[i].isHit("player");
_enemies.splice(i, 1);
}
else if (_enemies[i] == null){
_enemies.splice(i, 1);
}
}
}
if (_enemies[i] != null){
if(_enemies[i].isDead == true){
_enemies.splice(i, 1);
}
}
else if(_enemies[i] != null){
if(_enemies[i].x < 0){
_enemies.splice(i, 1);
}
}
if(_stage.contains(_enemies[i])){
}
else{
_enemies.splice(i, 1);
}
}
}
}
_stage是主要阶段的舞台参考。
答案 0 :(得分:0)
您正在移除子弹
_bullets[j].parent.removeChild(_bullets[j]);
类似地
_enemies[i].parent.removeChild(_enemies[i]);
当对象x或y属性超出阶段边界
时,有条件地使用它例如,假设敌人的坐标从0,0开始
// _enemies[i].x > stage.stageWidth
// _enemies[i].y > stage.stageHeight
// _enemies[i].x +_enemies[i].width < 0
// _enemies[i].y + _enemies[i].height < 0
虽然更好的方法是向敌人类添加一个方法,首先删除其显示列表中的每个子节点。之后,你可以将它从舞台上移除最后是数组的引用。
要删除数组引用,只需将数组元素设置为null,
_enemies[i] = null;
垃圾收集器将负责从内存中删除未引用的对象。