【问题标题】:Iterating array over array without duplicates在没有重复的数组上迭代数组
【发布时间】:2017-03-14 19:47:39
【问题描述】:

我正在编写一个带有简单碰撞检测系统的简单游戏。

我目前有这段代码用于在同一个数组上迭代数组,因此我可以检查对象是否彼此靠近以及它们是否会发生碰撞:

var objects = []; //assume this is not empty


for(i=0;i<objects.length;i++){
  for(a=0;a<objects.length;a++){
    if(a != i){
      //collision handling
    }
  }
}

但是这段代码的主要问题是我有重复。 例如,我检查 i 和 a 但稍后我检查 a 和 i 具有相同的值。

我尝试使用一个数组来保存哪些对象与哪些对象一起检查,但它给了我一个很大的 fps 下降。

最好的方法是什么?

【问题讨论】:

  • objects数组的内容是什么?
  • 它只是一个数组,其中包含具有 x 位置、y 位置、半径以及 x 和 y 向量的圆。

标签: javascript arrays loops iteration game-engine


【解决方案1】:

在第一个 for 循环的当前位置开始第二个 for 循环:

for(i=0;i<objects.length;i++){
    for(a=i+1;a<objects.length;a++){
      //collision handling
    }
}

这样您只检查数组中的每个项目与当前项目之前的项目。

让我们检查您的原始代码:

objects = ['a', 'b', 'c']
for(i=0;i<objects.length;i++){
  for(a=0;a<objects.length;a++){
    if(a != i){
      console.log("Checking "+ objects[i]+ "vs. "+objects[a]);
    }
  }
}

现在,让我们看看我的例子:

objects = ['a', 'b', 'c']
for(i=0;i<objects.length;i++){
  for(a=i+1;a<objects.length;a++){
    console.log("Checking "+ objects[i]+ "vs. "+objects[a]);
  }
}

一般的想法是仅将每个项目与数组中跟随的项目进行比较:

[a, b, c, d]
 a => vs b, c, d    ar[0] vs ar[1], ar[2], ar[3]
    b => vs c, d    ar[1] vs        ar[2], ar[3]
       c => vs d    ar[2] vs               ar[3]

【讨论】:

  • 这不是相同的代码,这更好,因为它没有进行相同的检查......
  • @Roberrrt,这不是。这样,您就不会对对象 [2] 与对象 [5] 以及以后的对象 [5] 与对象 [2] 进行重复检查。
  • @epascarello,关于否决票的任何想法?
  • 这不能解决我的问题。
  • 那么你的问题是如何检查两个对象是否相等?
【解决方案2】:

如果你可以使用 ES2015,Set 只允许集合的唯一成员。来自 MDN:

Set 对象允许您存储任何类型的唯一值,无论是原始值还是对象引用。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set

[...new Set(objects)]

【讨论】:

  • 我认为您误解了 OP 的需求。 OP 并没有要求防止重复的方法。 OP 需要一种方法来进行独特的比较(不进行两次相同的比较)。
  • 哦,我发布答案时还不清楚。感谢@devlincarnate 清理它
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2018-02-24
  • 2021-12-28
相关资源
最近更新 更多