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