在Pygame中实现Rect对象和球之间的碰撞检测功能

时间:2019-11-05 17:44:21

标签: python pygame

s1 = net.addSwitch( 's1', failmode='standalone', stp=True)

到目前为止,到目前为止,我的作品基本上应该是复古的街机游戏乒乓球,球从球拍的边缘弹起,如果不是相反的话,球击中窗口边缘时会得分。因此,具体来说,该项目的这一部分要求我使球从球拍的前部弹起,而我对如何执行此操作感到困惑。我的想法最初是在Rect类中使用collidepoint方法,如果该方法返回true,则将反转球的速度。但是,我无法访问类内部或类游戏中方法玩法内部球的中心坐标,我打算在球和paddle1,paddle2的特定实例上进行此工作,因此我无法不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

Game.update中评估球是击中右侧的左桨还是右击左侧的桨。
如果球击中了桨,则得分可以增加:

class Game():

    # [...]

    def update(self):
        self.ball.move()

        # evaluate if Ball hits the left paddle (Paddle1) at the right
        if self.ball.velocity[0] < 0 and self.Paddle1.rect.top <= self.ball.center[1] <= self.Paddle1.rect.bottom:
           if self.Paddle1.rect.right <= self.ball.center[0] <= self.Paddle1.rect.right + self.ball.radius:
                self.ball.velocity[0] = -self.ball.velocity[0]
                self.ball.center[0] = self.Paddle1.rect.right + self.ball.radius
                self.score1 += 1

        # evaluate if Ball hits the right paddle (Paddle2) at the left
        if self.ball.velocity[0] > 0 and self.Paddle2.rect.top <= self.ball.center[1] <= self.Paddle2.rect.bottom:
           if self.Paddle2.rect.left >= self.ball.center[0] >= self.Paddle2.rect.left - self.ball.radius:
                self.ball.velocity[0] = -self.ball.velocity[0]
                self.ball.center[0] = self.Paddle2.rect.left - self.ball.radius
                self.score2 += 1 

通过pygame.key.get_pressed()获取键的状态,并将桨的位置更改为Game.handle_events

例如将左拨片移动 w / s ,右拨片移动 UP / DOWN

class Game():

    # [...]

    def handle_events(self):
        events=pygame.event.get()
        for event in events:
            if event.type== pygame.QUIT:
                self.close_clicked=True
        keys = pygame.key.get_pressed()
        if keys[pygame.K_w]:
            self.Paddle1.rect.top = max(0, self.Paddle1.rect.top - 3)
        if keys[pygame.K_s]:
            self.Paddle1.rect.bottom = min(self.surface.get_height(), self.Paddle1.rect.bottom + 3)
        if keys[pygame.K_UP]:
            self.Paddle2.rect.top = max(0, self.Paddle2.rect.top - 3)
        if keys[pygame.K_DOWN]:
            self.Paddle2.rect.bottom = min(self.surface.get_height(), self.Paddle2.rect.bottom + 3)