在pong碰撞检测方面有点麻烦。我为Pong创建了一个类初始化了我的画布窗口等属性和乒乓球的速度。创建了使用图像的桨,然后调整他们的大小,我想使用PIL相同的乒乓球大小。在
现在我正在使用画布.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 知道那里有错误,在那里只是试图让碰撞正常工作,目前无法找出错误
正如您发现的(并且在正确的文档中记录的那样),返回的坐标数画布.coords(x) 取决于x的类型。无论出于什么原因,您都将球拍和球创建为图像,并使用.create_image添加到画布中。图像将相对于x,y定位点显示,该定位点是图像的中心,除非您另有指定。在
为了获得合适的边界框来进行碰撞检测,可以使用填充矩形和填充圆来处理桨叶和球(这是原始游戏所做的,也是最简单的事情),因此.coords(x)返回边界框,或者自己从图像中心和已知图像大小计算边界框。在
对于y坐标在直线上方的矩形桨叶和圆球,正确的交集代码取决于球中心的x坐标是否在直线的端点内(如果y距离小于半径,则为相交),是否小于线外半径(因此球可能会撞到角),或者更远的地方(没有十字路口)。在
相关问题 更多 >
编程相关推荐