我正在用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))));
}
}
Run Code Online (Sandbox Code Playgroud)
Nik*_*chi 37
在你希望敌人移动的方向上创建一个向量.这很简单:
dir.x = player.x - enemy.x;
dir.y = player.y - enemy.y;
Run Code Online (Sandbox Code Playgroud)
现在规范化这个向量.这意味着将术语除以向量的大小(斜边).
hyp = sqrt(dir.x*dir.x + dir.y*dir.y);
dir.x /= hyp;
dir.y /= hyp;
Run Code Online (Sandbox Code Playgroud)
现在你只需要将该矢量添加到敌人的位置,乘以你希望敌人移动的速度:
enemy.x += dir.x*speed;
enemy.y += dir.y*speed;
Run Code Online (Sandbox Code Playgroud)
这是它的工作原理 - 如果你将初始矢量添加到敌人的位置,它将立即被传送到玩家.你显然希望敌人以较慢的速度移动.当你对矢量进行标准化时,你的幅度(实际上是它所形成的三角形的斜边)等于1.所以现在,添加方向矢量会使敌人移动一个单位.将该单位乘以敌人的速度,现在它以正确的速度移动.
编辑:所有这些也扩展到3D.你只需要一个z组件.
进一步编辑以评论您的代码:
你正在做很多额外的工作.一旦计算出斜边以将敌人移向玩家,就会有足够的信息.您根本不需要使用任何trig - 请参阅上面的代码.您还计算两次的量级(排序):
float hypotenuse = sqrt((xDistance * xDistance) + (yDistance * yDistance));
...
(playerX - enemyX)*(playerX - enemyX)+(playerY - enemyY)*(playerY - enemyY)
Run Code Online (Sandbox Code Playgroud)
第二次是距离平方,这是一个很好的优化,但这里不必要,因为你已经计算了距离和距离的平方.
这就是我要做的事情:
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);
}
Run Code Online (Sandbox Code Playgroud)
你会注意到,通过删除abs(),我还设法删除了if(playerY> enemyY)等部分.
使用矢量.这很简单,而且真正的游戏是如何做到这一点的.
如果你的玩家位于10,10位(假设这是2D空间)并且你的敌人是20,10.从玩家到敌人的矢量是:
Player - Enemy
Run Code Online (Sandbox Code Playgroud)
要么
(10, 10) - (20, 10) = -10, 0
Run Code Online (Sandbox Code Playgroud)
归一化此向量可为您提供单位向量或方向.在这种情况下是-1,0.每个帧的标量值多个单位向量(这是方向记住),敌人将向玩家移动.到达那里会发生什么事取决于你;)
| 归档时间: |
|
| 查看次数: |
14848 次 |
| 最近记录: |