AS3中游戏的无限制地图尺寸

时间:2011-04-21 03:17:37

标签: actionscript-3

最近我一直在计划如何使用能够无限维度的环境/地图来运行游戏(无限制是松散的术语,因为显然存在内存中可存储的数据限制等)。我使用“网格”实现了这一点,该网格包含存储为String的级别数据,可以将其转换为表示对象及其属性的2D数组。

以下是存储为String的两个对象的示例:

"game.doodads.Tree#200#10#terrain$game.mobiles.Player#400#400#mobiles"

“网格”是3D数组,其内容将表示网格单元的x / y坐标。网格单元格可以是600x600。

这个“网格”数组的一个例子如下:

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]中的数据将被新数据覆盖,新数据是通过循环遍历该单元格中的对象并将每组新数据附加到网格单元数据而创建的。

当您向某个方向移动时,一切正常,单元格被卸载/保存并加载新单元格。问题是:

说这是一个被僵尸骚扰的大城市。如果你在任何方向走三个网格方格并返回,一切都在你离开的时候。我正在努力寻找一种方法来至少模拟所有仍在四处移动并做其事物的物体。例如,当你扔手榴弹,走开,返回并且手榴弹仍然没有引爆时,它看起来很傻。

我考虑在卸载关卡时在每个对象上存储一个时间戳,当它初始化时,有一个循环运行它的“步”功能次数。这里的问题很明显,当你5分钟后回来时,20个僵尸将尝试步骤248932489次,游戏将崩溃。

想法?

3 个答案:

答案 0 :(得分:2)

我不知道AS3,但让我尝试给你一些提示。

似乎你想在玩家移动时加载/卸载cells以创建一个无缝的世界。那是个好主意。你应该在这里做的是决定一个单元应该加载/卸载哪些数据(或者更进一步,单元应该容纳或处理的数据)

例如,手榴弹不应该由手机卸载,因为即使在玩家离开手机后也需要更新手榴弹。 单元格管理所有游戏对象并不是一个好主意,因为它们位于单元格中。相反,玩家对象可以像所有者一样处理手榴弹。或者,可能有一个 EntityManager 可以处理所有游戏实体,如手榴弹或僵尸。

有了这个想法,即使他们处于卸载区域(他们的位置不再重要),你也可以更新你的20个僵尸,而不是一次调用update()248932489 tiems。但是,你真的需要不断更新僵尸吗?也许,卸载它们并使用单元格中最新活动僵尸的数量产生新的僵尸会起作用。这取决于您的游戏设计,但通常情况下,您不必更新与播放器不可见或足够远的实体。希望能帮助到你。祝好运! :d

答案 1 :(得分:1)

有趣的问题。当然,游戏无法精确模拟无限环境。如果你离开某个区域几分钟,你就不需要精确模拟僵尸的每一步(或那里的任何演员)。每个游戏都有自己的简单。也许近似模拟会对您有所帮助。例如,如果幸存者长时间处于严重感染区域,您的模拟器可以决定他变成僵尸,而无需计算过程的每一步。或者,如果部落中的部落猖獗,这部分应该随机损坏。

答案 2 :(得分:1)

我看到了两种方法来处理这个问题。

首先:你有引擎保持任何活动的单元格加载,活动意味着有对象启动的事件涉及单元拥有的对象或玩家拥有的对象(如果你做了这样的区分)。每次将这样的单元从正常卸载行为中排除时,就为其分配一个数字,如果存储器碰巧用完,则将卸载具有最小编号的单元。显然,这可能是代码最难的方法,但它仍然可能是唯一一个真正做到你想要的东西。

第二:使用非常微小的细胞,让发动机保持狭窄的路径。然后,细胞迁移为100x100而不是600x600,其中36个完成一个更大的细胞所做的工作(风险:代码更多的cluttter)然后你的玩家实际穿过的每个细胞(不是所有已加载的细胞产生自然可见性 - 范围)保存在记忆中,包括每个拥有玩家拥有的物体的细胞,时间有限(即5分钟)。

我相信您可以在卸下自己的身体后了解如何检查这些情况,并希望对您有所帮助。