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

时间:2017-03-19 05:31:25

标签: python canvas tkinter collision-detection

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

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

Ball类有其位置变量和直径变量,Rect类有其位置和维度变量。

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

我也想知道Python中是否有类似于Java中可以完成形状碰撞的方式。在我的Java游戏中,我使用以下代码来检测任何2 Shape s之间的冲突:

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

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我设法使用 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <EditText android:id="@+id/searchKey" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:hint="xx" /> <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/linear" android:layout_below="@+id/searchKey" android:layout_weight="1" android:fillViewport="true"> <TextView android:id="@+id/search_results" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:gravity="center_horizontal" android:textSize="@dimen/text_font_size" /> </ScrollView> <LinearLayout android:id="@+id/linear" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:orientation="horizontal"> <Button android:id="@+id/lastCharacterButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/lastChar_btn" /> <Button android:id="@+id/nextCharacterButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/nextChar_btn" /> </LinearLayout> </RelativeLayout> 的{​​{1}}对象具有的方法来解决这个问题。每次使用Tkinter绘制某些内容时,都会获得一个ID。因此,只要您在某处记录该ID,就可以使用Canvas对象所具有的Canvas方法。

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

Canvas

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

Platform

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 的矩形边界内。您可以遍历元组,看看是否有任何ID符合您的其他形状。

这适用于Rectangle-Rectangle碰撞和Circle-Rectangle碰撞。