我正在用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))));
}
}
答案 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的搜索将产生一些关于路径查找的文章。