游戏敌人向玩家移动

Chr*_*ris 11 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))));
    }
}
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)等部分.

  • 在此示例中,速度以每帧的距离表示,如果您的帧时间是可变的,那么您的速度将取决于您的帧速率,这是不好的.您应该以每秒的距离单位(米,英尺等)表示您的速度,并根据自上一帧以来经过的毫秒数对每帧进行缩放. (2认同)

Fin*_*las 5

使用矢量.这很简单,而且真正的游戏是如何做到这一点的.

如果你的玩家位于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.每个帧的标量值多个单位向量(这是方向记住),敌人将向玩家移动.到达那里会发生什么事取决于你;)