tkin中的Pong碰撞方法

2024-05-13 12:32:04 发布

您现在位置:Python中文网/ 问答频道 /正文

在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 知道那里有错误,在那里只是试图让碰撞正常工作,目前无法找出错误


Tags: selfif画布coordsx1p2c1乒乓球
1条回答
网友
1楼 · 发布于 2024-05-13 12:32:04

正如您发现的(并且在正确的文档中记录的那样),返回的坐标数画布.coords(x) 取决于x的类型。无论出于什么原因,您都将球拍和球创建为图像,并使用.create_image添加到画布中。图像将相对于x,y定位点显示,该定位点是图像的中心,除非您另有指定。在

为了获得合适的边界框来进行碰撞检测,可以使用填充矩形和填充圆来处理桨叶和球(这是原始游戏所做的,也是最简单的事情),因此.coords(x)返回边界框,或者自己从图像中心和已知图像大小计算边界框。在

对于y坐标在直线上方的矩形桨叶和圆球,正确的交集代码取决于球中心的x坐标是否在直线的端点内(如果y距离小于半径,则为相交),是否小于线外半径(因此球可能会撞到角),或者更远的地方(没有十字路口)。在

相关问题 更多 >