如何解决此碰撞检测错误?

时间:2018-01-24 17:14:29

标签: java

在这段代码中,我试图在敌人(不断移动)和玩家之间进行碰撞检测。我这样设定,以便敌人在被击中时会朝向对方方向。但是当两个人从不同的方向相互撞击时,就会出现一个错误:敌人会被困在玩家中,直到我移动他为止。我知道,我应该改变所以它远离玩家,而不是向相反的方向移动,但我不知道如何。请帮帮我!

public Enemy(float x, float y, ID id, Handler handler) {
    super(x, y, id);
    this.handler = handler;
    vely = -6;
    velx = -6;
}


protected void tick(LinkedList<Object> object) {
    x += velx;
    y += vely;
    if(x <= 0){
        if(velx < 0) velx = velx * -1;
    }
    if(y <= 0) {
        if(vely < 0) vely = vely * -1;
    }
    if(x >= 605){
        if(velx > 0) velx = velx * -1;
    }
    if(y >= 418) {
        if(vely > 0) vely = vely * -1;
    }

    collision();    
}

private void collision() {
    for(int i = 0; i < handler.object.size(); i++) {
        Object obj = handler.object.get(i);
        if(obj.getId()== id.Player) {
            if(getBound().intersects(obj.getBound())) {
                velx = velx * -1;
                vely = vely * -1;
            }
        }
    }
}


protected void render(Graphics g) {
    g.setColor(Color.BLACK);
    g.fillOval((int)x, (int)y, 30, 30);
}
public Rectangle getBound() {
    return new Rectangle((int)x, (int)y, 30, 30);
}

1 个答案:

答案 0 :(得分:0)

如果敌人位于玩家的左侧,则将敌人的velx设置为否定,否则为正。类似地,vely如果敌人高于玩家。

// on collision...
velx = Math.abs(velx);
vely = Math.abs(vely);
if ( enemy_left_of_player() )
    velx = -velx;
if ( enemy_above_player() )
    vely = -vely;

精确的左/上逻辑将取决于播放器的大小(它也是30像素?)