使用Rectangle.Intersects进行碰撞检测会导致对象“粘附”到曲面(Java)

时间:2018-11-14 01:21:16

标签: java

我正在尝试开发自上而下的射击游戏。目前,我想从头开始做所有事情,因为我想更好地学习Java。我现在的问题是碰撞检测。我正在使用Rectangle.Intersects(如代码所示)来确定玩家是否与墙壁相交。这几乎是完美的,只是当玩家仅在一个轴上碰撞(即撞入垂直的墙壁)时,他们在两个方向上都被锁定。我想实现滑动以使游戏更加流畅。

我对如何执行此操作有一点想法,这涉及分别检查x和y平面。但是,我不知道使用当前方法是否可以实现。

我对Java有点陌生,所以我对我可以使用的各种类型的库(而不是Rectangles)了解不多,但是它们运行良好,我希望坚持使用它们。

如果有使用Rectangles的解决方案,那就太好了。如果没有,我会接受新的想法。

谢谢。

这是我正在使用的代码

//x and y are position of player and vx and vy are the velocities in respective directions
public void tick() {
    x+=vx;
    y+=vy;

    collision();
    //movement
    //...
}
private void collision() {
    for(int i = 0; i< handler.object.size(); i++) {
        GameObject tempObject = handler.object.get(i);

        if(tempObject.getId() == ID.Block) {
            if(getBounds().intersects(tempObject.getBounds())) {
                x +=-vx;
                y +=-vy;
            }

        } //...
public Rectangle getBounds() {
    return new Rectangle((int)x,(int)y,32,32);
}

1 个答案:

答案 0 :(得分:0)

如果有人对此感到好奇,我制作了一个新的函数来处理运动并将碰撞转换为布尔值,如果玩家与块(墙)相撞,则返回true;如果与其他物体相撞,则返回false。

我还更改了代码块碰撞检查,如代码所示

private boolean collision(double vx, double vy) {
    for(int i = 0; i< handler.object.size(); i++) {
        GameObject tempObject = handler.object.get(i);
        if(tempObject.getId() == ID.Block) {
            if(new Rectangle((int)x+(int)vx,(int)y+(int)vy,31,31).intersects(tempObject.getBounds())) {
                    return true;
                }
            } 
        if(tempObject.getId() == ID.Crate) {
            if(getBounds().intersects(tempObject.getBounds())) {
                main.ammo+=50;
                handler.removeObject(tempObject);
            }
        }   
        if(tempObject.getId() == ID.Enemy) {
            if(getBounds().intersects(tempObject.getBounds())) {
                main.hp--;//TODO make it so you cant get stuck in enemies and they drain all your health
            }
        }
    }
    return false;
}

和移动功能

public void Move(double vx, double vy) {
    if(!collision(vx,vy)) {
        x+=vx;
        y+=vy;
    }

}

打勾方法也略有改变

public void tick() {    

    collision(vx,vy);

    vx = 0;
    vy = 0;
    //movement
    if(handler.isUp()) vy -=5;
    //else if(!handler.isDown()) vy = 0;

    if(handler.isDown()) vy += 5;
    //else if(!handler.isUp()) vy = 0;

    if(handler.isRight()) vx += 5;
    //else if(!handler.isLeft()) vx = 0;

    if(handler.isLeft()) vx -=5;
    //else if(!handler.isRight()) vx = 0;

    if(vx!=0||vy!=0){
        Move(vx,0);
        Move(0,vy);
    }
    //anim.runAnimation();
}