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)
Ball
class有位置变量和直径变量,Rect
class有位置变量和维度变量。
我想知道如何检测这两个 "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 中的圆-矩形碰撞?
感谢您的帮助
我设法使用 Tkinter
的 Canvas
对象具有的方法解决了这个问题。每次使用 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 与您的其他形状匹配。
这对矩形-矩形碰撞和圆形-矩形碰撞非常有效。
我是 Python 的新手,我有一个包含 2 个 class 的程序,一个本质上是矩形,另一个本质上是圆形。我正在使用 Tkinter
中的 Canvas
按以下方式绘制它们:
def draw(self):
self.canvas.delete("all")
self.rect.draw(self.canvas)
self.ball.draw(self.canvas)
Ball
class有位置变量和直径变量,Rect
class有位置变量和维度变量。
我想知道如何检测这两个 "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 中的圆-矩形碰撞?
感谢您的帮助
我设法使用 Tkinter
的 Canvas
对象具有的方法解决了这个问题。每次使用 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 与您的其他形状匹配。
这对矩形-矩形碰撞和圆形-矩形碰撞非常有效。