0

私の教育では、HTML5キャンバスで基本的なゲームを作成する必要があります。ゲームはシューティングゲームです。左→右に移動でき、スペースが撃たれたとき。私が撃つとき、弾丸は上に移動します。敵が下に移動します。弾丸が敵に当たると、敵は消えなければならず、+1のスコアを獲得します。しかし、敵は画面に現れた後に消えます。

デモ: http: //jordikroon.nl/test.html

スペース=シュート+敵が現れる

これは私のコードです:

            for (i=0;i<enemyX.length;i++) {

                if(enemyX[i] > canvas.height) {

                    enemyY.splice(i,1);
                    enemyX.splice(i,1);
                 } else {

                    enemyY[i] += 5;
                    moveEnemy(enemyX[i],enemyY[i]);

                 }
            }

            for (i=0;i<bulletX.length;i++) {

                if(bulletY[i] < 0) {
                    bulletY.splice(i,1);
                    bulletX.splice(i,1);
                 } else {

                    bulletY[i] -= 5;
                    moveBullet(bulletX[i],bulletY[i]);

                    for (ib=0;ib<enemyX.length;ib++) {

                      if(bulletX[i] + 50 < enemyX[ib] ||
                              enemyX[ib] + 50 < bulletX[i] ||
                               bulletY[i] + 50 < enemyY[ib] ||
                               enemyY[ib] + 50 < bulletY[i]) 
                        {   
                            ++score;
                            enemyY.splice(i,1);
                            enemyX.splice(i,1);
                        }
                    }   
                 }
            }

オブジェクト:

        function moveBullet(posX,posY) {
            //console.log(posY);
            ctx.arc(posX, (posY-150), 10, 0 , 2 * Math.PI, false);

        }

        function moveEnemy(posX,posY) {

            ctx.rect(posX, posY, 50, 50);
            ctx.fillStyle = '#ffffff';
            ctx.fill(); 
        }
4

2 に答える 2

0

ORIは問題があると思います。衝突検出には次のコードがあります

                  if(bulletX[i] + 50 < enemyX[ib] ||
                          enemyX[ib] + 50 < bulletX[i] ||
                           bulletY[i] + 50 < enemyY[ib] ||
                           enemyY[ib] + 50 < bulletY[i]) 

これはストレートOR(||)であり、+50はより小さい側にあります。つまり、弾丸がヒットボックスにない場合は常にtrueとしてトリガーされる必要があります。代わりに、より大きい側に+50を設定し、代わりにOR(||)をAND(&&)にしたいのではないかと思います。

于 2012-12-12T14:52:53.963 に答える
0

ベンの修正に加えて、将来の参考のために、ポイントボックスの衝突検出ではなく、ライン間の衝突検出を行うことをお勧めします。

この理由は、敵が小さく、弾丸が速く動いているとします。弾丸が 1 つのフレームで敵の前に表示され、次のフレームで敵の後ろに表示される可能性が常にあるため、ヒットとして記録されることはありません。

弾道との交差と敵の仮想線のテストは、はるかに正確になります。

于 2012-12-12T19:31:59.293 に答える