保存等距游戏数据的最有效方法
我正在研究支持<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
我的问题是:什么是最有效的方式来保存这三个值,每个单元?是否可以将这三个值保存为一个整数?
如果你正在尝试做一些类似于图片的事情,你不需要存储哪些角落是向上/向下,因为它可以从周围的图块中推导出来。
例如,如果当前瓦片是高度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);
如果进行划分的高度和ID之间平等的整数高度在[0,255]范围内,您可以使用位操作在单个整数中保存4个高度。在十六进制:
0xAABBCCDD,AA =第一高度,BB =第二,等等。
为了得到最左边的高度,你会做((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF
,返回170(和0xAA)。
要设置:integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);
您当然可以这样做,但请记住,JavaScript对所有数字都使用浮点数,所以您在C++中获得的效率或无论什么都不适用。 – Pointy 2010-04-02 12:33:44
是的,你可以:
var corners = 11; // binary 1011;
var topCornerUp = corners & 0x8;
var bottomCornerUp = corners & 0x2;
如果你想优化它,不过,考虑什么Yacoby said - 你可以改为存储保存它们的角阵列分别为每个瓷砖。
面积是否为矩形?如果是这样,您可以简单地存储区域的宽度和高度,拼贴长度和表示顶点高度的整数数组。
+1为图片:) – cletus 2010-04-02 12:08:22
+1优秀的问题。对游戏感兴趣。 – 2010-04-02 12:13:51
+1不仅是图片,而且是问题的整体清晰度。很高兴看到有人花时间彻底询问问题。 – Ricket 2010-04-05 21:33:32