【发布时间】:2018-01-24 09:33:32
【问题描述】:
我正在为一个大学项目编写一个 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 在攻击期间不会改变)。有没有一种简单的方法可以在不检查大量碰撞的情况下避免这种情况?谢谢大家
【问题讨论】:
-
能否解释一下为什么需要避免碰撞检测?
-
我的错。我没有时间创建另一个碰撞检测系统。我想重用测试两个矩形之间碰撞的那个。我的意思是我现在不能创建另一个系统。
-
如果你只存储敌人的当前位置,你可以简单地检查它们是否有重复。
-
谢谢 creyD。你会如何翻译它们?你知道如何在不与游戏边界冲突的情况下做到这一点吗?
-
我猜@MisterM 实现的解决方案与我的建议非常相似,您应该检查一下。但是,如果你不能忍受碰撞检测,那么你应该考虑到敌人总是走不同的路径来自动不发生碰撞。
标签: javascript