游戏敌人向玩家移动
我在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))));
}
}
根据你希望敌人移动的方向创建一个向量。这很容易:
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.所以现在,增加方向矢量会使敌人移动一个单位。将敌方速度乘以1单位,现在以正确的速度移动。
编辑:所有这些也延伸到3D。你只需要一个z组件。
进一步的编辑您的代码注释:
你做了很多额外的工作。一旦你计算出斜边将敌人移向玩家,你就有足够的信息。您根本不需要使用任何触发器 - 请参阅上面的代码。您也计算(在某种程度上)的两倍大小:
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> enemyY)等部分。
玩家的位置是point1。敌人的位置是point2。首先你需要找出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方向的标志)。
希望这会有所帮助!
这是您需要“路径查找算法”的地方。在一个明确的赛场上,你可以沿着一条直线前往目标。然而,如果遇到障碍,你需要给它AI来决定最佳解决方案,或者甚至可能。
搜索codeproject.com将产生几篇关于路径寻找的文章。
我同意,这个问题(和用户想要什么)是太简单,以至于打扰甚至简单的路径查找。 – Finglas 2010-04-12 21:34:46
+1。告诉敌人,“看到那条线?下移它。” – fig 2010-04-12 20:08:47
数学的*应用。 – meagar 2010-04-12 20:11:11
如何在代表模拟宇宙的游戏数据结构中对运动进行编码? – 2010-04-12 20:12:17