为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

泛舟湖上清波郎朗 2022-01-19 17:19:56
我正在尝试开发一个自上而下的射击游戏。目前我正在从头开始做所有事情,因为我想更好地学习 Java。我现在的问题是碰撞检测。我正在使用 Rectangle.Intersects(如代码中所示)来确定玩家是否与墙壁相交。这几乎是完美的,除了当玩家仅在一个轴上碰撞(即撞到垂直墙壁)时,他们在两个方向上都被锁定。我想实现滑动以获得更流畅的游戏玩法。我对如何做到这一点有一点想法,这将涉及分别检查 x 和 y 平面。但是,我不知道这是否可以使用我目前的方法。我对 Java 有点陌生,所以我不太了解可以用来代替 Rectangle 的不同类型的库,但它们一直运行良好,我想坚持使用它们。如果有使用矩形的解决方案,那就太好了。如果没有,我愿意接受新的想法。谢谢。这是我正在使用的代码//x and y are position of player and vx and vy are the velocities in respective directionspublic 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 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

万一读到这篇文章的人很好奇,我创建了一个新函数来处理运动并将碰撞转换为布尔值,如果玩家与块(墙)碰撞,则返回 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;

    }


}

tick 方法也略有改变


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

}


查看完整回答
反对 回复 2022-01-19
  • 1 回答
  • 0 关注
  • 295 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号