一些碰撞没有响应

时间:2014-11-28 19:27:45

标签: actionscript-3 flash

我正在开发一款游戏;它就像一个横向飞行的航天器,敌人的工艺品正好相反。敌人只有在与飞船的踪迹相撞时才会被摧毁。

这是主要课程:

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%成功碰撞???请帮助

2 个答案:

答案 0 :(得分:0)

我建议不要从内部删除对象,而是在isDead内部使用简单的Enemy布尔值,在循环通过敌人时在主类中检查是否isDead设置为true,如果是,则从数组中删除该对象并将其从舞台中删除;不需要removeenemies()

回到你遇到的真正问题。你正在通过反向中的敌人列表做得很好,因为你确实希望删除一些对象,这当然会导致数组中条目的移位。

很难说这段代码有什么问题。我会说失去removeenemies()。在EnemyMain中移动任何碰撞测试,将所有内容保存在一个漂亮的线性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)解决了问题