我们尝试让马里奥跳到水管上,却发现马里奥无法站稳,直接掉入水管中,如图2‑10所示。

图2‑10 马里奥掉进水管
这是因为我们迄今为止只对水平方向进行了碰撞判断,而垂直方向上马里奥每帧简单地向下移动4个像素,直至触及地平线,而中间的障碍物则未被考虑。
现在,我们需要在垂直方向的移动前,先检测下方是否存在障碍物,即判断马里奥是否与障碍物发生碰撞。这类似于X轴上的判断,唯一区别是这次沿着垂直方向,代码如下所示:
02\08.py
|
# 马里奥Y轴步伐 marioWalkStepY = 4
# 计算马里奥位置 if (marioY + marioHeight <= pipeY and marioY + marioHeight + marioWalkStepY >= pipeY and marioX + marioWidth >= pipeX and marioX <= pipeX + pipeWidth): marioWalkStepY = pipeY - (marioY + marioHeight) print("marioWalkStepY=" + str(marioWalkStepY)) marioY = marioY + marioWalkStepY if marioY >= 300 - marioHeight: marioY = 300 - marioHeight |
运行程序,马里奥可以站在水管上了。不过,有个特殊情况,当马里奥站在水管旁边原地起跳时,他也站到了水管上,如图2‑11所示。

图2‑11马里奥站在水管上
这是因为马里奥边框与水管边框有1像素的重叠,也就是marioX+marioWidth=pipeX的情况,从判断条件中去掉等号即可,修改后的代码如下所示:
02\09.py
|
# 马里奥Y轴步伐 marioWalkStepY = 4
# 计算马里奥位置 if (marioY + marioHeight <= pipeY and marioY + marioHeight + marioWalkStepY >= pipeY and marioX + marioWidth > pipeX and marioX < pipeX + pipeWidth): marioWalkStepY = pipeY - (marioY + marioHeight) print("marioWalkStepY=" + str(marioWalkStepY)) marioY = marioY + marioWalkStepY if marioY >= 300 - marioHeight: marioY = 300 - marioHeight |