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

我的碰撞检测无法正常工作

壤驷子安
2023-03-14

我正在用pygame和数学模块用python编写一个游戏。我写了这些代码来进行碰撞检测(我制造了5个障碍物,我想让我的玩家与之碰撞),但问题是在玩游戏的过程中,有时有效,有时无效。

这些是我定义的碰撞函数

def collide1(binX, binY, playerX, playerY):
    distance = math.sqrt(math.pow(binX - playerX, 2) + math.pow(binY - playerY, 2))
    if distance == 27:
        return True
    else:
        return False


def collide2(snowX, snowY, playerX, playerY):
    distance = math.sqrt(math.pow(snowX - playerX, 2) + math.pow(snowY - playerY, 2))
    if distance == 27:
        return True
    else:
        return False


def collide3(glacierX, glacierY, playerX, playerY):
    distance = math.sqrt(math.pow(glacierX - playerX, 2) + math.pow(glacierY - playerY, 2))
    if distance == 27:
        return True
    else:
        return False


def collide4(boardX, boardY, playerX, playerY):
    distance = math.sqrt(math.pow(boardX - playerX, 2) + math.pow(boardY - playerY, 2))
    if distance == 27:
        return True
    else:
        return False


def collide5(iceX, iceY, playerX, playerY):
    distance = math.sqrt(math.pow(iceX - playerX, 2) + math.pow(iceY - playerY, 2))
    if distance == 27:
        return True
    else:
        return False

在while循环中

# Collision Detection
collision1 = collide1(binX, binY, playerX, playerY)
collision2 = collide2(snowX, snowY, playerX, playerY)
collision3 = collide3(glacierX, glacierY, playerX, playerY)
collision4 = collide4(boardX, boardY, playerX, playerY)
collision5 = collide5(iceX, iceY, playerX, playerY)

if collision1:
    print("You have collided!")
elif collision2:
    print("You have collided!")
elif collision3:
    print("You have collided!")
elif collision4:
    print("You have collided!")
elif collision5:
    print("You have collided!")

请告诉我哪里做错了。

共有2个答案

和魁
2023-03-14

现在,只有当距离正好为27时,才会发生碰撞。如果你假设球,如果它们小于27像素,你仍然可以认为它们是“碰撞”的。

因此,将所有距离替换为如果距离

另外需要注意的是,计算平方根的速度非常慢。检查距离的平方要快得多

郗河
2023-03-14

实际上,您只是检查玩家是否碰到障碍物,但是如果玩家穿过障碍物,您将错过碰撞。如果距离

def collide(x1, y1, x2, y2):
    distance = math.sqrt(math.pow(x1 - x2, 2) + math.pow(y1 - y2, 2))
    if distance <= 27:
        return True
    else:
        return False

该功能可进一步简化:

def collide(x1, y1, x2, y2):
    distance = math.hypot(x1 - x2, y1 - y2)
    return distance <= 27

使用循环进行碰撞测试:

obstacles = [(binX, binY), (snowX, snowY), (glacierX, glacierY), (boardX, boardY), (iceX, iceY)]

for x, y in obstacles:
    collision = collide(x, y, playerX, playerY)
    if collision:
        print("You have collided!")

 类似资料:
  • 所以基本上在过去的一个半年龄里,我一直试图让这个盒子家伙(球员)当他与另一个盒子碰撞时,他停止向他与盒子碰撞的方向移动。它有点成功,但在看似随机的时刻,如果我向上移动并击中玩家左侧的盒子,它可能会溅入与之碰撞并飞下来的盒子。每个方向都是一样的。 checkCollision方法每秒调用60次。getBounds(l/r/u/d)函数只返回与字母对应的左、右、上(上)或下(下)侧的矩形。Id就是玩家

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

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

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

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

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