Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 画布游戏:碰撞检测_Javascript_Html_Canvas_Html5 Canvas - Fatal编程技术网

Javascript 画布游戏:碰撞检测

Javascript 画布游戏:碰撞检测,javascript,html,canvas,html5-canvas,Javascript,Html,Canvas,Html5 Canvas,对于我的教育,我必须用HTML5画布制作一个基本的游戏。这个游戏是射击游戏。当你可以向左->向右移动时,空间被射出。当我开枪时,子弹会向上移动。敌人向下移动。当子弹击中敌人时,敌人必须消失,它将获得+1分。但是当敌人出现在屏幕上时,它就会消失 演示: 空间=射击+敌人出现 这是我的代码: for (i=0;i<enemyX.length;i++) { if(enemyX[i] > canvas.height) {

对于我的教育,我必须用HTML5画布制作一个基本的游戏。这个游戏是射击游戏。当你可以向左->向右移动时,空间被射出。当我开枪时,子弹会向上移动。敌人向下移动。当子弹击中敌人时,敌人必须消失,它将获得+1分。但是当敌人出现在屏幕上时,它就会消失

演示:

空间=射击+敌人出现

这是我的代码:

            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);
                        }
                    }   
                 }
            }

我想我看到了一个问题。关于碰撞检测,您有以下代码

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

这是直线ORs(| |),并且+50位于小于一侧。这意味着,每当子弹不在命中框中时,它实际上应该触发为true。我怀疑您希望将+50设置在大于的一侧,而将ORs(| |)设置为ANDs(&&&)。

关于Ben的修正,为了将来的参考,最好进行直线碰撞检测,而不是点框碰撞检测

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


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

我想为非常具有描述性的主题“击中时移除敌人”给出+1,但为了SOs的缘故不能这样做!那你到底想要什么?如果你想要什么,请发表适当的问题。更适合问题的具体内容是什么?情况描述得很好,代码块看起来很相关-您遇到了什么问题?分数不是迭代的吗?敌人没有消失吗?这个东西会崩溃吗?你应该考虑自我维护对象来代表你的子弹/敌人等。
                  if(bulletX[i] + 50 < enemyX[ib] ||
                          enemyX[ib] + 50 < bulletX[i] ||
                           bulletY[i] + 50 < enemyY[ib] ||
                           enemyY[ib] + 50 < bulletY[i])