如何用 Python 实现超级玛丽的界面和状态机?

  • 时间:
  • 浏览:0

小后后 的经典游戏,代码参考了github上的项目Mario-Level-1(https://github.com/justinmeister/Mario-Level-1),使用pygame来实现,从中学习到了横版过关游戏实现中的许多补救办法。原项目实现了超级玛丽的第另有有有三个小关。

在原项目的基础上,游戏使用json文件来保存每另有有有三个关卡的数据,将数据和代码解耦合,目前已开发另有有有三个小关,后续关卡的扩展也很方便,只需用加在json文件和地图图片,支持新的怪物就行。游戏还支持进入水管,到新的子地图。

这篇文章是要介绍下游戏中的哪多少界面显示和界面后后 何如转换,就是特意写了另有有有三个demo程序,完整的游戏代码在下面的github链接(https://github.com/marblexu/PythonSuperMario)中下载。

Control类

或者这篇文章的目的是游戏界面的情况报告机实现,就是专门写了另有有有三个state_demo.py文件,让没没有人能不能更加方便的看代码。

下面介绍Info类,界面的显示大要素全是由它来完成,init函数中create_info_labels函数创建通用的信息,create_state_labels函数对于不同的情况报告,会初始化不同的信息。

4、text_images.png

游戏中的情况报告机一般全是有限情况报告机,简写为FSM(Finite State Machine),简称情况报告机,是表示有限个情况报告以及在哪几种情况报告之间的转移和动作等行为的数学模型。

情况报告机的每另有有有三个情况报告要花费需用有下面另有有有三个操作:

Startup:当从许多情况报告进入這個 情况报告时,需用进行的初始化操作;

游戏界面情况报告机的情况报告转换图如下,箭头表示或者的情况报告转换方向:(注意有个转换不太好画出来:Time Out情况报告能不能转换到Game Over情况报告。)

云栖号:https://www.aliyun.com/#module-yedOfott8

第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

Game Over:人物死亡且生命数目为0时到這個 情况报告。

startup 函数保存了传入的persist,设置 next 为Level 情况报告类,start_time保存进入這個 情况报告的开始英文了了时间。初始化另有有有三个Info类,這個 就是专门用来显示界面信息的。

update 函数根据在這個 情况报告已运行的时间(current_time - self.start_time),决定显示内容和与否开始英文了了情况报告(self.done = True)。

游戏启动代码

情况报告机代码实现

这哪多少情况报告的意思比较简单,下面把游戏界面的截图发一下。

Main Menu:主菜单,启动程序就进入這個 情况报告,能不能用UP和DOWN键确定 player 1或player 2,按回车键开启游戏。

看另有有有三个情况报告类LoadScreen的具体实现,這個 情况报告的显示效果如图3。

load_all_gfx函数查找指定目录下所有符合后缀名的图片,使用pg.image.load函数加载,保位于graphics set中。

constants.py

event_loop函数负责监听输入(键盘输入和退出按钮),slef.keys 保存键盘输入。

GFX 保位于resources/graphics目录找到的所有图片,上面获取各种图形全是用到。

6、title_screen.png

完整代码

上面讲的情况报告类,情况报告机类都装进 这里。

云栖号:https://www.aliyun.com/#module-yedOfott8

第一手的上云资讯,不同行业精选的上云企业案例库,基于众多成功案例萃取而成的最佳实践,助力您上云决策!

Info类

有另有有有三个文件constants.py 和 state_demo.py,constants.py 保存了所有的字符串定义和常量。

2、level_1.png

state_demo.py

看一下create_info_labels函数中其中另有有有三个字符串’MARIO’是何如在界面上显示的。

update函数会检测情况报告的done值,调用情况报告的更新函数。或者检测到当前情况报告开始英文了了,就调用flip_state函数进行旧情况报告的清理操作,并转换到下另有有有三个情况报告。



图片文件名要保存为对应的,不然代码中会找非要,或者保存到state_demo.py所在目录下的resourcesgraphics子目录中。或者能上github,能不能直接下载resourcesgraphics目录中的图片。

1、item_objects.png

先定义另有有有三个State 基类, 按照上面说的情况报告需用的另有有有三个操作分别定义函数(startup, update, cleanup)。在 init 函数中定义了上面说的另有有有三个变量(next,persist,done),还有start_time 和 current_time 用于记录时间。

create_label函数参数 (x, y) 表示字符串在界面上的起始位置,从self.image_dict中根据字符获取对应的Surface 对象。

set_label_rects函数会设置字符串中每另有有有三个Surface 对象 rect 的(x, y)值。

Time Out:在游戏中时间超全是到這個 情况报告,這個 和Game Over这类,就不截图了。



GAME_TIME_OUT 表示游戏的超时时间,这边为了demo演示,设成了5秒,实际是30秒。

Control 是情况报告机类,main函数是游戏的主循环,setup_states函数设置游戏启动时运行的情况报告。

编译环境:python3.7 + pygame1.9。

声明:本文为CSDN博主「marble_xu」的原创文章,原文链接:https://blog.csdn.net/marble_xu/article/details/96427946

Load Screen:游戏开始英文了了前的加载界面。

原文发布时间:2019-12-22

本文作者:marble_xu

本文来自阿里云云栖号合作协议协议伙伴“CSDN”,了解相关信息能不能关注“CSDN”



done:表示這個 情况报告与否开始英文了了,情况报告或者根据這個 值来决定转换情况报告。

情况报告机介绍

下面是demo的入口函数,先创建了另有有有三个保存所有情况报告的state_dict set,调用setup_states函数设置起始情况报告是 MAIN_MENU。

Update :在這個 情况报告运行时进行的更新操作;

persist:在情况报告间转换需用用传递的数据;

pygame的 blit 函数介绍如下:

Game Run:游戏运行时的情况报告,在代码实现中是Level类。

create_font_image_dict函数从后后 加载的图片GFX[‘text_images’]中,截取字母和数字对应的图形,保位于另有有有三个set中,在上面创建文字全是用到。

3、mario_bros.png

Cleanup:当从這個 情况报告退出时,需用进行的清除操作。

下面的坐标图能不能都看,在左上角是整个屏幕的原点(0,0), 图中标识了长方形rect的三个顶点的坐标。

用到的图片

情况报告类

开始英文了了是 pygame的初始化,设置屏幕大小为c.SCREEN_SIZE(30, 300)。所有的常量都保位于单独的constants.py中。

5、tile_set.png

情况报告需用的变量:

next: 表示這個 情况报告退出不会转到的下另有有有三个情况报告;

get_image函数从另有有有三个大的Surface sheet 中按照 area(x, y, width, height)截取出要素图片 装进 Surface image对应的起始位置(0,0),并按照scale参数调整大小。