Python: 如何在 Tkinter 中检测可见形状检测

Python: How do I detect visible shape detection in Tkinter

我是 Python 的新手,我有一个包含 2 个 class 的程序,一个本质上是矩形,另一个本质上是圆形。我正在使用 Tkinter 中的 Canvas 按以下方式绘制它们:

def draw(self):
    self.canvas.delete("all")
    self.rect.draw(self.canvas)
    self.ball.draw(self.canvas)

Ballclass有位置变量和直径变量,Rectclass有位置变量和维度变量。

我想知道如何检测这两个 "shapes" 之间的碰撞。我知道一个是将 Ball 视为正方形并进行基本的矩形碰撞,但我想知道如何精确。

我也想知道 Python 中是否有与 Java 中形状碰撞的方式相似的东西。在我的 Java 游戏中,我使用以下代码检测任何 2 Shape 之间的碰撞:

public boolean collisionCheck(Shape a, Shape b) {
     Area aA = new Area(a);
     Area aB = new Area(b);
     aA.intersect(aB);
     return !aA.isEmpty();
}

在 Python 中是否有类似的简单解决方案? 如果不是,我将如何处理 Python 中的圆-矩形碰撞?

感谢您的帮助

我设法使用 TkinterCanvas 对象具有的方法解决了这个问题。每次使用 Canvas 绘制某些东西时,它都会被赋予一个 ID。因此,只要您在某处记录该 ID,就可以使用 Canvas 对象具有的 find_overlapping 方法。

假设您有一个对象,在我的例子中是一个自定义 Platform 对象,它将 ID 存储在一个变量中。我是这样做的:

def draw_platform(self, canvas): #Located in the Platform Class
    self.ID = canvas.create_rectangle(self.x, self.y, self.x+self.w, self.y+self.h)

现在我可以使用这个 ID 来确定是否有任何对象重叠它。

def check_collision(self, plat, other_plat):
    result = self.canvas.find_overlapping(plat.x, plat.y, plat.x + plat.w, plat.y + plat.h)
    for i in result:
        if i == other_plat.ID:
            return True
   return False

result returns 位于输入 find_overlapping 的矩形边界内的 ID 元组。您可以遍历元组以查看是否有任何 ID 与您的其他形状匹配。

这对矩形-矩形碰撞和圆形-矩形碰撞非常有效。