马里奥移动时,地图也跟着滚动,画面显得非常跳跃,游戏体验非常不好,而且感觉马里奥移动的速度太快了,让我们优化一下。
实际上,当马里奥位于屏幕左侧时,地图是保持静止的,只有当马里奥移动到大约屏幕中间位置时,地图才开始滚动。地图滚动是单向的,马里奥向左走,地图是不会滚回去的。当马里奥接近地图边缘时,地图也不会滚动,因为右边没有地图了。
而特别重要的一点是,在地图滚动时,马里奥不会移动。背景移动而人物静止,视觉效果就是人物在移动。如果地图滚动时马里奥也移动,那么移动效果就加倍了。修改后的代码如下所示:
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) |
在程序中,将按左方向键时滚动地图的代码去掉了,按右方向键时,要么滚动地图,要么移动马里奥。为了确保滚动速度和马里奥步行速度一致,滚动地图的步伐采用了马里奥的步伐。运行程序,会发现滚动效果大大提升。