Javascript敌人跟随玩家

Javascript敌人跟随玩家,javascript,Javascript,我正在为一个大学项目编写一个lil js游戏。 我有一个2d地图,我可以用箭头移动我的播放器。敌人每5秒繁殖一次,并由以下功能引导: enemy.updatePosition = function() { if(enemy.isAttacking === false) { var diffX = Math.floor(player.x - enemy.x); var diffY = Math.floor(player.

我正在为一个大学项目编写一个lil js游戏。 我有一个2d地图,我可以用箭头移动我的播放器。敌人每5秒繁殖一次,并由以下功能引导:

enemy.updatePosition = function() {
    if(enemy.isAttacking === false) {           
            var diffX = Math.floor(player.x - enemy.x);
            var diffY = Math.floor(player.y - enemy.y);

            //security distance by player --> superEnemy type 1 uses arrows
            var distance = getDistanceBetweenEntities(player, enemy);
            var gap = 20;


            enemy.pressingRight = diffX > gap;
            enemy.pressingLeft = diffX < -gap;
            enemy.pressingDown = diffY > gap;
            enemy.pressingUp = diffY < -gap;

            enemy.isStopped = false;


                if(enemy.speedX < 0)
                    enemy.speedX = - enemy.speedX;
                if(enemy.speedY < 0)
                    enemy.speedY = - enemy.speedY;
                //bumpers check if hitting a wall or end of map
                var rightBumper = {x:enemy.x + 15, y:enemy.y};
                var leftBumper = {x:enemy.x - 15, y:enemy.y};
                var upBumper = {x:enemy.x, y:enemy.y - 25};
                var downBumper = {x:enemy.x, y:enemy.y + 20};

                if(currentMap.isPositionWall(rightBumper)) {
                    enemy.x -= 1;
                } else {
                    if(enemy.pressingRight)
                        enemy.x += enemy.speedX;
                }
                if(currentMap.isPositionWall(leftBumper)) {
                    enemy.x += 1;
                } else {
                    if(enemy.pressingLeft)
                        enemy.x -= enemy.speedX;
                }

                if(currentMap.isPositionWall(downBumper)) {
                    enemy.y -= 1;
                } else {
                    if(enemy.pressingDown)
                        enemy.y += enemy.speedY;
                }
                if(currentMap.isPositionWall(upBumper)) {
                    enemy.y += 1;
                } else {
                    if(enemy.pressingUp)
                        enemy.y -= enemy.speedY;
                }

                //set position again if the center of the draw 
                //of enemy goes out of map's limits
                if(enemy.x  < enemy.width/2)
                    enemy.x  = enemy.width/2;
                if(enemy.x  > currentMap.width - enemy.width/2)
                    enemy.x  = currentMap.width - enemy.width/2;
                if(enemy.y < enemy.height/2)
                    enemy.y = enemy.height/2;
                if(enemy.y > currentMap.height - enemy.height/2)
                    enemy.y = currentMap.height - enemy.height/2;

        }
    }
}

结果是敌人开始重叠,尤其是当他们进行攻击时(x和y在攻击过程中不会改变)。有没有一种简单的方法可以在不检查大量碰撞的情况下避免这种情况?谢谢大家

有更多选项供您选择,但这里有一个简单的碰撞检测。 首先,你需要让每个
敌人都独一无二,就像给他们每个人一个独一无二的名字一样。这不需要像enemy1、enemy2等那样复杂。。。。Enemy 223。您可以在生成敌人的位置执行此操作,如下所示:

因此,您可以这样访问它:

重要提示:你应该写一些类似的位置,每当“敌人”改变位置或每次打勾时都会更新。

制作一个数组,你可以将每个
敌人的位置写入其中。我知道这不是最好的选择,但它很简单,现在就可以了。

之后,将所有敌人写入阵列(只需在繁殖时执行)。我想指出的是,以下不是好的做法。

接下来,您需要使用每个
敌人
更新阵列中的位置。这只是一个例子,您可以通过多种方式完成,甚至可以自动完成此过程

function updatePstns(id, position){
    pstns[id][Object.keys(pstns[id])[0]] = position;
    //just in case:
    return pstns;
}
//updating first enemy:
updatePstns(0, enemy.position);
现在是碰撞:

函数checkCollision(){
var计数=0;
pstns.forEach(函数(e){
对于(i=0;i 1){
log('敌人'+pstns[e]+'与'+count+'敌人'碰撞);
}
});
}

您能解释一下为什么需要避免碰撞检测吗?我的错。我没有时间创建另一个碰撞检测系统。我想重用测试两个矩形之间碰撞的那个。我的意思是我现在不能创建另一个系统。如果你只存储ememies的当前位置,你可以简单地检查它们是否重复。谢谢creyD。你将如何翻译它们?你对如何在不与游戏边界发生冲突的情况下实现它有什么想法吗?我想@MisterM实现的解决方案与我建议的非常相似,你应该去看看。但是如果你不能生活在碰撞检测中,那么你应该考虑到敌人总是走不同的路径,不会自动碰撞。谢谢,我终于找到了解决方法。
enemy['name'] = 'enemy' + i++;
enemy.name;
enemy['position'] = enemy.x+','+enemy.y;
var pstns = [];
var pstnsObj = {};
pstnsObj[enemy.name] = enemy.position;
pstns.push(pstnsObj);
function updatePstns(id, position){
    pstns[id][Object.keys(pstns[id])[0]] = position;
    //just in case:
    return pstns;
}
//updating first enemy:
updatePstns(0, enemy.position);
function checkCollision(){
    var count = 0;
    pstns.forEach(function(e){
        for(i=0; i<pstns.length; i++){
            if(pstns[e][Object.keys(pstns[e])[0]] == pstns[i][Object.keys(pstns[i])[0]]){
               count++;
            }
        }
        if(count > 1){
            console.log('enemy ' + pstns[e] + 'collides with ' + count + 'enemies');
        }
    });
}