游戏敌人向玩家移动

问题描述:

我在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)))); 
    } 
} 
+3

+1。告诉敌人,“看到那条线?下移它。” – fig 2010-04-12 20:08:47

+0

数学的*应用。 – meagar 2010-04-12 20:11:11

+2

如何在代表模拟宇宙的游戏数据结构中对运动进行编码? – 2010-04-12 20:12:17

根据你希望敌人移动的方向创建一个向量。这很容易:

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)等部分。

+2

在这个例子中,速度是以每帧距离来表示的,如果你的帧时间是可变的,那么你的速度将取决于你的帧速率是坏的。您应该以每秒距离单位(米,英尺等)来表示速度,并根据自上一帧以来经过的毫秒数来缩放每一帧。 – 2010-04-12 20:27:35

+0

我的游戏创建了一个时间因子,所有运动都乘以摆脱帧率差异 – Chris 2010-04-12 20:31:19

+0

谢谢!这是一个非常完善的解决方案,非常简单,非常感谢 – Chris 2010-04-12 20:43:11

使用vectors。这很简单,真正的游戏如何做到这一点。

如果播放机是在10位,10(假设这是2D空间中)和你的敌人在20,10从播放器到敌人的载体是:

Player - Enemy 

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

正常化这个向量给你的单位向量或方向。在这种情况下,它是-1,0。每个单位矢量(这是记住的方向)乘以标量值并且敌人将向玩家移动。当它到达时发生什么取决于你;)

+0

@Chris--我建议的链接虽然简单(没有冒犯性)是一个很好的介绍,并且会做你需要的工作,我希望。 – Finglas 2010-04-12 20:18:51

玩家的位置是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将产生几篇关于路径寻找的文章。

+0

我同意,这个问题(和用户想要什么)是太简单,以至于打扰甚至简单的路径查找。 – Finglas 2010-04-12 21:34:46