【问题标题】:JavaScript: find pairs from an object (not array) - collision detectionJavaScript:从对象(不是数组)中查找对 - 碰撞检测
【发布时间】:2018-01-23 02:16:19
【问题描述】:

我正在使用 Javascript 构建游戏,我需要进行碰撞检测。

游戏中绘制的所有内容都有自己的 ID 并存储在一个对象中。 尽管将数组用作容器,但我还是选择使用对象,因为从中删除子对象很容易。例如,当一颗子弹击中一艘船时,它就会从物体上移开。但是对于一个数组,当一个对象被删除时,所有的孩子都必须移动。拥有 ID 来跟踪所有内容真是太好了。

为了在数组中找到对,我可以这样做:

var a = [];
//Object container

for(var i = 0; i < a.lenght; i++){
    for(var j = i+1; j < a.lenght; j++){
        var object1 = a[i];
        var object2 = a[j];
        //collision detection
    }
}

但是对于一个对象

var o = {};
//Object container

var progress = [];

for(var key1 in o){
    progress.push(key1);
    for(var key2 in o){
        if(progress.indexOf(key2) === -1){
            var object1 = a[i];
            var object2 = a[j];
            //collision detection
        }
    }
}
progress = [];

这比数组丑多了。有没有更好的办法?

【问题讨论】:

  • 船在动吗?
  • 船正在移动。游戏使用 requestAnimationFrame() 制作动画
  • 对象的类型是船只、子弹、岩石和资产。它们具有独立于对象的父子结构。

标签: javascript arrays collision-detection javascript-objects


【解决方案1】:

您可以使用Object.keys 来获取对象中的属性名称。那么它几乎和你的数组版本一模一样:

var keys = Object.keys(o);        // *** Get the keys
for (var i = 0; i < keys.length; i++) {
    for (var j = i + 1; j < keys.length; j++) {
        var object1 = o[keys[i]]; // *** Main change is on
        var object2 = o[keys[j]]; // *** these two lines
        //collision detection
    }
}

注意Object.keys 只列出可枚举的、拥有的 属性。您的 for-in 循环将访问所有可枚举的属性,甚至是继承的属性。但我猜你的 o 没有可枚举的继承属性。

您只需要在添加或删除船只时执行Object.keys,而不是每次需要进行碰撞检测时。

您需要对其进行分析以确定使用对象并在更改时重建键数组是否比使用数组和splice更有效。

【讨论】:

  • 谢谢!这真的很有帮助。
  • 我明白重建密钥数组可能会减慢进程。但就我而言,我更喜欢使用对象,因为我想使用 ID 跟踪对象。
  • @Y.Yoshii:是的,只是标记它以获取信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多