简单的游戏设计:我害怕大量的循环
Posted
技术标签:
【中文标题】简单的游戏设计:我害怕大量的循环【英文标题】:Simple game design: I'm scared of tons of loops 【发布时间】:2015-07-10 09:53:52 【问题描述】:我开始制作一个简单的 2D 游戏,而不是使用 C++ 和 SFML 库在 LAN 上运行。游戏每帧都使用典型的更新函数及其循环来更改对象的状态。游戏类存储玩家和怪物的矢量/列表以及两张地图(一张用于图块集 - 仅图形,第二张用于保存地形机制 - 墙壁、地面等)。
在循环中,我在每个怪物上调用 Think()
函数(它确实移动/跳跃/攻击等)(不同的怪物行为不同,但都继承自抽象类 Monster
并具有适当的覆盖)。
问题是:
-
对于每个怪物,我需要遍历所有其他对象以检查碰撞
我需要为每个怪物找到附近的物体(通过它的坐标),这样怪物就可以根据它看到的东西来行动
对于每个非生命物体(如飞行的火球、任何其他射弹),我需要根据经过的时间更新其坐标(这很容易),但再次检查碰撞
对于每个玩家,我需要遍历所有其他玩家/非生物/怪物以收集有关附近物体的信息,以便向他们发送适当的游戏状态。
我害怕这个游戏会有多少循环/嵌套循环。 我已经看到一些游戏实现了基于小实例的地图世界,因此循环总是通过少量数据,并且由于每张地图都是分开的,因此很容易找到任何东西/向玩家发送更新。
我可以轻松地将这种方法应用到每一层,但第 0 层仍然非常大(排列大约 5000x5000 个瓷砖以供行走)。
我现在正在考虑将世界地图数组更改为通过坐标存储对每个对象的引用的类。我刚刚想到了一个想法,即按对象的坐标对对象进行排序可以提高循环的性能甚至替换它们。
这是一个正确的设计吗?还是有更好的主意?
【问题讨论】:
【参考方案1】:您不必担心很多循环。一旦遇到问题,您始终可以优化。
但是对于碰撞,您应该避免将每个对象与所有其他对象进行检查,因为这将需要 n^2 次检查。不过,这仅适用于您确实遇到性能问题的情况。如果发生这种情况,默认方法是使用网格,每帧更新一次(或更少)以计算每个对象在网格中的位置。这意味着您的每个单元格都将了解其中的所有对象。 然后,如果您想查找单个对象的碰撞,只需检查它,对象在同一单元格中和相邻单元格中。
如果您有大量对象,您可以考虑动态调整网格,例如可以通过四叉树来实现。但在大多数情况下,一个简单的静态定义网格就足够了。
【讨论】:
好吧,我有一个包含网格的碰撞,但它在游戏中实际上是恒定的,如果我遇到性能问题,我会尝试更新它 别担心 Xeverous 几年前我也想过这个问题,但是现在有了计算机的强大功能,您无需担心,Howlowl 是正确的,您唯一应该担心的就是正在做碰撞检测。我会创建一个覆盖屏幕的大矩形,然后只检查其中的任何内容。我知道 Howlowl 已经说过了,我只是想支持他 :)以上是关于简单的游戏设计:我害怕大量的循环的主要内容,如果未能解决你的问题,请参考以下文章
分支与循环语句练习——用C语言设计一个猜数字游戏吧(随机数的生成)