所以,我正在做一个你要超越敌人的游戏。我不希望敌人只向上,向下,向左,向右和以45度角移动,而是希望敌人采用最短的线性路径朝向玩家。这是我的代码:
public void moveEnemy() {
if (player.pos.x > enemy.pos.x) {
enemy.vel.x = 3;
}
if (player.pos.x < enemy.pos.x) {
enemy.vel.x = -3;
}
if (player.pos.y > enemy.pos.y) {
enemy.vel.y = 3;
}
if (player.pos.y < enemy.pos.y) {
enemy.vel.y = -3;
}
if (player.pos.x == enemy.pos.x) {
enemy.vel.x = 0;
}
if (player.pos.y == enemy.pos.y) {
enemy.vel.y = 0;
}
}
所以,这样做可以设定基本方向的速度。我该怎么做才能让这更准确?
答案 0 :(得分:1)
假设您拥有玩家和敌人的位置,并且您希望敌人的速度始终为3,那么请拔出三角学教科书并执行以下操作:
float h = Math.sqrt(Math.pow(enemy.pos.y-player.pos.y,2) + Math.pow(enemy.pos.x-player.pos.x,2));
float a = player.pos.x - enemy.pos.x;
float o = player.pos.y - enemy.pos.y;
enemy.vel.x = 3f*(a/h);
enemy.vel.y = 3f*(o/h);
你问这个代码是做什么的?它在敌人和玩家之间形成一个三角形。你希望敌人在斜边的方向上以3个单位/秒的速度行进,所以你需要做的是将其分解成与X和Y轴平行的分量。
http://www.mathwords.com/s/sohcahtoa.htm
浮点数h
,a
和o
代表三角形的斜边,相邻边和相对边。
a/h
是与X轴平行的速度分量。
o/h
是与y轴平行的速度分量。
答案 1 :(得分:0)
double spd=3;
double vX=player.pos.x-enemy.pos.x;
double vY=player.pos.y-enemy.pos.y;
double distance=Math.sqrt(vX*vX+vY*vY);
enemy.vel.x=vX/distance*spd;
enemy.vel.y=vY/distance*spd;
计算一个指向玩家位置的向量,其长度为spd