当前位置: 首页 > 知识库问答 >
问题:

Java 2D中的碰撞检测无法正常工作

司寇苗宣
2023-03-14

所以基本上在过去的一个半年龄里,我一直试图让这个盒子家伙(球员)当他与另一个盒子碰撞时,他停止向他与盒子碰撞的方向移动。它有点成功,但在看似随机的时刻,如果我向上移动并击中玩家左侧的盒子,它可能会溅入与之碰撞并飞下来的盒子。每个方向都是一样的。

public int checkCollision(ID id){
    for(int i = 0; i < handler.obj.size(); i++){ //Cycles through all the objects
        GameObject go = handler.obj.get(i); //Stores a temp GameObject
        if(go.getID() == id){ //Checks if the id matches and if so do the collision stuff.
            if(getBoundsT().intersects(go.getBounds())){
                System.out.println("collided top");
                y = go.getY() + go.getHeight();
                velY = 0;
                return 0; //Top side
            }
            if(getBoundsB().intersects(go.getBounds())){
                System.out.println("collided bottom");
                y = go.getY() - height;
                velY = 0;
                return 1; //Bottom side
            }
            if(getBoundsL().intersects(go.getBounds())){
                x = go.getX() + width;
                velX = 0;
                System.out.println("collided left");
                return 2; //Left Side
            }
            if(getBoundsR().intersects(go.getBounds())){
                System.out.println("collided right");
                x = go.getX() - width;
                velX = 0;
                return 3; //Right Side
            }
            if(getBounds().intersects(go.getBounds())){
                System.out.println("collided on all sides");
                return 4; //All the sides
            }
        }
    }
    return 5; //No Collision
}

checkCollision方法每秒调用60次。getBounds(l/r/u/d)函数只返回与字母对应的左、右、上(上)或下(下)侧的矩形。Id就是玩家正在碰撞的东西。在这个场景中,它是墙,所以不管它说什么id,它就是墙。(我已确保矩形不会超出它们应该的区域。)

我已经尝试了我能想到的一切,所以任何帮助将不胜感激!(这是我的第一个问题,抱歉,如果它写得很糟糕)

编辑:相交代码(getBounds) 这是所有对象继承的游戏对象类。

public Rectangle getBoundsB() {
        return new Rectangle((int)(x + (width/2) - (width/4)), (int)(y + height/2), (int)(width / 2), (int)(height / 2));
    }
    public Rectangle getBoundsT() {
        return new Rectangle((int)(x + (width/2) - (int)(width/4)), (int) y, (int)width / 2, (int)(height / 2));
    }
    public Rectangle getBoundsR() {
        return new Rectangle((int)(x + width - 5), (int)(y + 5), 5, (int)(height - 10));
    }
    public Rectangle getBoundsL() {
        return new Rectangle((int)x, (int)(y + 5), 5, (int)(height - 10));
    }

    public Rectangle getBounds() {
        return new Rectangle((int)x, (int)y, (int)width, (int)height);
    }

并且在刻度方法(每60秒调用一次)中:

checkCollision(ID.Wall);

共有1个答案

谷翰飞
2023-03-14

下图显示了矩形靠墙的 3 个边。如果我将矩形按在墙上,蓝绿线的左角接触到墙,红线接触到墙。所以发生的事情是,因为你首先检查顶部,它看到在那个点有一个交叉点,并且返回顶部交叉点的真而不是左。

我认为你可以通过修改你的上下限来解决这个问题。也许从你返回边界的宽度减去1。

 类似资料:
  • 我正在用pygame和数学模块用python编写一个游戏。我写了这些代码来进行碰撞检测(我制造了5个障碍物,我想让我的玩家与之碰撞),但问题是在玩游戏的过程中,有时有效,有时无效。 这些是我定义的碰撞函数 在while循环中 请告诉我哪里做错了。

  • 我正在制作我的第一个自由移动(不是瓷砖限制)2d游戏,想知道如何使用冲突检测。我有3种可能的方法在我的脑海中,但不确定什么是最有效的: > 地图上的每个物体都有一个比图像本身更小的纹理(例如,一棵树只有一个更小的纹理代表它的底部),不能碰撞。为此,我会使用第二个不可见的纹理来标记该区域。 每个对象都有一个用于碰撞的矩形或圆形区域。可能每个纹理都需要一个辅助文件,说明碰撞的大小(再次以树为例)。 我

  • 碰撞检测 现在你知道了如何制造种类繁多的图形对象,但是你能用他们做什么?一个有趣的事情是利用它制作一个简单的 碰撞检测系统 。你可以用一个叫做:hitTestRectangle 的自定义的函数来检测两个矩形精灵是否接触。 hitTestRectangle(spriteOne, spriteTwo) 如果它们重叠, hitTestRectangle 会返回 true。你可以用 hitTestRect

  • 本节暂未进行完全的重写,错误可能会很多。如果可能的话,请对照原文进行阅读。如果有报告本节的错误,将会延迟至重写之后进行处理。 当试图判断两个物体之间是否有碰撞发生时,我们通常不使用物体本身的数据,因为这些物体常常会很复杂,这将导致碰撞检测变得很复杂。正因这一点,使用重叠在物体上的更简单的外形(通常有较简单明确的数学定义)来进行碰撞检测成为常用的方法。我们基于这些简单的外形来检测碰撞,这样代码会变得

  • 我正在做一个类似生存的游戏,我有两种类型的碰撞,一种是玩家的敌人,另一种是敌人身上的子弹。我也有一个健康栏,由于某些原因,在picbox被移除后,健康仍然下降,就像敌人与玩家互动一样。 这是子弹碰撞代码的一个块(所有8个方向的所有代码都是相同的) 这是敌方与玩家碰撞的暗号

  • 所以我用Box2D在游戏中进行冲突检测。我有一个包含地形信息的地图:现在它只是一个有道路或草地的字符[][]。现在,在每个关卡开始时,我想创建矩形来描述不同的地形,但是我希望这些矩形得到优化,显然这需要相当多的算法。 我的第一个方法是在关卡开始时为地图上的每一个区块创建一个单独的地形。FPS降低到了5。 我的第二个想法是当玩家沿着地图移动时,简单地为地形创建不同的矩形,删除看不见的矩形。虽然它仍然