这是主要课程:
public function Velocity() {
//int static var
trailspeed = 10;
shipspeed = 5;
//init ship//
ship = new Ship();
ship.x = 337;
ship.y = 216;
//int arrays
enemies = new Array();
//init starting state
score = 0;
health = 100;
//Events
addEventListener(Event.ENTER_FRAME, motion);
stage.addEventListener(KeyboardEvent.KEY_DOWN, keydown);
stage.addEventListener(KeyboardEvent.KEY_UP, keyup);
//init container and trail
_cont = new MovieClip();
//addChild
addChild(_cont);
addChild(ship);
timerset();
}
public function motion(e:Event){
//adding the trails
trail = new Trail();
trail.x = ship.x;
trail.y = ship.y;
_cont.addChild(trail);
checkcollision();
}
public function checkcollision(){
for(var _e:int = enemies.length - 1; _e >=0; _e--){
for(var _t:int = _cont.numChildren - 1; _t >=0; _t--){
if(enemies[_e].hitTestObject(_cont.getChildAt(_t))){
enemies[_e].remove();
return;
}
}
}
}
public function removeenemies(_e:Enemy){
for(var i in enemies){
if(enemies[i] == _e){
enemies.splice(_e);
}
}
}
这是敌人类:
public class Enemy extends MovieClip {
private var _speed:Number;
public function Enemy(ypos, speed) {
this.x = 550;
this.y = ypos;
_speed = speed;
addEventListener(Event.ENTER_FRAME, motion);
}
public function motion(e:Event){
this.x -= _speed;
checkoffscreen();
}
public function remove(){
MovieClip(parent).removeenemies(this);
MovieClip(parent).removeChild(this);
removeEventListener(Event.ENTER_FRAME, motion);
return;
}
public function checkoffscreen(){
if(this.x < 0){
MovieClip(parent).removeenemies(this);
MovieClip(parent).removeChild(this);
removeEventListener(Event.ENTER_FRAME, motion);
}
}
}
}
这里的问题是在2或3次成功的碰撞检测后,一个未被发现...因此机会就像2/3 ......我怎么能编程100%成功碰撞???请帮助
答案 0 :(得分:0)
我建议不要从内部删除对象,而是在isDead
内部使用简单的Enemy
布尔值,在循环通过敌人时在主类中检查是否isDead
设置为true,如果是,则从数组中删除该对象并将其从舞台中删除;不需要removeenemies()
。
回到你遇到的真正问题。你正在通过反向中的敌人列表做得很好,因为你确实希望删除一些对象,这当然会导致数组中条目的移位。
很难说这段代码有什么问题。我会说失去removeenemies()
。在Enemy
和Main
中移动任何碰撞测试,将所有内容保存在一个漂亮的线性update
函数中,如下所示:
public function update() {
for(var i:int = enemies.length - 1; i >=0; i--){
var enemy:Enemy = enemies[i];
enemy.checkCollision(); // Can set isDead = true;
if(enemy.isDead) {
enemies.splice(i);
removeChild(enemy);
}
}
}
答案 1 :(得分:0)
最后我找到了答案。 问题出在removeenemies功能
用splice(_e,1)替换splice(_e)解决了问题