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

带侧面检测的画布图像碰撞

杜俊楚
2023-03-14

这是我检测碰撞的代码,但它只适用于矩形:

function collide(r1, r2) {
var dx = (r1.x + r1.width / 2) - (r2.x + r2.width / 2);
var dy = (r1.y + r1.height / 2) - (r2.y + r2.height / 2);
var width = (r1.width + r2.width) / 2;
var height = (r1.height + r2.height) / 2;
var crossWidth = width * dy;
var crossHeight = height * dx;
var collision = 'none';

if (Math.abs(dx) <= width && Math.abs(dy) <= height) {
    if (crossWidth > crossHeight) {
        collision = (crossWidth > (-crossHeight)) ? 'bottom' : 'left';
    } else {
        collision = (crossWidth > -(crossHeight)) ? 'right' : 'top';
    }
}

return (collision);

}

共有1个答案

龚彬
2023-03-14

只要让你的碰撞代码适用于三角形,那么它将适用于所有形状!这是Javascript代码中的公式,主要来自这个问题。

function sign(p1, p2, p3) {
  return (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1]);
}

function inTriangle(point, trip1, trip2, trip3) {
  var b1 = sign(point, trip1, trip2) < 0.0;
  var b2 = sign(point, trip2, trip3) < 0.0;
  var b3 = sign(point, trip3, trip1) < 0.0;

  return  ((b1 == b2) && (b2 == b3));
}

有了这个代码,你只需要运行,inTriangle(p,v1,v2,v3),其中p是你测试的点,在碰撞检测中,这将是一个形状的每个角,用一个球或圆只是测试圆周上的一些点,v1;v2;v3 是您测试的三角形的三个点。

请记住,测试矩形的碰撞更有效,因此如果您有一个可以像矩形一样分割的形状,您应该这样做,而不是将其分割为三角形。

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

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

  • 我在游戏中使用libGDX库。I用于检测两个矩形之间碰撞检测的用户重叠方法。 我想检测矩形上的触摸侧(顶部、底部、左侧或右侧): 谁能给我这个代码,但这需要快速的方法。 谢啦

  • 我花了数小时寻找解决方案:我正在用libgdx开发一个自上而下的小游戏(可能这与我使用的引擎有关)。现在我必须在我的角色(圆形)和墙(矩形)之间实现碰撞检测。如果可以滑动,我希望角色在碰撞时沿着墙滑动。让我解释一下: 如果我向上移动45度,我可能会撞到墙的下面、左边或角落。 如果我与左边相撞,我想停止x运动,只向上移动。如果我离开墙壁,那么我想继续向上移动。与下侧相同(停止y运动) 如果我与角落相

  • 我下面的碰撞方法有问题。问题是当游戏中有两个敌人时。它与循环中的一个敌人相交,然后返回true进行碰撞。但是如果在这个数组列表中有第二个敌人,它将不会与第二个物体碰撞,因此导致它返回false,玩家继续行走。有什么办法可以让他在接触任何敌人时停下来,而不是因为他没有接触到所有的敌人而继续下去吗?谢谢,这是密码。

  • 我有一个玩家类,是一个马里奥角色。当我向左走时,我调用一个方法来启动左动画并设置速度。 现在我的问题是:如何为玩家制作碰撞矩形?这是我的矩形: