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

使用布尔数组的碰撞检测?

幸越泽
2023-03-14

我目前正在尝试为2D游戏编写冲突检测方法,但我被卡住了。

相交()方法由经过敌人的玩家以及玩家和敌人的坐标调用。图像掩码对象具有一个 2 维布尔数组,该数组对应于子画面的掩码。面具缩放 4 倍,因为精灵在游戏中是 16x16 的,并且放大到 64x64。

public boolean intersects(ImageMask other, int tx, int ty, int ox, int oy) {
    boolean[][] otherMask = other.getMask();
    if ((tx+mask.length*4<ox)         // This checks if the sprites
            || ty+mask[0].length*4<oy // aren't close to each other.
            || ox+otherMask.length*4<tx
            || oy+otherMask[0].length*4<ty)
        return false;

    //This stuff isn't working.
    for (int i=0;i<mask.length;i++) {
        for (int j=0;j<mask[i].length;j++) {
            for (int k=0;k<otherMask.length;k++) {
                for (int l=0;l<otherMask[k].length;l++) {
                    if ((tx+i*4)<=(ox+k*4) && (tx+i*4+4)>=(ox+k*4)
                            && (ty+j*4)<=(oy+l*4) && (ty+j*4+4)>=(oy+l*4+2)
                            && mask[i][j] && otherMask[k][l]) {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}

这不太管用;有时它会按预期工作,但有时当实体不接触时,它会报告冲突,或者当实体相互重叠时,它不会报告冲突。如何修复此问题以使碰撞检测有效?

共有1个答案

邵劲
2023-03-14

if语句应为

if ((tx+i*4)<=(ox+k*4+4) && (tx+i*4+4)>=(ox+k*4)
        && (ty+j*4)<=(oy+l*4+4) && (ty+j*4+4)>=(oy+l*4+2)
        && mask[i][j] && otherMask[k][l])

此外,查看项目的其余部分,您在初始化图像掩码时弄乱了x和y。

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

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

  • 我正在尝试做一个平台游戏,其中没有斜坡。我正在尝试将碰撞检测降下来,但是我在pygame中找不到一种方法来获得哪一边与另一个Sprite发生了碰撞。有没有人能给我一个好的方法来做到这一点,那不是太庞大,但也能很好地工作在我的情况? 下面是我的玩家类: 我已经将它添加到我的player类中,每次播放器更新时我都运行它,并且它工作...差一点。 在平台顶部的碰撞起作用,在侧面的碰撞几乎总是起作用,除非

  • 我创建了这个函数,它在渲染循环中调用,以检测碰撞并移动玩家/相机(这是第一人称游戏)。碰撞是使用名为的CubeGeometry检测的,它被移动以匹配每帧的相机: 单击此处观看演示 WASD移动。跳跃空间(排序)。黑色立方体/矩形镜像x轴上的相机位置50。在立方体上检测到冲突。 基本上我对此有两个问题。我应该使用立方体的顶点来检测碰撞,还是使用面来检测?如果对象小于立方体,则不会检测到碰撞,因为它不

  • 所以我明白,我现在没有用最好的方式来编写这个代码;这是一种测试运行。我正在尝试使用矩形和intersects属性进行墙碰撞(抱歉,如果我没有使用正确的术语)。到目前为止,我有2个矩形在屏幕上。1玩家控制和游戏中与之冲突的其他玩家。当它们碰撞时,玩家停止移动。问题是,如果玩家试图移动到矩形,而他们已经碰撞,那么玩家不能在垂直于移动的任何方向移动,即如果玩家拿着右箭头键移动到矩形,那么他们不能向上或向

  • 我遵循Mozilla游戏开发教程,并在HTML5 Canvas和JS中制作了一个简单的突破游戏。 然而,我想放大画布,因为它有点小,所以我尝试了800x600画布。然后,我注意到对于这个新的画布大小来说,球有点慢。 最初在mozilla教程中,球的速度是2。我尝试使用3。因此,问题就来了。。。 当我使用每秒刷新60倍的requestAnimationFrame时,我们可以说我的球将每秒移动3 x