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

Pygame-在两个矩形之间的碰撞中找到哪边击中[重复]

长孙正卿
2023-03-14
if self.bullet.rect.collidelist(self.listbox):
            self.bullet.pretx1 = 1
            self.bullet.pretx2 = 1
            self.bullet.prety = 1
            self.bullet.pret = 1
            for box in self.listbox:
                if box.rect.collidepoint(self.bullet.rect.midtop) or box.rect.collidepoint(self.bullet.rect.midbottom) and self.a == 1:
                    self.a = 0
                    print("vertical")
                    print(self.bullet.angle)
                    self.bullet.angle = abs(360 - self.bullet.angle)
                    print(self.bullet.angle)
                    self.listbox.remove(box)
                elif box.rect.collidepoint(self.bullet.rect.midleft) or box.rect.collidepoint(self.bullet.rect.midright) and self.a == 1:
                    self.a = 0
                    print("horizontal")
                    print(self.bullet.angle)
                    self.bullet.angle = 180 - self.bullet.angle
                    print(self.bullet.angle)
                    if self.bullet.angle < 0:
                        self.bullet.angle += 360
                        print(self.bullet.angle)
                    self.listbox.remove(box)

你会怎么做?我试图有一个直线,比较角度,使用面具,但我无法得到一个解决方案的工作。

感谢您抽出时间!

共有1个答案

容磊
2023-03-14

使用从中心到项目符号中心的方向向量(DXDY),以确定该框是否适合左、右、上或下:

dx = self.bullet.rect.centerx - box.rect.centerx 
dy = self.bullet.rect.centery - box.rect.centery

必须测试的4个方向是:

dir     = [(-1, 0), (1, 0),  (0, -1), (0, 1)]
dirName = ["left",  "right", "top",   "bottom"]

您必须确定closet到哪个方向(DXDY)。这可以通过比较向量(dxdy)和向量的4个方向的点积来实现,这类似于用Python检查圆扇区中是否存在一个点

dot( A, B ) == | A | * | B | * cos( angle_A_B ) 

二维向量A、B的点积可以通过2次乘法和1次加法计算出来:

html prettyprint-override">dotAB = Ax * Bx + Ay * By 

壁橱方向是方向,与给出最大点积。最大cam由max:

max_dir = max([i for i in range(len(dir))], key = lambda i: dx*dir[i][0] + dy*dir[i][1])

例如。

dir     = [(-1, 0), (1, 0),  (0, -1), (0, 1)]
dirName = ["left",  "right", "top",   "bottom"]

for box in self.listbox:

    if box.rect.colliderect(self.bullet.rect):

        dx = self.bullet.rect.centerx - box.rect.centerx 
        dy = self.bullet.rect.centery - box.rect.centery 

        max_dir = max([i for i in range(len(dir))], key = lambda i: dx*dir[i][0] + dy*dir[i][1])
        print("hit", dirName[max_dir]) 

        # [...]

 类似资料:
  • 所以我试图用pygame制作一个我们之间的游戏。我刚刚开始,所以我没有太多东西,现在正在制作地图。然而,我正在努力解决的一件事是碰撞逻辑。地图目前有一个细长的八边形形状,但是我想不管是什么形状,我都会使用类似pygame多边形的东西。当我运行我现在的代码时,它会检查我的玩家(pygame矩形)和墙壁(pygame多边形)之间的碰撞,它说: 我发现这是因为pygame多边形返回了一个矩形,但在碰撞检

  • 我正在构建一个自上而下的2D滚动使用java swing与经典游戏Bomberman非常相似的游戏,玩家可以在所有4个基本方向移动角色。 所有的游戏对象都有实例变量,其中包含它们在JPanel上呈现的(x,y)坐标,它们也有用于它们在最后一帧中呈现的前一个(x,y)坐标的实例变量。我的碰撞检测算法本质上是在每次刷新屏幕时检查播放器对象是否与网格中的墙相交--这可以在下面的代码中看到: restor

  • 我正在做一个游戏,在这个游戏中,玩家必须用一个碗来接住掉落的物品。我有一些列表中项目的图像和一个用来捕捉项目的碗的图像。这些项目会持续下降,如果它们到达边界(底部边缘),则会重置到屏幕顶部。我完成了这个逻辑,允许物品落下,但我不知道如何检测碗和物品之间的碰撞。 我的代码:

  • 在我的自上而下游戏中,当我的玩家通过婴儿床时,我该如何让他发生碰撞?我用的是交叉矩形。 这是我的密码 更新方法 在渲染方法中 这是完整的代码 谁能告诉我矩形碰撞检测的正确实现是什么?没有重叠,我是这个框架的新手。致谢和预付款:)

  • 我正在为我的播放器和bullet类创建一些围绕精灵的矩形,以使用LibGDX的Intersector类中的重叠方法检测碰撞。 我有一个问题: 当我实例化Player和Bullet时,我使用sprite.getBoundingRectangle()在精灵周围创建一个边界框,它返回一个Rectangle对象。我在主类的其他地方更新这些的移动。 当我更新子弹/玩家精灵的移动时,我是否也需要更新子弹/玩家

  • 我画了一个旋转的矩形,我需要检查它是否碰撞。整个班级: 这是碰撞函数: 这就是我得到的: 我认为这已经足够了,因为它每次都会随着旋转位置的更新来检测碰撞,但是似乎我必须使用分离轴定理,你能帮助我吗?