我正在编写一个大学项目的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在攻击期间没有变化)。有没有一种简单的方法可以避免这种情况而不检查很多碰撞?谢谢大家
答案 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');
}
});
}