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]) 

这是直接的 ORs(||),+50 在小于的一侧。这意味着只要子弹不在碰撞箱中,它实际上应该触发为真。我怀疑您希望将 +50 放在大于一侧,并将 ORs(||) 改为 ANDs(&&)。

于 2012-12-12T14:52:53.963 回答
0

除了 Ben 的更正之外,为了将来参考,最好进行线线碰撞检测,而不是点盒碰撞检测。

这样做的原因是,假设你的敌人很小,而你的子弹移动得很快。子弹总是有可能在一帧中出现在敌人之前,然后在下一帧中出现在敌人后面,因此永远不会被记录为命中。

测试与子弹路径的相交和敌人的假想线将更加准确。

于 2012-12-12T19:31:59.293 回答