Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何在Tkinter中检测可见形状检测_Python_Canvas_Tkinter_Collision Detection - Fatal编程技术网

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

Python:如何在Tkinter中检测可见形状检测,python,canvas,tkinter,collision-detection,Python,Canvas,Tkinter,Collision Detection,我是Python新手,我有一个程序有两个类,一个基本上是矩形,另一个基本上是圆形。我正在使用Tkinter中的Canvas以以下方式绘制它们: def draw(self): self.canvas.delete("all") self.rect.draw(self.canvas) self.ball.draw(self.canvas) Ball类有其位置变量和直径变量,Rect类有其位置变量和尺寸变量 我想知道我如何检测这两个“形状”之间的碰撞。我知道其中一个是将球视

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

def draw(self):
    self.canvas.delete("all")
    self.rect.draw(self.canvas)
    self.ball.draw(self.canvas)
Ball
类有其位置变量和直径变量,
Rect
类有其位置变量和尺寸变量

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

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

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\u 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
返回位于输入到
find\u overlapping
中的矩形边界内的ID元组。您可以在元组中循环,查看是否有任何ID与其他形状匹配

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