32

我正在为支持 的快速浏览器开发等距游戏<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

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

4

4 回答 4

14

如果您正在尝试执行类似图片的操作,则无需存储哪些角是向上/向下的,因为它可以从周围的图块中推断出来。

例如,如果当前图块是高度n,并且从当前图块向上的图块的高度是高度n+1,则当前图块必须具有“顶角向上”

伟大的!谢谢!我会尝试实现这一点。还有一个想法来完成您的答案:是否可以将高度和图块 ID 存储为整数?

是的。您将需要使用按位运算

如果您使用高度的前 16 位和 id 的其余部分在 height 和 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);
于 2010-04-02T12:08:43.770 回答
3

是的你可以:

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

但是,如果您想优化它,请考虑Yacoby 所说的 - 您可以存储一个角数组,而不是为每个图块单独保存它们。

于 2010-04-02T12:13:07.370 回答
0

如果高度在 [0, 255] 范围内,您可以使用位操作将 4 个高度保存在单个整数中。十六进制:

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

要获得最左边的高度,您将((0xAABBCCDD & 0xFF000000) >> 24) & 0xFF返回 170 (0xAA)。

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

于 2010-04-02T12:10:34.937 回答
0

面积是长方形的吗?如果是,您可以简单地存储区域的宽度和高度、平铺长度和表示顶点高度的整数数组。

于 2010-04-02T12:14:58.640 回答