我正在开发支持<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
我的问题是:为每个单元格保存这三个值的最有效方法是什么?是否可以将这三个值保存为一个整数?
答案 0 :(得分:14)
如果您正在尝试执行类似图片的操作,则无需存储哪些角落向上/向下,因为它可以从周围的图块中推断出来。
例如,如果当前图块为高度n
,并且当前图块的高度为n+1
,则当前图块必须为“顶部向上”
大!谢谢!我会尝试实现这个。还有一个想法来完成你的答案:是否可以将高度和图块ID存储为整数?
是。您需要使用Bitwise Operations。
如果使用高度的前16位和id
的其余部分在高度和id之间平均分配整数var id = tile & 0x0000FFFF; //mask the first 16 bits
var height = tile >>> 16; //shift the first 16 bits to the right
可以在类似的mannar中完成设置
tile &= 0xFFFF0000; //remove id bits
tile |= id; //set new id
tile &= 0x0000FFFF; //remove height bits
tile |= (height << 16);
答案 1 :(得分:3)
是的,你可以:
var corners = 11; // binary 1011;
var topCornerUp = corners & 0x8;
var bottomCornerUp = corners & 0x2;
如果你想优化它,可以考虑一下Yacoby said - 你可以存储角落的数组而不是为每个瓷砖单独保存它们。
答案 2 :(得分:0)
如果高度在[0,255]范围内,您可以使用位操作在单个整数中保存4个高度。十六进制:
0xAABBCCDD,AA =第一高度,BB =秒等。
要获得最左边的高度,你会做((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF
,返回170(0xAA)。
设置它:integer &= (0x00FFFFFF); /* Clear the value */ integer |= (height << 24);
答案 3 :(得分:0)
该区域是矩形的吗?如果是,您可以简单地存储区域的宽度和高度,图块长度和表示顶点高度的整数数组。