当前位置:   article > 正文

基于Python 和pygamae实现的超级玛丽(包含代码)_python&pygame从零开始手把手教你开发超级玛丽

python&pygame从零开始手把手教你开发超级玛丽

1.有限状态机

游戏过程中总是伴随着各种行为,如游戏物体的移动,游戏角色形态的变化,逻辑页面的跳转等等。这些行为和变化往往包含多个状态,妥善管理和设计这些状态将简化游戏开发,也便于游戏维护和扩展。本代码使用游戏状态机对这些状态进行管理。游戏状态机即是有限状态机(FSM),其将游戏对象的所有状态分隔开来,状态间在满足一定条件的情况下可以相互转换。

1.1逻辑界面的跳转
    游戏界面是指玩家打开游戏后的操作界面,不同操作界面的内容、功能不同,各个操作界面之间在一定条件下可发生相互转换。将这些界面分隔成独立的状态,可极大简化各个界面的实现,使不同界面间转换的逻辑思路更加清晰。
    共包含六个逻辑界面,分别是:
      (1)初始界面:打开游戏首先出现的界面,于界面的顶端展示当前所获分数、硬币个数以及时间,由于游戏未开始,其值均为0;其次,在屏幕中央显示游戏的名称,下面则是游戏的入口,可通过按下Enter键进入游戏;最后,界面的背景是其中一个关卡。
      (2)过渡界面:在进入正式游戏之前,或者游戏角色死亡后重生的界面。该界面的正上方是从上个界面继承而来的分数、硬币的个数以及清零的剩余时间;界面中间展示玩家本局游戏剩余的生命条数。过渡界面停留两秒后就会自动进入游戏界面。
      (3)游戏界面:玩家操控角色进行游戏的界面。该界面从上个界面继承分数、硬币个数,时间则开始倒数。倒计时结束,角色还未到达终点位置,或者角色死亡,生命条数减1,若此时生命值归零,则本局游戏结束,进入结束界面;若此时生命值大于零,则进入过渡界面。当角色在规定时间内到达指定的结束位置,则本关卡通过,
若还有下一关,则进入下一关加载界面;若无下一关,则直接进入结束界面。
      (4)结束界面:当角色生命条数清零,或者通关全部关卡后进入该界面。该界面展示分数和硬币数量,同样继承自上一界面,显示倒计时清零;屏幕中央显示“GAMEOVER”表示游戏结束。超时界面停留两秒后自动返回初始界面。
      (5)下一关卡界面:完成一个关卡后,进入下一个关卡前的中间状态。分数和硬币数量继承自上一界面,倒计时清零;屏幕中央显示“NEXTLEVEL”表示进入下一个关卡。该界面停留两秒后自动进入下一界面,即游戏界面。
      (6)超时界面:未在规定时间内使角色到达指定结束位置,且角色生命条数大于零时进入的界面。分数和硬币数量继承自上一界面,倒计时清零;屏幕中央显示“TIMEOUT”表示当前这条生命对应的倒计时己到。该界面停留两秒后角色重生回到游戏界面。

1.2游戏物体的移动

    游戏中,可移动的游戏物体包括游戏角色、怪物以及生成的道具。移动的游戏物体可以处于多种状态,如游戏角色根据玩家的操作可处于站立、跳跃、下蹲、奔跑等状态。下面对所有状态及其转换条件进行描述,并画出示意图。游戏角色移动时共四个状态:

      (1)站立:静止状态,不发生位移。当玩家按下跳跃键时,角色进入跳跃状态,落地后返回站立状态;当玩家长按下蹲键时,角色进入下蹲状态,松开后立即返回站立状态,需要注意的是,只有角色变大之后才能下蹲;当玩家按住左右移动键不松时,角色进入奔跑状态。

      (2)下蹲:在游戏角色变大时可进行的蹲下动作。当玩家按下移动键后,角色直接退出该状态并奔跑移动;该状态下也可进行跳跃。

      (3)跳跃:游戏角色跳跃至空中的状态。其余三个状态都能进入跳跃状态,但角色不可在空中连续跳跃;当跳跃动画结束后,角色返回原本的状态;若进入跳跃状态之前处于奔跑态,角色将跳得更高更远。

      (4)奔跑:角色向左右移动的状态,通过长按移动键实现,松开后角色将因为惯性往前冲出一段距离,然后速度逐渐降为零并回到站立状态。在奔跑过程中可进行跳跃。

1.3角色形态的变化

      (1)初始形态:

      (2)变大形态:

      (3)攻击形态:

      (4)无敌形态:

      (5)死亡形态:游戏角色死亡后经历的短暂形态,其余四个形态触发相应的死亡条件之后均能进入该形态。该形态后,若角色剩余生命条数大于零则返回初始形态,若小于等于零则游戏直接结束。处于死亡形态时无法进行任何操作。

2.游戏玩法设计

         ”超级玛丽”是一款横板卷轴游戏,玩家操控游戏角色跳跃障碍物,击杀怪物,获取道具,并最终到达指定地点,完成游戏。游戏过程中,镜头跟随角色推进,玩家通过硬币、道具,击杀怪物来获取分数。游戏关卡中包含:游戏角色,共包含五个形态,初始形态、变大形态、无敌形态、攻击形态以及死亡形态,基于不同的条件,不同形态之间可以发生转换;砖块,作为地形的一部分,分为可碎砖块与不可碎砖块;管道,地形的一部分,宽度相同,但高度不同;道具,其隐藏在标记为“?”的砖块中,有时通过隐藏触发点也可获取道具,道具可增加分数,也可改变角色形态,降低游戏难度;怪物,其通过攻击可使得游戏角色死亡或者发生形态改变;旗帜,用于标记当前游戏关卡完成的终点位置,可获得一定分数;城堡,用于当前关卡完成后所播放的胜利特效;游戏角色的行走、奔跑、蹲下、受伤、死亡、重生以及形态的改变,打碎砖块,道具生成,怪物死亡,到达终点等均有特效动画或音乐。

控制:

方向键控制方向

'a' 表示跳跃

's' 表示攻击(火球、奔跑)

3.核心技术实现

         碰撞检测用于检测物体之间是否发生碰撞,使它们之间的接触与日常生活常识一致,并触发相应的事件。Pygame中自带碰撞检测函数,其中包括检测单个物体与多个物体之间碰撞的函数pygame. sprite. spritecollide(),以及检测多个物体与多个物体之间碰撞的函数pygame. sprite.groupcollideUo

        代码实现用到碰撞检测技术的地方有:角色与地形之间,使角色可以站立于地形之上;角色与怪物之间,角色在X轴方向上碰撞怪物会死亡,在Y轴上碰撞怪物则会杀死怪物等等;角色与砖块之间,从下往上顶撞和从上往下踩踏效果不一样;角色与隐藏触发点之间,碰撞后可触发相应事件,如怪物的移动;怪物与地形之间,碰撞后可改变怪物的移动方向;怪物与子弹之间,碰撞后可使怪物被杀死等等。以角色初始状态下与怪物之间的碰撞为例,对该技术的实现进行介绍。

        角色与怪物的碰撞分为在X轴和Y轴上的,在X轴上的碰撞会使角色死亡,在Y轴上的碰撞会使怪物死亡。由于在Pygame中只有检测是否碰撞而没有检测碰撞方向的函数,因此通过角色在Y轴上的移动速度来判断角色与怪物的碰撞方向:当角色在Y轴上的速度小于零时,即表示角色此时在向上的过程中,碰撞怪物后角色死亡;当角色在Y轴上的速度等于零时,表示角色在左右移动未进行跳跃,碰撞怪物后角色死亡;当角色在Y轴上的速度小于零时,表示角色在下落的过程中,碰撞后怪物死亡。

        如图,在Y轴上速度小于零和速度等于零时与怪物碰撞后角色死亡,并触发角色死亡动画(向上弹起再向下掉落),如图C所示,在Y轴上速度大于零与怪物碰撞后杀死怪物,并触发怪物死亡特效(被踩扁,并使玩家获得相应分数)。

 4.游戏实现测试

代码链接:

https://download.csdn.net/download/weixin_40651515/88111219

里面包含两个版本的代码包,运行环境:python3.7 + pygame1.9

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/215645?site
推荐阅读
相关标签
  

闽ICP备14008679号