AS3中游戏的无限地图尺寸

| 最近,我一直在计划如何在无限制尺寸的环境/地图下运行游戏(无限制条件是一个宽松的术语,因为在内存中可以存储多少数据显然存在限制,等等) 。我已经使用\“ grid \”实现了这一目标,该网格包含作为字符串存储的级别数据,可以将其转换为表示对象及其属性的2D数组。 这是两个以字符串形式存储的对象的示例:
\"game.doodads.Tree#200#10#terrain$game.mobiles.Player#400#400#mobiles\"
\“ grid \”是一个3D数组,其内容将表示网格单元的x / y坐标。网格单元将是600x600。 此\“ grid \”数组的示例如下:
var grid:Array = [[[\"leveldata: 0,0\"],[\"leveldata 0,1\"]],
                  [[\"leveldata: 1,0\"],[\"leveldata 1,1\"]]];
该环境将处理根据给定点加载网格正方形及其周围的8个正方形。即玩家的位置。它将具有以下功能
function loadCells(xp:int, yp:int):void
这也将处理先前加载的单元的卸载,这些单元不再足够接近所需的距离。在卸载过程中,grid [x] [y]处的数据将被新数据覆盖,新数据是通过循环遍历该单元格中的对象并将每个新的数据集附加到网格单元格数据而创建的。 就当您向某个方向移动,卸载/保存单元格以及加载新单元格而言,一切工作正常。问题是这样的: 假设这是一个充满僵尸的大城市。如果您沿任意方向走三个网格正方形并返回,则一切都如您所愿。我正在努力寻找一种方法,至少模拟所有仍在移动并执行其操作的对象。例如,当您投掷手榴弹,走开,返回并且手榴弹仍未爆炸时,它看起来很傻。 在卸载关卡时,我已经考虑过在每个对象上存储一个时间戳,并且在初始化该对象时,有一个循环运行它的“ step”函数次数。这里的问题显然是,当您在5分钟后回来时,有20个僵尸将尝试执行248932489次,游戏将崩溃。 有想法吗?     
已邀请:
我不知道AS3,但让我尝试给您一些提示。 似乎您想建立一个无缝的世界,因为在玩家移动时加载/卸载
cells
。那是个好主意。您在这里应该做的是确定单元格应该加载/卸载的数据(或者,进一步,单元格应该保存或处理的数据)。 例如,手榴弹不应被该单元卸下,因为即使玩家离开该单元后也需要对其进行更新。对于一个单元来说,仅仅因为它们位于单元中就管理所有游戏对象不是一个好主意。相反,玩家对象可以将手榴弹作为拥有者来处理。或者,可能有一个EntityManager可以处理所有游戏实体,例如手榴弹或僵尸。 有了这个想法,即使您的20个僵尸处于未加载区域(它们的位置不再重要)中,您也可以更新它们,而不必立即调用update()248932489领带。但是,您真的需要继续更新僵尸吗?也许,卸载所有这些并生成新的僵尸以及该单元中最新活动的僵尸数量即可。这取决于您的游戏设计,但通常不必更新不可见或与玩家距离不远的实体。希望能帮助到你。祝好运! :D     
有趣的问题。当然,游戏不能精确地模拟无限的环境。如果您离开某个区域几分钟,就不需要精确地模拟僵尸的每一步(或那里的任何演员)。每个游戏都有其自己的简化。也许近似模拟会为您提供帮助。例如,如果幸存者长时间处于重灾区,您的模拟器可以决定他变成了僵尸,而无需计算过程的每一步。或者,如果部落在该城市的某些地方猖ramp,则应随机破坏该部分。     
关于如何处理此问题,我看到了两种方法。 首先:让引擎保持所有活动单元的加载状态,活动意味着存在由对象发起的事件,这些事件涉及单元拥有的对象或玩家拥有的对象(如果您已做出区分)。每次将此类单元格从正常的卸载行为中排除时,都会为其分配一个编号,如果内存用完了,则编号最小的单元格将被卸载。显然,这可能是代码上最困难的方法,但仍然可能是唯一真正实现您所期望的方法。 第二:使用很小的电池,让引擎保持狭窄的路径。然后,单元迁移的大小是100x100,而不是600x600,它们中的36个完成了一个更大的单元所能完成的工作(冒险:在代码方面更加杂乱无章),然后您的播放器实际遍历的每个单元(不是所有已加载以产生自然可见度的单元-范围)会在有限的时间内(即5分钟)保留在内存中,其中包括每个拥有玩家拥有的对象的单元。 我相信您可以在卸货时了解如何检查这些情况,并希望对您有所帮助。     

要回复问题请先登录注册