在上述例子中,我们发现马里奥在水管旁跳跃时,是无法跳过水管的,只能做垂直起跳再落下的动作。这是因为碰撞判断只考虑了X轴坐标,当马里奥的X坐标位于水管范围内时,就判定无法通过。然而实际情况是,当马里奥位于水管的上方时是可以通过的。此外,如果水管悬空在空中,那么马里奥在水管下方也应当被允许通过,临界情况如图2‑7所示。

图2‑7 Y轴碰撞的临界情况
当马里奥从水管上方或下方通过时,Y坐标是不在水管范围内的。修改代码,增加Y坐标的判断,代码如下所示:
02\07.py
|
# 获取按键状态 keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: print("按了左方向键") if marioX - marioWalkStep <= 0: marioWalkStep = marioX if (marioX - marioWalkStep <= pipeX + pipeWidth and pipeX + pipeWidth <= marioX and marioY + marioHeight >= pipeY and marioY <= pipeY + pipeHeight): marioWalkStep = marioX - (pipeX + pipeWidth) marioX = marioX - marioWalkStep if keys[pygame.K_RIGHT]: print("按了右方向键") if marioX + marioWidth + marioWalkStep >= WIDTH: marioWalkStep = WIDTH - (marioX + marioWidth) print("marioWalkStep1=" + str(marioWalkStep)) if (marioX + marioWidth + marioWalkStep >= pipeX and marioX + marioWidth <= pipeX and marioY + marioHeight >= pipeY and marioY <= pipeY + pipeHeight): marioWalkStep = pipeX - (marioX + marioWidth) print("marioWalkStep2=" + str(marioWalkStep)) marioX = marioX + marioWalkStep |
运行程序,让马里奥跳过水管,运动轨迹如图2‑8所示。

图2‑8 马里奥跳过水管的轨迹
修改水管的位置,让马里奥从水管下方通过,运动轨迹如图2‑9所示。

图2‑9 马里奥从水管下方通过