3.3    滚动优化

马里奥移动时,地图也跟着滚动,画面显得非常跳跃,游戏体验非常不好,而且感觉马里奥移动的速度太快了,让我们优化一下。

实际上,当马里奥位于屏幕左侧时,地图是保持静止的,只有当马里奥移动到大约屏幕中间位置时,地图才开始滚动。地图滚动是单向的,马里奥向左走,地图是不会滚回去的。当马里奥接近地图边缘时,地图也不会滚动,因为右边没有地图了。

而特别重要的一点是,在地图滚动时,马里奥不会移动。背景移动而人物静止,视觉效果就是人物在移动。如果地图滚动时马里奥也移动,那么移动效果就加倍了。修改后的代码如下所示:

03\04.py

    # 马里奥的步伐

    marioWalkStep = 2

 

    # 获取按键状态

    keys = pygame.key.get_pressed()

    if keys[pygame.K_LEFT]:

        print("按了左方向键")

 

        # 窗口边界判断

        if marioRect.x - marioWalkStep <= 0:

            marioWalkStep = marioRect.x

 

        # 下一步预判断

        nextStepRect = marioRect.move(-1 * marioWalkStep, 0)

        pipeIndex = screenToMap(nextStepRect).collidelist(objectArray)  # 是否碰撞

        if pipeIndex != -1:

            marioWalkStep = marioRect.x - mapToScreen(objectArray[pipeIndex]).right

        marioRect = marioRect.move(-1 * marioWalkStep, 0)

    if keys[pygame.K_RIGHT]:

        print("按了右方向键")

 

        # 超过屏幕中线才滚动地图,地图末尾右半屏也不滚动

        if marioRect.x >= WIDTH / 2 and screenToMap(marioRect).x < mapViewFromMax + WIDTH / 2:

            scrollMap(marioWalkStep)

        else:

            # 窗口边界判断

            if marioRect.right + marioWalkStep >= WIDTH:

                marioWalkStep = WIDTH - marioRect.right

 

            # 下一步预判断

            nextStepRect = marioRect.move(marioWalkStep, 0)

            pipeIndex = screenToMap(nextStepRect).collidelist(objectArray)

            if pipeIndex != -1:

                marioWalkStep = mapToScreen(objectArray[pipeIndex]).x - marioRect.right

            marioRect = marioRect.move(marioWalkStep, 0)

在程序中,将按左方向键时滚动地图的代码去掉了,按右方向键时,要么滚动地图,要么移动马里奥。为了确保滚动速度和马里奥步行速度一致,滚动地图的步伐采用了马里奥的步伐。运行程序,会发现滚动效果大大提升。