乒乓球碰撞检测有点麻烦。我为Pong制作了一个类,用于初始化画布的窗口等属性和Pong球的速度。使用图像创建球拍,然后将其调整为我想要使用的PIL球拍尺寸。
现在,我正在使用canvas.coords方法检测桨和球的当前位置。根据我的CPSC页面,这应该返回右上角和右下角/左下角的四个值,然后我可以使用这些值检测碰撞。
但是,它仅返回两个值,并且它一直检测到沿屏幕一直向下的桨中点的碰撞-
例如,桨位于屏幕中间的最上方,然后球从画布的中心通过,它将检测到碰撞并改变速度。下面列出了相关的碰撞代码。
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添加到画布中。除非另外指定,否则图像将相对于x,y锚点显示,锚点是图像的中心。
要获得用于碰撞检测的合适的边界框,请对桨和球使用实心矩形和实心圆(这是原始游戏所做的,也是最简单的操作),因此.coords(x)返回边界框,或者从图像中心和已知图像大小自己计算边界框。
y坐标在直线上方的矩形球和圆球的正确交点代码取决于球中心的x坐标是否在直线的端点内(如果y距离小于半径,则为交点) ),小于线外的半径(这样,球可能会撞到角),或者更远(没有相交)。
关于python - Tkinter中的Pong碰撞方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27762540/