【问题标题】:Python: How do I detect visible shape detection in TkinterPython:如何在 Tkinter 中检测可见形状检测
【发布时间】:2017-03-19 05:31:25
【问题描述】:

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

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

Ball 类有它的位置变量和直径变量,Rect 类有它的位置和尺寸变量。

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

我还想知道在 Python 中是否有任何类似于在 Java 中进行形状碰撞的方式。在我的 Java 游戏中,我使用以下代码来检测任意 2 个Shapes 之间的冲突:

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 中进行圆矩形碰撞?

感谢您的帮助

【问题讨论】:

    标签: python canvas tkinter collision-detection


    【解决方案1】:

    我设法使用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 返回一个 ID 元组,这些 ID 位于输入到 find_overlapping 的矩形边界内。然后,您可以遍历元组以查看是否有任何 ID 与您的其他形状匹配。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-27
      • 2019-07-04
      • 2017-11-21
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多