2.3    跳过水管

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

27 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所示。

28 马里奥跳过水管的轨迹

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

29 马里奥从水管下方通过