赞
踩
以下是我所知道的两种最简单的筑墙方法。这两种方法都适用于图结构和图搜索算法,因此如果您愿意,可以在将来实现“路径查找”。这都是我的头顶,所以我很抱歉,如果有任何不清楚,但我也提供了相关文件的链接,你可以检查,如果你感到困惑。
方法一:瓷砖迷宫
这可能是在中生成地图的最简单方法,因为只需制作一个ASCII字符数组并用Python处理它们,就可以生成正方形的“wall”对象。
以这个网格为例:###########
# #
# ###### #
#S #F #
###########
“S”表示起点,“F”表示终点。是的,这可能是世界上最容易解决的“迷宫”,但这只是一个例子。假设我可怕的ASCII数组中的每个字符都代表一个大小为N x N的正方形平铺。空格表示平铺可以行走的字符,散列字符表示墙“35;”。
在这类游戏中,墙本身就是游戏实体。特别是在Pygame的上下文中,它们继承自Sprite class。Sprite类是表示实体的特殊类,或者基本上表示游戏中的现有对象。它们非常特别,因为它们可以代表障碍物、墙壁、地板、天花板、玩家、敌人,你可以命名它们。基本上,游戏中的每个对象都可以从Sprite类继承。
是什么让雪碧班如此特别?首先,你提到你在理解墙壁碰撞的概念上有困难。Pygame中的每个精灵都有自己的Rect attribute。rect属性基本上只是一个不可见的矩形,用于确定碰撞检测和绘制精灵等。根据定义,在纯平铺贴图中,实体之间的“碰撞”定义如下:如果两个实体的矩形彼此重叠,则两个实体发生碰撞。然后有一个Sprite类的方法叫做^{}。上面ASCII地图中的每面墙都有一个宽度、高度和位置,由它们在数组中的位置决定。因此,每个标签字符直接表示一个矩形,该矩形也是一个正方形,并且具有正方形的“表面”图像。
让你的玩家从精灵类继承,并把他放在一个精灵组,即“玩家组”。让你的墙实体从sprite类继承并将它们放在另一个sprite组中,称之为“障碍组”或类似的东西。然后,您只需在游戏循环的每一帧中调用^{},并使用它返回的字典来判断玩家是否与任何精灵碰撞。如果不清楚的话,我已经提供了文档的链接。阅读Pygame文档可能比我的答案更能帮助您理解这一点。
总之,你最终得到的是一本字典。我将直接引用文档来解释我的观点:groupcollide(group1, group2, dokill1, dokill2, collided = None) -> Sprite_dict
This will find collisions between all the Sprites in two groups. Collision is
determined by comparing the Sprite.rect attribute of each Sprite or by using the
collided function if it is not None.
Every Sprite inside group1 is added to the return dictionary. The value
for each item is the list of Sprites in group2 that intersect.
你可以在你的游戏循环的每个迭代中直接调用这个函数,在你更新玩家的动作之后,在你绘制你的所有实体之前,用玩家的组作为参数,障碍组作为参数。最后你会得到一本以下形式的字典:{player_in_group1: [] }
那你怎么处理这个名单呢?好吧,它建议您定义自己的本地函数(如果愿意,您也可以将其作为player类的方法)来处理这个问题。下面是我的高级伪代码实现,它与实际代码根本不接近:def handle_collisions(sprite_dict):
'''given sprite dict, moves all entities in group1 out of group2's
rectangle area'''
for p in sprite_dict:
for o in sprite_dict[p]:
# move p in such a way that its rectangle is no longer overlapping
# with the rectangle of o with the additional constraint that p must
# be moved **as minimally as possible.**
我不会为你实现这个功能,因为我觉得最好把挑战留给你。:)不过,我要警告你,逻辑并没有那么简单。
顺便说一句,这种迷宫/地图结构在很多流行的游戏中都有使用,包括塞尔达传奇、帕克曼、轰炸机侠、俄罗斯方块等等。除了你,我不可能把它们都命名为说到点子上。这是一个被证明的方法,因为它将自己无缝地集成到游戏设计中。但别相信我的话,这里有an entire website which explains why tile-based games are so powerful.
方法二:基于顶点边缘的迷宫
注意这个方法很难实现。它纯粹是Graph based.图中的每个空间都是一个节点,玩家可以遍历它。决定一个实体是否允许在两个节点之间移动(换句话说,基于限制的原则的冲突)的是,在底层无向(或有向,如果您愿意)图中,这两个节点之间是否存在边。
我不打算详细解释,因为一个答案很难涵盖。如果你想使用这种方法,你只需要做你自己的研究,但要记住这是很难的,因为Pygame实际上并不支持你的这种策略。如果你真的对此感兴趣,最好从Google开始。
就这样!尝试使用我给你的信息,如果你对此有任何问题,你可以在这里或在The GameDev StackExchange上问另一个问题。在将来当你问一个这样的问题时,试着确保它是一个特定的编程问题否则你很可能会得到很多反对票。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。