2015-07-10 25 views
0

我开始制作一个简单的2D游戏,而不是使用C++和SFML库在局域网上运行。游戏使用每个帧的典型更新函数及其循环来改变对象的状态。游戏类存储玩家和怪物的矢量/列表以及两个地图(一个用于tileset - 仅用于图形,第二个用于存放地形力学 - 墙壁,地面等)。我在每个怪物上调用一个Think()函数(它会移动/跳跃/攻击等)(不同的怪物表现不同,但是所有这些函数都使用适当的覆盖继承自抽象类Monster)。简单的游戏设计:我害怕大量的循环

的问题是:

  1. 对于每一个怪物我需要遍历所有其他对象来检查冲突
  2. 对于每一个怪物,我需要找到附近的对象(其coords)使用这样的怪物可以表现根据什么是看到
  3. 对于每一个无生命的物体(如飞行的火球,任何其他抛射)我需要根据时间的推移,以更新其COORDS(这很容易),但再次检查碰撞
  4. 对于每一个球员,我需要循环所有其他球员/不n-lived /怪兽收集关于近物体的信息,以便向他们发送适当的游戏状态。

我很害怕这个游戏会有多少个循环/嵌套循环。
我已经看到一些游戏实现基于小型实例的地图世界,因此循环总是经历少量数据,并且因为每个地图都是分开的,所以很容易找到任何东西/向玩家发送更新。

我可以轻松地将这种方法应用于每个楼层,但楼层0仍然非常大(排列在5000x5000左右的瓷砖上)。

我现在正在考虑将世界地图数组更改为通过坐标存储对每个对象的引用的类。我只是想出了一个想法,即通过它们的坐标对物体进行排序可以提高循环的性能,甚至取代它们。

这是一个正确的设计?或者确实存在一个更好的主意?

回答

1

你不应该担心很多循环。一旦遇到问题,您可以随时进行优化。

但是,对于碰撞,你应该避免检查每个对象与其他所有对象,因为这将需要n^2检查。不过,这只适用于遇到性能问题的情况。如果发生这种情况,默认方法是使用网格,每个网格更新一次(或更少),以计算网格中每个对象的位置。这意味着你的每个单元都会知道它中的所有对象。 然后,如果您想查找单个对象的碰撞,则只需检查它,并将对象放在同一单元格中和相邻单元格中。

如果你有大量的对象,你可能会考虑动态调整网格,例如可以通过四叉树实现。但是在大多数情况下,一个简单的静态定义的网格就足够了。

+0

好吧,我有一个网格contaning碰撞,但它实际上在游戏过程中,我会尝试更新它,如果我得到性能问题 – Xeverous

+0

不要担心Xeverous我也想到几年前,但与计算机的力量这些天你不需要担心,Howlowl是正确的,唯一需要担心的是做碰撞检测。我只想创建一个覆盖屏幕的大矩形,然后只检查其中的任何内容。我知道Howlowl已经说过,我只是想支持他:) – Canvas