游戏关卡的数据结构

时间:2010-09-27 05:32:03

标签: javascript data-structures

我正在使用canvas在JavaScript中创建一个平台游戏,它完全基于磁贴。在游戏中存储物品块的最佳方法是什么(墙壁,地板,物品)?事情是每个瓷砖都可以被销毁或创建。

目前我有一个2D阵列,所以我能够快速检查一个项目是否在特定的X& Y位置。这个问题是当用户移动并且地图需要滚动时,我需要重新分配每个块。当项目在x = 0时会发生什么?我不能使用负面索引。

我希望一次将滚动模拟作为一个瓦片。另外,我计划在用户移动时随机生成地图,如果之前没有生成过。所以一旦产生了某些东西,就应该永远保持这种状态。

我应该提到的另一点是,它也将是多人游戏。因此,在缓存数据变脏并需要从数据库中获取最新数据之前,将屏幕分块是一个好主意。嘎,我对这一切都很陌生;似乎不可能,任何帮助都非常感激。

3 个答案:

答案 0 :(得分:4)

由于你有无限的等级,我会建议一个与你现有的结构类似的结构,并略微调整。

不是将所有内容存储在一个大数组中,而是在每次用户移动(ouch)时移动内部数据,而不是存储9块地图(每个地图的大小使其大约是屏幕大小的两倍),当用户接近当前块的边缘时,处理屏幕外的块,移动所有块,并将新块加载到间隙中。

希望这很清楚,但为了以防万一,这是一个图表:

Chunking

字母方块是地图的块,红色方块是视口(我把它画得有点太大,记得视口小于黑色方块)。当视口向右移动时,您卸载块A B和C,移动所有其他块,并将新数据加载到最右边的块中。由于块是屏幕宽度的两倍,因此您有时间跨越屏幕以生成/将级别加载到这些块中。如果用户快速移动世界,您可以使用4x4组块进行额外缓冲。

解决返回上一个地图块的问题。有几种方法可以做到这一点:

  • 当硬盘不再使用时(或任何与javascript相同的硬盘)写出硬盘块。
  • 在内存中无限扩展您的chunk set。而不是一个块数组有一个assosciative数组,它采取块的x / y位置,并返回块(或null,表示用户以前从未在这里,你需要生成它)。
  • 程序上生成你的关卡,这很复杂,但意味着一旦一个块离开屏幕,你就可以处理它,并确信你可以在以后再次重新生成完全相同的块。

答案 1 :(得分:1)

显然有很多方法可以做到这一点。

如果它们的级别不是太大,您可以保留2d数组的原始设计并使用变量来存储当前的x / y滚动位置。这意味着您始终将所有地图信息存储在内存中,并且只能访问您需要在屏幕上显示的部分。

在绘画时,您可以确定哪个图块在当前滚动位置x / y处可见,屏幕上有多少图块与当前屏幕宽度相符,并且只绘制您需要的图块。

如果你一次滚动整个瓷砖,那么它很容易。如果它是一个更模拟的滚动,你将需要更精细的颗粒控制你开始绘制的图块中的位置,或者你可以欺骗并将整个图块集绘制到内存位图中,然后将其加到绘图画布中以负面偏移量。

答案 2 :(得分:1)

我曾经用XML和JSON定义了这个东西...我认为JSON序列化在JavaScript中使用起来会更快更有效(更不用说简单了),特别是因为JSON非常适合可变长度列出你在每场比赛中所需的“N”级别。

使用标准格式还可以使其更具可重用性,并且(理想情况下)鼓励更多协作(如果这是您正在寻找的)。您可以查看我首次尝试创建Video Game schema for level structure

正如fileoffset所说,有很多方法可以做到这一点,但我强烈建议将你的关卡数据(即概念)与渲染分开(即运动中的对象,路径,速度,时间,x / y / z合作纵坐标等......)。

同样,正如文章所说,区域变化最快,并且无论WebGL,SMIL + SVG,Canvas + Javascript,好的'Flash / Actionscript或其他东西都是最适合您的路径,取决于根据您的需求和您正在开发的游戏类型。