使用 Rectangle.Intersects 进行碰撞检测会导致对象“粘”在表面上

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


我对如何做到这一点有一点想法,这将涉及分别检查 x 和 y 平面。但是,我不知道这是否可以使用我目前的方法。


我对 Java 有点陌生,所以我不太了解可以用来代替 Rectangle 的不同类型的库,但它们一直运行良好,我想坚持使用它们。


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


谢谢。


这是我正在使用的代码


//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);

}


泛舟湖上清波郎朗
浏览 296回答 1
1回答

蛊毒传说

万一读到这篇文章的人很好奇,我创建了一个新函数来处理运动并将碰撞转换为布尔值,如果玩家与块(墙)碰撞,则返回 true,如果与其他任何东西碰撞,则返回 false。我还更改了对块碰撞的检查,如代码中所示private boolean collision(double vx, double vy) {&nbsp; &nbsp; for(int i = 0; i< handler.object.size(); i++) {&nbsp; &nbsp; &nbsp; &nbsp; GameObject tempObject = handler.object.get(i);&nbsp; &nbsp; &nbsp; &nbsp; if(tempObject.getId() == ID.Block) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(new Rectangle((int)x+(int)vx,(int)y+(int)vy,31,31).intersects(tempObject.getBounds())) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return true;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if(tempObject.getId() == ID.Crate) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(getBounds().intersects(tempObject.getBounds())) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; main.ammo+=50;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; handler.removeObject(tempObject);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp;&nbsp; &nbsp; &nbsp; &nbsp; if(tempObject.getId() == ID.Enemy) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if(getBounds().intersects(tempObject.getBounds())) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; main.hp--;//TODO make it so you cant get stuck in enemies and they drain all your health&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return false;}和移动功能public void Move(double vx, double vy) {&nbsp; &nbsp; if(!collision(vx,vy)) {&nbsp; &nbsp; &nbsp; &nbsp; x+=vx;&nbsp; &nbsp; &nbsp; &nbsp; y+=vy;&nbsp; &nbsp; }}tick 方法也略有改变public void tick() {&nbsp; &nbsp;&nbsp;&nbsp; &nbsp; collision(vx,vy);&nbsp; &nbsp; vx = 0;&nbsp; &nbsp; vy = 0;&nbsp; &nbsp; //movement&nbsp; &nbsp; if(handler.isUp()) vy -=5;&nbsp; &nbsp; //else if(!handler.isDown()) vy = 0;&nbsp; &nbsp; if(handler.isDown()) vy += 5;&nbsp; &nbsp; //else if(!handler.isUp()) vy = 0;&nbsp; &nbsp; if(handler.isRight()) vx += 5;&nbsp; &nbsp; //else if(!handler.isLeft()) vx = 0;&nbsp; &nbsp; if(handler.isLeft()) vx -=5;&nbsp; &nbsp; //else if(!handler.isRight()) vx = 0;&nbsp; &nbsp; if(vx!=0||vy!=0){&nbsp; &nbsp; &nbsp; &nbsp; Move(vx,0);&nbsp; &nbsp; &nbsp; &nbsp; Move(0,vy);&nbsp; &nbsp; }&nbsp; &nbsp; //anim.runAnimation();}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java