C++ 如何在C++;游戏 问题

C++ 如何在C++;游戏 问题,c++,game-engine,C++,Game Engine,关于标题,很抱歉,似乎找不到更简短/更好的描述 情况是这样的:我正在制作一个简单的游戏,其中有一个大地图(简单,但尺寸非常大)。这张地图上也有很多敌人,但是行动完全围绕着主角(在一定的半径内,这在地图上只占很小的百分比) 在每一个“滴答声”(或步骤,或任何你称之为“滴答声”)中,都有一个特定的函数在每个对象上调用,以确定它们的下一步移动。出于性能方面的原因,因为我不关心在我的视野之外发生的事情(或者至少是非常遥远的事情),所以我不想在非常陌生的对象上调用该函数 我如何管理这些对象,以确保在地图上

关于标题,很抱歉,似乎找不到更简短/更好的描述

情况是这样的:我正在制作一个简单的游戏,其中有一个大地图(简单,但尺寸非常大)。这张地图上也有很多敌人,但是行动完全围绕着主角(在一定的半径内,这在地图上只占很小的百分比)

在每一个“滴答声”(或步骤,或任何你称之为“滴答声”)中,都有一个特定的函数在每个对象上调用,以确定它们的下一步移动。出于性能方面的原因,因为我不关心在我的视野之外发生的事情(或者至少是非常遥远的事情),所以我不想在非常陌生的对象上调用该函数

我如何管理这些对象,以确保在地图上移动时始终有一个更新的附近对象列表?

(我知道它是用C++来标记的,但是任何语言都可以——我不是在寻找代码,而是更多的关于这个想法)


我已经试过了 我尝试了几种替代方案:

  • 备选方案1:在“区域”中分隔我的地图,并在每个区域中存储敌人列表。问题是当我在这些区域的边缘时,以及(更糟的)当我在拐角处(我周围的4个不同区域)时会发生什么。而且,如果我从一个区域跑到另一个区域,让敌人切换区域会更困难(但我已经想出了一些可行的办法…)
  • 备选方案2:每次我移动
    x
    距离时,扫描整个地图并刷新活动敌人列表。这有点好,因为我不必像备选方案1那样担心大量边界,但我每次都必须扫描整个地图
我现在正在研究备选方案3,即将这两种解决方案混合在一起


但是,我想确保没有更明显的解决方案。

将你的敌人存储在一个区域中,并每隔几次迭代进行一次空间范围搜索。但是,您需要一个相当复杂的实现,它支持条目移动和重新平衡,有时称为自适应k-d树。

好的,如果您能回答以下问题,我相信我们中的一些人可以帮助您选择正确的数据结构和过程。 地图有多大?实际尺寸? 告诉我们一些敌人的密度?平均有多少?我想你会在每一场比赛中使用随机数量的敌人,或者在每一关增加敌人的数量。在任何情况下,你计划拥有的最大敌人数量是多少

只有当所有角色/敌人都四处移动而不是只围绕主角移动时,这才是真正好的。只有这样才能让游戏真正激动人心。我相信你会在移动中使用大量随机数字,但试着看看你是否能为他们的移动想出简单而现实的算法,我没有完全依赖随机移动。我使用了一些随机移动,它们肯定没有什么有趣的地方。也许你可以慢慢地将它们移动到离主角很近的地方,而将它们快速移动到很远的地方。你可以随着等级的增加提高敌人的速度和力量。尽量让它变得刺激。你可以试试凯撒第三个游戏,看看人们的动作有多好,简单的动作但真的很好。
底线是考虑你将如何移动敌人,并尽可能在每次滴答声中移动所有敌人,以使游戏真正令人兴奋

200x200不是很大。对于每个位置,如果它在范围内,更新敌人将起作用,除非您计划在计算器上运行它,或者希望每秒更新1000次


不要过度设计,保持简单。如果您需要,只需简单地进行更改。

IIRC,Minecraft使用备选方案1,因此它肯定是一个可行的解决方案。它一次可以保持多个分区处于活动状态(例如,一个8x8正方形)。这就消除了你在一个区域边缘附近,而你旁边的敌人被冻结在一个非活动区域的问题。我不知道如何回答尺寸问题,但如果主要角色是1x1,那么视觉范围大约是20x20,整个地图超过200x200(因此视觉范围小于地图的1%)。敌人的密度实际上取决于你在地图上的位置。给你一个平均值并不是一个很好的衡量标准,因为包含较少ennemies的区域通常包含具有“更好”AI的ennemies(因此每一步都有更多的资源)。我现在没有任何最高数量的恩尼人。谢谢你的回答。看来我要读点书了(我早就料到了)。非常感谢你的回答。我通常坚持接吻原则。不过,我估计是200x200。这不是平铺游戏,所以我不能给你一个尺寸。但是这个动作在地图上的定位不到1%,而且地图上几乎是以对象/ennemies排列的。这就是我想表达的意思。我无法在每次更新时扫描整个地图(数千个ennemies和环境对象),因为我确实需要经常更新游戏(可能不是1000x/s,但肯定超过30x/s)。但是谢谢你的回答。@1你想支持的尺寸更重要。是200x200吗?2000x2000?20000x2000?200万乘200万?20亿乘20亿?根本不同的应对方式在不同的规模下都是最优的。这不是一个基于平铺的游戏。我可以把它设为1x1或5000x5000,这对我能容纳多少东西或我的算法如何工作没有任何影响(反正没有实际的“单位”)。我只需要相应地调整所有内容的大小(我的视野范围是0.0005x0.0005“单位”或其他任何单位)。如果不清楚的话,我的ennemies不会存储在2D矩阵中。谢谢您的时间,我将使用前面建议的k-d树。