【问题标题】:Most efficient way to save tile data of an isometric game保存等距游戏平铺数据的最有效方法
【发布时间】:2010-04-02 12:06:06
【问题描述】:

我正在为支持<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

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

【问题讨论】:

  • 图片+1 :)
  • +1 很好的问题。对游戏也很感兴趣。
  • +1 不仅是图片,还有问题的整体清晰度。很高兴看到有人花时间彻底提出问题。

标签: javascript isometric


【解决方案1】:

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

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

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

是的。您需要使用Bitwise Operations

如果您使用前 16 位作为 height 和其余 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);

【讨论】:

  • +1,但存储角高度而不是单元格高度,以避免歧义。
  • 太棒了!谢谢!我会尝试实现这一点。还有一个想法来完成您的答案:是否可以将 heighttile ID 存储为整数?
  • 很好的解决方案。虽然,CPU 比存储每个角落的高度更昂贵。 (要确定所有角落的高度,它应该进行 9 次高度查找,以及它们的位移。)
  • @Pindatjuh 根据允许的环境,很可能只需要 4 次查找。上面的例子只使用 require 4 ,这比存储每个顶点的高度具有空间优势
【解决方案2】:

是的,您可以:

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

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

【讨论】:

    【解决方案3】:

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

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

    要获得最左边的高度,您可以使用((0xAABBCCDD &amp; 0xFF000000) &gt;&gt; 24) &amp; 0xFF,它返回 170 (0xAA)。

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

    【讨论】:

    • 您当然可以这样做,但请记住,Javascript 对所有数字都使用浮点数,因此您在 C++ 中获得的效率或其他任何东西都不适用。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 2010-09-23
      • 1970-01-01
      • 2012-03-15
      • 1970-01-01
      相关资源
      最近更新 更多