tkinter中的Pong碰撞方法
Pong collision method in tkinter
乒乓碰撞检测有点麻烦。我为 Pong 制作了一个 class 初始化了我的 canvas window 等属性和乒乓球的速度。使用图像创建球拍,然后使用 PIL 将它们调整为我想要的球拍尺寸,同样用于乒乓球。
现在我正在使用 canvas.coords 方法检测球拍和球的当前位置。根据我的 CPSC 页面,这应该 return 右上角和左下角 right/left 四个值,然后我可以使用这些来检测碰撞。
然而,它只是 returning 两个值,并且它检测到球拍中点的碰撞,一直到屏幕下方 -
就像说球拍位于屏幕中间的最顶部,然后球在 canvas 的中心通过,它将检测到碰撞并改变速度。下面贴出碰撞的相关代码。
def animate_pong_ball(self):
self.C1.move(self.animated_ball, self.pong_dx, self.pong_dy)
x1, y1 = self.C1.coords(self.animated_ball)
if x1 <= 0:
self.pong_dx *= -1
elif x1 > WINDOW_WIDTH / 2:
self.pong_dx *= -1
if y1 <= 0:
self.pong_dy *= -1
elif y1 > WINDOW_HEIGHT:
self.pong_dy *= -1
def detect_collisions(self):
p1_x, p1_y = self.C1.coords(self.paddle_1)
p2_x, p2_y = self.C1.coords(self.paddle_2)
b_x, b_y = self.C1.coords(self.animated_ball)
if p1_x == b_x or p2_x == b_x:
self.pong_dx *= -1
if p1_y == b_y or p2_y == b_y:
self.pong_dy *= -1
完整代码位于 http://pastebin.com/KfEkpsAN
知道那里的粗略副本中存在错误只是试图让碰撞在此刻正常工作并且无法弄清楚什么是错误的
如您所见(正确文档中有记录),canvas.coords(x) 返回的坐标数取决于 x 的类型。无论出于何种原因,您将球拍和球创建为图像,并使用 .create_image 添加到 canvas。图像是相对于 x,y 锚点显示的,除非您另有指定,否则它是图像的中心。
要获得用于碰撞检测的正确边界框,请使用实心矩形和实心圆来表示桨和球(这是原始游戏所做的,也是最简单的事情),所以 .coords(x) returns bounding box,或者根据图像中心和已知图像大小自己计算边界框。
y坐标在直线上方的矩形桨和圆球的正确交点代码取决于球中心的x坐标是否在直线的端点内(交点如果y距离小于半径),小于线外的半径(因此球可能会击中角),或者更远(没有交点)。
乒乓碰撞检测有点麻烦。我为 Pong 制作了一个 class 初始化了我的 canvas window 等属性和乒乓球的速度。使用图像创建球拍,然后使用 PIL 将它们调整为我想要的球拍尺寸,同样用于乒乓球。
现在我正在使用 canvas.coords 方法检测球拍和球的当前位置。根据我的 CPSC 页面,这应该 return 右上角和左下角 right/left 四个值,然后我可以使用这些来检测碰撞。
然而,它只是 returning 两个值,并且它检测到球拍中点的碰撞,一直到屏幕下方 - 就像说球拍位于屏幕中间的最顶部,然后球在 canvas 的中心通过,它将检测到碰撞并改变速度。下面贴出碰撞的相关代码。
def animate_pong_ball(self):
self.C1.move(self.animated_ball, self.pong_dx, self.pong_dy)
x1, y1 = self.C1.coords(self.animated_ball)
if x1 <= 0:
self.pong_dx *= -1
elif x1 > WINDOW_WIDTH / 2:
self.pong_dx *= -1
if y1 <= 0:
self.pong_dy *= -1
elif y1 > WINDOW_HEIGHT:
self.pong_dy *= -1
def detect_collisions(self):
p1_x, p1_y = self.C1.coords(self.paddle_1)
p2_x, p2_y = self.C1.coords(self.paddle_2)
b_x, b_y = self.C1.coords(self.animated_ball)
if p1_x == b_x or p2_x == b_x:
self.pong_dx *= -1
if p1_y == b_y or p2_y == b_y:
self.pong_dy *= -1
完整代码位于 http://pastebin.com/KfEkpsAN 知道那里的粗略副本中存在错误只是试图让碰撞在此刻正常工作并且无法弄清楚什么是错误的
如您所见(正确文档中有记录),canvas.coords(x) 返回的坐标数取决于 x 的类型。无论出于何种原因,您将球拍和球创建为图像,并使用 .create_image 添加到 canvas。图像是相对于 x,y 锚点显示的,除非您另有指定,否则它是图像的中心。
要获得用于碰撞检测的正确边界框,请使用实心矩形和实心圆来表示桨和球(这是原始游戏所做的,也是最简单的事情),所以 .coords(x) returns bounding box,或者根据图像中心和已知图像大小自己计算边界框。
y坐标在直线上方的矩形桨和圆球的正确交点代码取决于球中心的x坐标是否在直线的端点内(交点如果y距离小于半径),小于线外的半径(因此球可能会击中角),或者更远(没有交点)。