4

所以,我正在制作一个游戏,你要在其中超越敌人。我不想让敌人仅向上、向下、向左、向右和以 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;
    }
}

所以,它的作用是设置基本方向的速度。我该怎么做才能使它更准确?

4

2 回答 2

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和代表三角形的斜边、相邻边ao对边。

a/h是平行于 X 轴的速度分量。

o/h是平行于 y 轴的速度分量。

于 2013-10-15T15:53:32.003 回答
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;

计算一个指向 palyer 位置的向量,长度为 spd

于 2013-10-15T15:50:54.600 回答