1

私は JavaScript と HTML が初めてで、小さなゲームに取り組んでいます。

キャンバス上の位置が配列'enemyX'および'enemyY'の値によって決定される4 つの「敵」があります。

非常に簡単に言えば、敵が「衝突」したかどうか、つまり互いに移動したかどうかを検出したい30px(敵の画像は 30px x 30px)。

私がしたいのは、配列内のi番目の値の値を同じ配列内の他の値で減算し、この値が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;
}

このコードにより、空白のキャンバスが表示されます。

4

4 に答える 4

1

関数を使用できます:

function colliding(x1, y1, x2, y2){
  return Math.abs(x1-x2) <= 30 && Math.abs(y1-y2) <= 30;
}

次に、関数を使用して、(1,2)、(1,3)、(1,4)、(2,3)、(2,4)、および (3,4) のさまざまな敵の組み合わせをテストします。

したがって、たとえば、次のように使用します:colliding(enemyX[2], enemyY[2], enemyX[3], enemyY[3])敵 2 と 3 が衝突しているかどうかを確認します。上記のすべての組み合わせでそれを行います。

編集:読みやすくするために、追加の関数を定義できます:

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)
于 2013-05-17T04:25:03.630 に答える
1

混乱がないように、あなたの質問に対する私の理解をもう一度述べます。並列に 2 つの配列があり、1 つは x コード用、もう 1 つは y コード用です。各船には、両方の配列に要素があります。

したがって、たとえば、船 12 は xPos[12] と yPos[12] で見つけることができます。xPos と yPos は上記の配列です。

これがコミュニケートであることも当然です。船[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)

            }
      }

 }

上記のコードは、すべての船を他のすべての船と 1 回比較します。ship[1] と ship[8] は比較されますが、ship[8] と ship[1] は比較されません。

私はこのコードのどれもテストしていませんが、あなたが正しい方向に進むことを願っています. もう質問がある場合は、コメントをください。

于 2013-05-17T05:39:19.163 に答える
0

以下のあなたの質問に対する私の理解によると、私の解決策は次のとおりです。

2点間の距離を見つける必要があると思います。距離を使用することで、ロジックを適用できます。距離を求めるには、次の式を使用します。

2 つの点 (x1, y1) と (x2, y2) が与えられると、これらの点の間の距離は次の式で与えられます。

ここに画像の説明を入力

于 2013-05-17T04:17:31.173 に答える