游戏中的层级数据结构

6

我正在使用canvas和JavaScript创建一个完全基于瓷砖的平台游戏。在游戏中,如何存储块和物品(墙壁、地板、物品)是最好的方法?问题在于每个瓷砖都可以被摧毁或创建。

目前,我有一个二维数组,这样我就能够快速检查特定X和Y位置是否有物品。但问题在于当用户移动并且地图需要滚动时,我需要重新分配每个块。而当物品位于x = 0时会发生什么?我不能使用负索引。

我希望滚动是模拟的,而不是一次滚动一个瓷砖。另外,我计划在用户移动时随机生成地图,如果以前没有生成过的话。因此,一旦生成了某些内容,它应该永远保持不变。

还有一点要提到的是,它也将是多人游戏。因此,对屏幕进行分块处理是一个很好的想法,直到缓存数据变得脏,并且需要从数据库获取最新数据。啊,我对这一切都很陌生;看起来似乎不可能,任何帮助都将不胜感激。


你的平台在x轴上是无限宽的吗?为什么x=0会有问题?在这种情况下,你应该只阻止向左滚动吗? - Daniel Vassallo
1
请查看http://www.youtube.com/watch?v=_RRnyChxijA。 - Sharun
它是无限的。用户应该能够使用相同的瓷砖向左返回。 - Louis
3个回答

4
由于你有无限的级别,我建议你使用类似于你已经拥有的结构,但稍作修改。
不要将所有内容存储在一个大数组中,并且每次用户移动时在该数组内移动内容(痛苦),而是将地图分成9个块(每个块的大小大约是屏幕大小的两倍),当用户接近当前块的边缘时,处理掉超出屏幕的块,将所有其他块向左移动,并在空隙中加载新的块。
希望这很清楚,但为了确保,请看下面的图表:
字母方块是地图的块,红色方块是视口(我画得稍微有点大,记住视口比黑色方块小)。当视口向右移动时,卸载A、B和C块,将所有其他块向左移动,并将新数据加载到最右边的块中。由于一个块是屏幕宽度的两倍,因此您有时间让用户穿过屏幕并将关卡生成/加载到这些块中。如果用户快速移动世界,则可以有一个4x4块的集合进行额外的缓冲。
要解决返回到先前地图块的问题,有几种方法:
- 当它们不再使用时,将块写入硬盘(或javascript中的等效项)。 - 在内存中无限扩展块集。而不是一组块的数组,而是具有x/y位置的关联数组,返回该块(或null,表示用户以前从未到达过这里,并且您需要生成它)。 - 过程化地生成您的级别,这很复杂,但意味着一旦一个块离开屏幕,您只需处理掉它,并确信稍后可以再次精确地重新生成相同的块。

1

我曾经在XML和JSON中定义过这个东西... 我认为JSON序列化会更快,更高效(更不用说易于)在JavaScript中使用,特别是因为JSON非常适合变量长度列表,就像你需要的"N"层每个游戏。

使用标准格式也会使它更可重用,并且(理想情况下)鼓励更多协作(如果这是您要寻找的内容)。 您可以查看我的第一次尝试创建{{link1:Video Game模式的级别结构}}。

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

再次强调,正如文章所说,该领域是最快变化的领域,无法确定WebGL,SMIL + SVG,Canvas + Javascript,老式的Flash / Actionscript还是其他东西对您来说是最佳路线,具体取决于您的需求和您正在开发的游戏类型。


1

有很多方法可以实现这个功能。

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

在绘制时,您需要计算出当前滚动位置x/y可见的图块数量以及当前屏幕宽度可以容纳的图块数量,然后只绘制所需的图块。

如果您每次整个图块进行滚动,那么这很容易。如果它是更模拟式的滚动,则需要更好的控制从哪里开始绘制图块,或者您可以作弊并将整个图块集绘制到内存位图上,然后将其与负偏移量一起复制到绘图画布上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接