我有一个对象列表开始,如果新对象不干扰列表中已经包含的对象,我将向该列表添加新对象(类似于碰撞检测)。我正在尝试创建一个可以检测这种干扰的函数。
我设计它的方式是:如果发生冲突(不直观),则输出“ false”,如果没有冲突,则输出“ true”,因为稍后将在if语句中使用此结果,并且希望它在不发生碰撞的情况下执行语句。该列表称为顶点。可能有很多错误,但是我最困惑的是布尔函数的逻辑以及如何通过if和for循环进行传递。
我期望的结果是,如果新对象干扰列表中已有的任何对象,则该函数将输出'false',并且仅当该对象出现时,它才会输出'true'不会干扰任何元素。但是,我不认为我的代码正在执行我在此描述的操作。 if是否取第一个结果“ true”或“ false”?如果所有结果都为真,则仅输出“真”。我认为这是我问题的症结(我可能会误会)。
可能有一种更有效的方法(如果可以,请通知我!),但是现在我实际上正在使用for循环遍历列表中已经存在的每个元素,然后使用一个if语句。我的代码如下:
function test(x, y, len) {
var k;
for (k=0; k < vertices.length; k++) {
if (((y + len) < (vertices[k][1])) || (y > (vertices[k][1] + vertices[k][2])) || ((x + len) < vertices[k][0]) || (x > (vertices[k][0] + vertices[k][2])))
{
return false
} else
{
return true
}
}
}
碰撞条件本身(“ ...或...或...”)可能存在问题,但我认为并非如此。我认为我上面描述的逻辑有些问题。如果有人能给我一些解释可以解决的问题,将不胜感激。如您所知,我对此很陌生。谢谢!
答案 0 :(得分:1)
将return true
移动到for循环之外。
然后,只有在循环结束而没有先找到结果的情况下,它才会返回true。
function test(x, y, len) {
var k;
for (k=0; k < vertices.length; k++) {
if (((y + len) < (vertices[k][1])) || (y > (vertices[k][1] + vertices[k][2])) || ((x + len) < vertices[k][0]) || (x > (vertices[k][0] + vertices[k][2])))
{
return false
}
}
return true;
}