保存等距游戏数据的最有效方法

问题描述:

我正在研究支持<canvas>的快速浏览器的等距游戏,这非常有趣。为了节省每瓦的信息,我使用包含代表瓷砖的ID,像数字的二维数组:保存等距游戏数据的最有效方法

var level = [[1, 1, 1, 2, 1, 0], 
      [0, 1, 1, 2, 0, 1], 
      [0, 1, 1, 2, 1, 1]]; 

var tiles = [ 
    {name: 'grass', color: 'green'}, 
    {name: 'water', color: 'blue'}, 
    {name: 'forest', color: 'ForestGreen'} 
]; 

到目前为止,它的伟大工程,但现在我想的高度和坡度像在这张照片的工作: alt text http://harmen.no-ip.org/isometrictiles.png

对于每个瓷砖,我需要保存它的瓷砖ID,高度和有关哪些角落向上转移的信息。

我想出了所有四个角落的按位表示一个简单的想法,就像这样:

1011 // top, bottom and left corner turned up 

我的问题是:什么是最有效的方式来保存这三个值,每个单元?是否可以将这三个值保存为一个整数?

+8

+1为图片:) – cletus 2010-04-02 12:08:22

+4

+1优秀的问题。对游戏感兴趣。 – 2010-04-02 12:13:51

+1

+1不仅是图片,而且是问题的整体清晰度。很高兴看到有人花时间彻底询问问题。 – Ricket 2010-04-05 21:33:32

如果你正在尝试做一些类似于图片的事情,你不需要存储哪些角落是向上/向下,因为它可以从周围的图块中推导出来。

例如,如果当前瓦片是高度n,并从当前瓷砖瓷砖一起来的高度是高度n+1那么目前的瓷砖必须有“右上角向上”

太好了!谢谢!我会尽力实现这一点。还有一个想法来完成你的答案:是否可以将高度和图块ID存储为整数?

是。您将需要使用Bitwise Operations

如果您使用的是高度的前16位和id其余

var id = tile & 0x0000FFFF; //mask the first 16 bits 
var height = tile >>> 16; //shift the first 16 bits to the right 

设置可以用类似的马纳尔

tile &= 0xFFFF0000; //remove id bits 
tile |= id; //set new id 

tile &= 0x0000FFFF; //remove height bits 
tile |= (height << 16); 
+5

+1,但存储角高而不是单元高度,以避免含糊不清。 – 2010-04-02 12:12:17

+0

太棒了!谢谢!我会尽力实现这一点。还有一个想法来完成你的答案:是否可以将“height”和“tile ID”存储为整数? – Harmen 2010-04-02 12:18:49

+0

伟大的解决方案。尽管比存储每个角落的高度更昂贵。 (要确定所有角落的高度,它应该进行9次高度查找,以及它们的位移。) – Pindatjuh 2010-04-02 13:01:06

如果进行划分的高度和ID之间平等的整数高度在[0,255]范围内,您可以使用位操作在单个整数中保存4个高度。在十六进制:

0xAABBCCDD,AA =第一高度,BB =第二,等等。

为了得到最左边的高度,你会做((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF,返回170(和0xAA)。

要设置:integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);

+0

您当然可以这样做,但请记住,JavaScript对所有数字都使用浮点数,所以您在C++中获得的效率或无论什么都不适用。 – Pointy 2010-04-02 12:33:44

是的,你可以:

var corners = 11; // binary 1011; 
var topCornerUp = corners & 0x8; 
var bottomCornerUp = corners & 0x2; 

如果你想优化它,不过,考虑什么Yacoby said - 你可以改为存储保存它们的角阵列分别为每个瓷砖。

面积是否为矩形?如果是这样,您可以简单地存储区域的宽度和高度,拼贴长度和表示顶点高度的整数数组。