【问题标题】:Pong game in tkinter, Check for the ball hitting the vertical paddletkinter 中的乒乓球比赛,检查球是否击中垂直桨
【发布时间】:2019-07-03 21:30:48
【问题描述】:

我正在尝试在 python tkinter 中实现一个乒乓球游戏。我在画布的左侧有桨,我想检测球与桨的碰撞。我无法正确检测到碰撞,因为有时球刚刚穿过桨。请任何帮助表示赞赏,以下是我使用的碰撞检测代码,不知道它有什么问题。我正在尝试实现的是,如果球的位置在桨的顶部和底部之间以及左右之间,那么就会发生碰撞

def hit_paddle(self, pos):
    """ pos(left, top, right, bottom)"""
    paddle_pos = self.canvas.coords(self.shape)
    if ball_pos[1] >= paddle_pos[1] and ball_pos[1] <= paddle_pos[3]:
        if ball_pos[2] >= paddle_pos[0] and ball_pos[2] <= paddle_pos[2]:
            return True
    return False

【问题讨论】:

  • canvas.find_overlapped 可以给出与球重叠的所有元素的列表。如果有桨,那么你有碰撞。也许你可以在一行代码中做到这一点:return (self.shape in self.canvas.find_overlapped(*ball_pos))
  • 谢谢,我也试试这个。

标签: python tkinter


【解决方案1】:

你的想法是对的,但在极少数情况下球可以穿过桨。

第一个 if 语句检查球和桨的 y 位置。如果球的任何部分在paddle_pos[1]paddle_pos[3] 之间,这应该返回真。

第二个 if 语句检查 x 位置,并且具有相同的逻辑。您需要检查球的左侧是否在范围内,因为那是球的一部分,会击中 LEFT 桨。

试试这个代码:

def hit_paddle(self, pos):
     """ pos(left, top, right, bottom)"""
     paddle_pos = self.canvas.coords(self.shape)
     if ball_pos[3] >= paddle_pos[1] and ball_pos[1] <= paddle_pos[3]:
         if ball_pos[0] >= paddle_pos[0] and ball_pos[0] <= paddle_pos[2]:
             return True
     return False

【讨论】:

    【解决方案2】:

    假设ball_pos[1]是小球bounding box左下顶点的y坐标,难道不应该对小球bounding box右上顶点的y坐标也进行约束吗?例如,如果球刚好低于球拍的下端,我认为您的代码不会将其视为命中。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      • 1970-01-01
      相关资源
      最近更新 更多