我是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中进行圆形矩形碰撞?
感谢您的帮助
答案 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碰撞。