用于简单碰撞检测的Javascript位图



我需要帮助/建议来改进/评论我的当前设计,请:)

这与一个简单游戏中的碰撞检测有关:动态物体(移动物体)可能与静态物体(即地面、墙壁)碰撞。我正在将我的Obj-C模型移植到Javascript,并且在实现这一模型的方式方面面临内存/性能问题。

我使用了一种非常基本的方法:一个数组表示我的物理不透明度水平。

  • 位设置为0:透明区域,身体可以通过

  • 位设置为1:不透明区域,物体碰撞

测试像素的透明度/不透明度简单如下:

if (grid[x][y]) {
 // collide!
}

我对JS的了解在性能/内存方面非常有限,无法评估这种方法有多好:)不知道使用数组的效率。

想象一下一个1000像素宽、600像素高的级别。这是一个小级别,但这已经意味着一个包含1000个数组的数组,每个数组最多包含600个条目。此外,我还没有找到一种方法来确保我像低级语言那样创建一个1位大小的元素。

使用以下内容,我能确定一个条目除了一点之外不是"其他"吗?

grid[x][y] = true;
grid[x][y] = false;

感谢您的时间和意见/建议!

J。

如果你有一个1000x600的网格,你可以保证你的内存中至少有601个数组(如果你反过来做,则有1001个)。

与其这样做,我会考虑使用1个数组,或者(最好)使用一个带有映射方案的对象。

var map = {};
map["1x1"] = 1;
map["1x3"] = 1;
// assume no-hits are empty and free to move through
function canGoIn(x, y) {
    return map.hasOwnProperty(x + "x" + y);
};

或者;

var map = [];
var width = 600;
map.push(0);
map.push(1);
// etc
function canGoIn(x, y) {
    return map[(x * width) + y] == 1;
}

布尔值不会只存储为一位,对于我所知道的任何其他语言(包括C)也是如此。

如果您有内存问题,您应该考虑实现这样的位数组:https://github.com/bramstein/bit-array/blob/master/lib/bit-array.js

你必须把你的2d数组变成一个简单的向量,并像这样转换你的x,y坐标:offset=x+(y*width);

浏览数组仍然会导致计算偏移量的乘法运算,因此使用向量相当于数组。

但我怀疑调用一个函数(以防使用位数组)并在里面进行一些求值会导致性能变差。

我不认为你可以在获得表演的同时节省内存。

最新更新