2.4    站到水管上

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

210 马里奥掉进水管

这是因为我们迄今为止只对水平方向进行了碰撞判断,而垂直方向上马里奥每帧简单地向下移动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所示。

211马里奥站在水管上

这是因为马里奥边框与水管边框有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