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

时间:2010-04-02 12:06:06

标签: javascript isometric

我正在开发支持<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 个答案:

答案 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)

该区域是矩形的吗?如果是,您可以简单地存储区域的宽度和高度,图块长度和表示顶点高度的整数数组。