Javascript敌人跟随玩家

时间:2018-01-24 09:33:32

标签: 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.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;

        }
    }
}

所以我的敌人跟随玩家的diffX和diffY值。每个敌人都拥有自己的speedX和speedY,如:

    var random = 1 + Math.random()*7;   //from 1 to 8
    enemy.speedX = random;
    enemy.speedY = random;

结果是敌人开始重叠,特别是当他们进行攻击时(x和y在攻击期间没有变化)。有没有一种简单的方法可以避免这种情况而不检查很多碰撞?谢谢大家

1 个答案:

答案 0 :(得分:1)

您可以选择更多选项,但这里只有一个简单的碰撞检测。 首先,您需要使每个enemy都具有独特性,例如为每个人提供一个独特的名称。这不需要像enemy1,enemy2,.... enemy223那样复杂。你可以在产生敌人的地方做到这一点,如下所示:

enemy['name'] = 'enemy' + i++;

所以你可以像这样访问它:

enemy.name;

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

enemy['position'] = enemy.x+','+enemy.y;

制作一个数组,你可以写出每个enemy的位置。我知道这不是最好的选择,但它很简单,现在也可以使用。

var pstns = [];

之后将每个敌人写入数组(只在spawn中执行)。我想提一下,以下不是好的做法。

var pstnsObj = {};
pstnsObj[enemy.name] = enemy.position;
pstns.push(pstnsObj);

接下来,您需要每隔enemy更新一次数组中的位置。这只是一个例子,您可以通过多种方式实现,甚至可以自动执行此过程。

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