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的完整代码 知道那些粗糙的副本中的错误只是试图让碰撞在此刻正常工作并且无法弄清楚什么是错的
答案 0 :(得分:1)
正如您所发现的(正确的文档中记录),canvas.coords(x)返回的坐标数取决于x的类型。无论出于何种原因,您将桨和球创建为图像,并使用.create_image添加到画布中。除非另有说明,否则图像将相对于x,y锚点显示,除非另有说明,否则它是图像的中心。
要获得适当的碰撞检测边界框,可以使用填充矩形和填充圆圈作为桨和球(这是原始游戏所做的,也是最简单的事情),所以.coords(x)返回边界框,或自己从图像中心和已知图像大小计算边界框。
矩形桨和圆形球的正确交点代码,其y坐标位于线上方,取决于球的中心的x坐标是否在线的终点内(如果距离为y,则为交点)小于半径),小于线外的半径(因此球可能会撞到角落),或者更远(没有交叉点)。