嘿——我正在尝试使用 Python 的 Pygame 库设计我的第一个游戏,我想知道一般关卡设计的最佳实践是什么。我很想听听你们认为用于管理关卡的好的面向对象设计模式。另外,我对 Python 还很陌生——谢谢!
3 回答
在这种类型的游戏中,您的地图是以图块为单位的(我假设您所说的级别是指一个单独的级别,而不是管理您的所有级别)。每块瓷砖都有
- 关联的图片(它在显示器上的样子)
- 一种类型(即墙壁、地面、陷阱等)
当我在 Pygame 中创建基于图块的游戏时,我通常有一个Map
包含当前地图的类:
- 地图的
pygame.Surface
(你将要显示的内容) - 一个列表列表(即矩阵),其中每个项目都是一个 Tile 对象(我也做过一些游戏,你只有一个字符串告诉你它是什么类型的 tile,然后你不需要单独的 Tile班级)
地图应该是相对静态的——你可以让陷阱在你踩到它们之后变成普通的瓦片(这很容易——当你进行碰撞检测并且它是一个命中时,只需将该瓦片更改为不同的瓦片对象(大概是用于一个空的瓷砖)),但如果你能提供帮助,你不希望地图中出现字符或可移动的块。由于可移动的块有自己的移动规则,它并不像仅仅改变一个瓷砖那么简单——你会有一整套逻辑,至少需要改变两个瓷砖(如果你可以将块移动到陷阱上-然后您必须分别记住它下面的内容-bleh)。在我看来,为每个移动的对象和项目设置一个类更容易。
简而言之,您有:
Tile
Map
Block
- 其他可移动对象/精灵
这基本上就是你的整个水平。对于多个级别,如果各个级别始终相同,您可以只拥有一个Map
对象列表,每个级别一个。
如果这是您的第一个 Pygame 应用程序,请不要花时间担心“用于管理关卡的面向对象设计模式”。你现在需要做的是弄清楚如何让 Pygame 做你想做的事情。
- 你能展示你想要的一切吗?
- 你的显示器没有闪烁吗?
- 你能正确阅读用户输入控件吗?
- 等等
用于管理级别的面向对象模式出现得更晚,更晚。
一般来说,一种简单的方法是使用矩阵(或多维数组——它们在这里的工作方式相同)。
基本上,每个 Map 都是一个数组,数组中的每个项目都是网格上的一个正方形。例如,一个 3 x 3 的网格如下所示:
(伪代码)
var Map = [[1,2,3][1,2,3][1,2,3]];
代替数字,您可以为函数放置字符串,以根据单元格的值进行解析和绘制或采取行动。