游戏敌人向玩家移动

时间:2010-04-12 20:06:03

标签: vector

我正在用c ++和OpenGL创建游戏,并希望敌人向玩家移动。

使游戏对象转向其他游戏对象的最佳方法是什么,这种方法适用于2D和3D游戏环境?

更新:

哇谢谢大家的快速回复!

奇怪的是,我设法让它像我发布的那样工作

虽然由于某种原因,我必须将x值乘以更多,以使它们像y方向一样快速移动。

任何人都有任何想法?或者如果我正在做的是错误/错误

float playerX = player.getXPos();
float playerY = player.getYPos();
float enemyX = XPos-*xscroll;
float enemyY = YPos-*yscroll;

glPushMatrix();

glTranslatef(enemyX, enemyY, 0.0);
glColor3f(1.0,0.0,0.0);
    glBegin(GL_POLYGON);
        glVertex2f(-40,40);
        glVertex2f(-40,-40);
        glVertex2f(40,-40);
        glVertex2f(40,40);
    glEnd();

glPopMatrix();


float xDistance = abs(playerX-enemyX);
float yDistance = abs(playerY-enemyY);

if((playerX - enemyX)*(playerX - enemyX)+(playerY - enemyY)*(playerY - enemyY) < 400*400){
    float heading = asin(xDistance/yDistance);

    if(playerY > enemyY){
        YPos += timeFactor*(200*(sin((90+heading)*(PI/180.0f))));
    }else{
        YPos += -(timeFactor*(200*(sin((90+heading)*(PI/180.0f)))));
    }

    if(playerX > enemyX){
        XPos += -(timeFactor*(10000*(cos((90+heading)*(PI/180.0f)))));
    }else{
        XPos += timeFactor*(10000*(cos((90+heading)*(PI/180.0f))));
    }
}

4 个答案:

答案 0 :(得分:37)

在您希望敌人移动的方向上创建一个向量。这很简单:

dir.x = player.x - enemy.x;
dir.y = player.y - enemy.y;

现在规范化此向量。这意味着将术语除以向量的大小(斜边)。

hyp = sqrt(dir.x*dir.x + dir.y*dir.y);
dir.x /= hyp;
dir.y /= hyp;

现在你只需要将该矢量添加到敌人的位置,乘以你希望敌人移动的速度:

enemy.x += dir.x*speed;
enemy.y += dir.y*speed;

以下是它的工作原理 - 如果你将初始矢量添加到敌人的位置,它将立即被传送到玩家。你显然希望敌人以较慢的速度移动。当你对矢量进行标准化时,你的幅度(实际上是它形成的三角形的斜边)等于1.所以现在,添加方向矢量可以将敌人移动一个单位。将该单位乘以敌人的速度,现在它以正确的速度移动。

编辑:所有这些也延伸到3D。你只需要一个z组件。

对您的代码发表评论的进一步修改:

你正在做很多额外的工作。一旦计算出斜边以将敌人移向玩家,就会有足够的信息。您根本不需要使用任何trig - 请参阅上面的代码。你也在计算(排序)两次大小:

float hypotenuse = sqrt((xDistance * xDistance) + (yDistance * yDistance));
...
(playerX - enemyX)*(playerX - enemyX)+(playerY - enemyY)*(playerY - enemyY)

第二次是距离平方,这是一个很好的优化,但这里不必要,因为你已经计算了距离和距离的平方。

这就是我要做的事情:

float xDistance = playerX-enemyX;
float yDistance = playerY-enemyY;
float hypotenuse = sqrt((xDistance * xDistance) + (yDistance * yDistance));

if(hypotenuse < 400){

        YPos += timeFactor*200*(yDistance/hypotenuse);
        XPos += timeFactor*200*(xDistance/hypotenuse);
}

你会注意到,通过删除abs(),我还设法删除了if(playerY&gt; enemyY)等部分。

答案 1 :(得分:5)

使用vectors。这很简单,而且真正的游戏就是这样做的。

如果你的玩家位于10,10位(假设这是2D空间)并且你的敌人是20,10。从玩家到敌人的矢量是:

Player - Enemy

(10, 10) - (20, 10) = -10, 0

归一化此向量可为您提供单位向量或方向。在这种情况下是-1,0。每个帧的标量值多个单位向量(这是方向记住),敌人将向玩家移动。到达那里会发生什么事情取决于你;)

答案 2 :(得分:1)

玩家的位置是point1。敌人的位置是第2点。首先,你需要找到x1和x2以及y1和y2之间的差异(我将这些称为xd和yd)。然后你可以通过做theta = atan(yd / xd)得到两点之间的角度。现在你应该能够通过使用你想要行进的角度和距离来获得新的x和y(我将称之为x3和y3)x3 =(d)(cos(theta))和y3 =(d) (SIN(THETA))。将敌人移动到(x3,y3)。

d是每次更新时敌人移动的速度。你可能不得不弄乱标志以使方向正确(即如果敌人在正确的x方向上移动但在y方向错误,则改变y上的标志)。

希望这有帮助!

答案 3 :(得分:1)

这是您需要“路径寻找算法”的地方。在清晰的比赛场地上,您可以沿直线前往目标。但是,如果遇到障碍,你需要给它AI来决定最好的方式,或者甚至是否可能。

codeproject.com的搜索将产生一些关于路径查找的文章。