2010-09-27 129 views
6

我正在使用canvas在JavaScript中创建一个平台游戏,它完全基于图块。什么是在游戏中存储物品块的最佳方法(墙壁,地板,物品)?事情是每个瓷砖可以被破坏或创建。游戏中关卡的数据结构

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

我宁愿将滚动的模拟器一次放置在一个贴图上。此外,我计划随着用户的移动而随机生成地图,以及是否以前没有生成地图。所以一旦产生了,它应该永远保持这种方式。

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

+0

您的平台在X轴上无限宽吗?为什么你有x = 0的问题?在这种情况下你应该阻止左侧滚动吗? – 2010-09-27 05:42:51

+1

退房http://www.youtube.com/watch?v=_RRnyChxijA – Sharun 2010-09-27 05:46:11

+0

这是无限的。用户应该能够使用相同的图块向左返回。 – Louis 2010-09-27 05:49:19

回答

4

既然你有无限的水平,我会建议一个类似于你已有的结构,稍作调整。

而不是将所有内容都存储在一个大数组中,并且每当用户移动(ouch)时移动该数组中的东西(而不是存储9块地图(每个地图的大小约为屏幕大小的两倍) ,当用户接近当前块的边缘时,处理离屏的块,将所有块移动到左侧,并将新块加载到间隙中。

希望这是明确的,但为了以防万一,这里有一个图:

Chunking

的字母方块是地图的块,并且红色方块是视(我画它稍微有点大,请记住视口小于黑色方块)。随着视口向右移动,您将卸载块B和C,将所有其他块移动到左侧,并将新数据加载到最右侧。由于块的大小是屏幕宽度的两倍,因此用户需要花费时间穿过屏幕来生成/加载这些块。如果用户在世界各地快速移动,则可以使用4x4的块来进行额外的缓冲。

解决返回到以前的地图块。有一对夫妇的方式做到这一点:

  • 写出来的块状物时,他们不再使用(或其他等值是在JavaScript)
  • 扩大你的大块在无限设置硬盘记忆。而不是一个块的数组有一个混合数组,它采用块的x/y位置,并返回块(或null,这表示用户以前从未来过,并且需要生成它)。
  • 程序上生成你的水平,这是复杂的,但意味着一旦块熄灭屏幕,你可以只处理它,有信心,你可以重新准确地再次同一块后
1

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

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

绘画时,您可以计算当前滚动位置x/y处显示哪个图块,当前屏幕宽度下屏幕上将显示多少个图块,并仅绘制您需要的图块。

如果你一次滚动整个瓷砖,那么它很容易。如果它更类似于模拟滚动,则需要对开始绘制的图块中的哪个位置进行更精细的纹理控制,或者可以将整个图块集合绘制到内存位图中,然后使用负值将其绘制到绘图画布上抵消。

1

我一旦确定这事在XML和JSON ...我认为JSON序列化将更快,更高效(更不用说容易)在JavaScript中工作,尤其是JSON可以很好地适应可变长度列表,因为您需要“N”级别在每场比赛中。

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

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

同样,文章说这个区域是最快速变化的,并且不知道WebGL,SMIL + SVG,Canvas + Javascript,好的Flash/Actionscript还是别的什么东西都是最适合你的路线,取决于您的需求和您正在开发的游戏类型。