Javascript游戏冲突检测

时间:2019-01-08 15:00:33

标签: javascript arrays collision-detection

我意识到这可能是一个常见问题,但是在查看了其他答案后,我不确定我的实现是否会从这些答案中受益。

我的游戏中,玩家从其X Y位置朝着鼠标X Y位置射击,而敌人则沿Y轴线性下降。

不过,似乎只有第一发或随机发动的屏幕有时会击中并清除敌人,有些子弹会直接击中而又不要求将其清除。

游戏可以在这里看到: https://liammorgan.github.io/wave_defence/

这里是命中检测的代码段,大约20%的时间有效,或者在第一发子弹上起作用。

每个镜头都有X,Y,子弹速度,xVelocity和yVelocity

每个敌人都有X,Y,速度

shot.js -
this.hit = function() {
        for(enemy in enemies) {
            let e = enemies[enemy];
            if(e != null) {             
                if(this.x+this.size > e.x && this.x-this.size < e.x && 
                this.y+this.size > e.y && this.y-this.size < e.y) {
                    enemies[enemy] = null;
                    return true;                    
                } else {
                    return false;
                }
            }
        }
    }

sketch.js -
let shots = [];
let enemies = [];
if(player.lives > 0) {
        player.update();
        player.draw();
        for(shot in shots) {
            let s = shots[shot];
            if(s != null) {                
                if(s.hit() && s != null) {
                    shots[shot] = null;
                    continue;
                }
                shots[shot].update();
                shots[shot].draw();
                if(s.remove() && s != null) {
                    shots[shot] = null;
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:2)

在我看来,在您的碰撞逻辑中,您并没有考虑敌人本身的规模。因此,要计算碰撞次数,射击必须完全击中敌人的确切中心。

一种更好的方法是测量从子弹中心到敌人中心的距离,并检查其大小是否已知,因为敌人和子弹都是圆圈。这也意味着您必须在敌方对象中包含radiussize字段。