Javascript 将数组中的值相互比较

Javascript 将数组中的值相互比较,javascript,Javascript,我不熟悉JavaScript和HTML,正在开发一个小游戏 我有四个“敌人”,它们在画布上的位置由数组“enemyX”和“enemyY”中的值决定 非常简单,我想检测敌人是否已经“碰撞”,也就是说,他们已经在彼此的30px范围内移动(敌人的图像是30px乘以30px) 我要做的是将数组中的I第th个值与同一数组中的其他值相减,看看该值是否小于30。小于30部分是一个if语句,那么我如何在没有很多代码行的情况下将所有值相互减去呢 以下是我根据以下答案所做的尝试: var count = 0

我不熟悉JavaScript和HTML,正在开发一个小游戏

我有四个“敌人”,它们在画布上的位置由数组“enemyX”和“enemyY”中的值决定

非常简单,我想检测敌人是否已经“碰撞”
,也就是说,他们已经在彼此的
30px
范围内移动(敌人的图像是30px乘以30px)

我要做的是将数组中的I第th个值与同一数组中的其他值相减,看看该值是否小于30。小于30部分是一个if语句,那么我如何在没有很多代码行的情况下将所有值相互减去呢

以下是我根据以下答案所做的尝试:

    var count = 0;
var innercount = 0;

while (count <= 3) {

    while (innercount<=3) {
        collisionDetect(count, innercount, enemyX[count], enemyY[count], enemyX[innercount], enemyY[innercount])
        innercount++
    }
    count++    
}

var i = 0;
while (i < enemyX.length) {

    if (collisionX[i] == 1) {
        directionX  = directionX*-1;
    }

    if (collisionY[i] == 1) {
        direction = directionY*-1;
    }
}


}



}

function   collisionDetect(count, innercount, x, y, xX, yY ) {


if ((Math.abs(x-xX)) <=30) {
    collisionX[count] = 1
    collisionX[innercount] = 1
}

if ((Math.abs(y - yY)) <=30) {
    collisionY[count] = 1
    collisionY[innercount] = 1
}

return collisionX, collisionY;
}
var计数=0;
var-innercount=0;

根据我对你问题的理解,以下是我的解决方案:

我认为你需要找出两点之间的距离。通过使用距离,你可以应用你的逻辑。 计算距离的公式如下:

给定两点(x1,y1)和(x2,y2), 这些点之间的距离由以下公式给出:


您可以使用以下功能:

function colliding(x1, y1, x2, y2){
  return Math.abs(x1-x2) <= 30 && Math.abs(y1-y2) <= 30;
}
function enemiesColliding(e1, e2){
  return colliding(enemyX[e1], enemyY[e1], enemyX[e2], enemyY[e2])
}
然后使用它:

enemiesColliding(1,2) || enemiesColliding(1,3) || enemiesColliding(1,4) ||
enemiesColliding(2,3) || enemiesColliding(2,4) || enemiesColliding(3,4)

检测两个对象(假设为矩形)之间的交点,位置定义对象的中心

function getRect(x, y, w, h)
{
    var left = x - Math.floor(w / 2),
    top = y - Math.floor(h / 2);

    return {
        left: left,
        top: top,
        right: left + w,
        bottom: top + h
    };
}

function intersects(A, B)
{
    return A.right >= B.left && 
       A.left <= B.right && 
       A.bottom >= B.top && 
       A.top <= B.bottom;
}

alert(intersects(getRect(12, 56, 30, 30), getRect(30, 40, 30, 30))); // true
函数getRect(x,y,w,h) { 左变风量=x-数学楼层(w/2), 顶部=y-数学楼层(h/2); 返回{ 左:左,, 顶:顶,, 右:左+w, 底部:顶部+h }; } 函数相交(A,B) { 返回A.right>=B.left&& A.左=B.顶部和顶部
我要重申我对你的问题的理解,这样就不会有混乱了。 您有两个并行阵列,一个用于x跳线,一个用于y跳线。每艘船在两个阵列中都有一个元素

例如,ship 12可以在xPos[12]和YPO[12]中找到,其中xPos和YPO是上面的阵列

这也是很合理的。如果船[a]与船[b]相撞,那么船[b]就与船[a]相撞了。我认为这会持续3艘以上的船

我首先写一个距离函数

 dist(x1,y1,x2,y2)
 {
     return Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
 }
然后,我将编写代码,在数组中运行。 每个元素必须与其他元素进行一次比较

 var counter = 0;
 var indexOfShipThatHaveCollided = [];
 while(counter < Xpos.length)
 {
      var innerCounter = counter;           
      while(innerCounter < Xpos.length)
      {
            t = dist(Xpos[counter],Ypos[counter],Xpos[innerCounter],Ypos[innerCounter])
            if(t < 30)
            {
                 indexOfShipThatHaveCollided.push(counter)
                 indexOfShipThatHaveCollided.push(innerCounter)

            }
      }

 }
var计数器=0;
var indexofshipthavecollide=[];
while(计数器
上面的代码将每艘船舶与每艘其他船舶进行一次比较。 它会比较ship[1]和ship[8],但不会比较ship[8]和ship[1]

我没有测试这些代码中的任何一个,但我希望它能让您朝着正确的方向前进。
如果您还有问题,请给我一个评论。

考虑澄清您的问题。添加一些代码可能有助于我们正确回答您的问题。
enemyX
enemyY
是否位于敌人对象的中心?您可以使用JSFIDLE轻松共享您的代码。抱歉。问题编辑:)这没有考虑到角落,例如A的左上角与B的右下角相撞。@Jack:true;将检查更改为
,谢谢你的回答。我想做类似的事情,但实际上我想要一些使用循环的东西,以尽量减少我必须编写的代码量。我想我可以将这与john B的loo结合起来p下面是循环内的想法。很抱歉,我是个新手。你说的left:left、top:top等是什么意思?它们是JavaScript中对象声明的一部分,属性名称后面跟一个冒号和值。这段代码似乎还将比较敌方[1]和敌方[1]有一次,给一个值0。有什么解决办法吗?@user2392394:是的,使用
var innerCounter=counter+1
@Eduardo:谢谢,但是如果counter=2,那么innerCounter将只取值3。我还希望innerCounter为1,以便比较所有值。@JohnDoe:你不需要这个。你已经比较了1和2hen counter==1和innerCounter==2。你是对的。很抱歉出现了这个错误,谢谢你纠正它。我不会更新代码。我会留下这个错误,这样其他人就可以从我的错误中学习。谢谢。我想我无法在问题中澄清这一点。我的主要问题是找不到对象之间的距离。我想找到一种方法来解决c将每个对象与其他对象进行比较。