如何使一个对象跟随另一个对象

时间:2012-04-22 20:12:03

标签: c++ object tracking

我正在制作一个游戏,我有我的英雄和敌人。现在我希望敌人跟随英雄,例如他们之间的距离是400。 我怎样才能让它发挥作用。 这是我到目前为止所做的,但它不起作用。 Objects :: calcAngle(Objects * obj) - 计算2个对象的中心点之间的角度。

float Objects::calcAngle(Objects* obj){
    float dx = obj->X - this->X; 
    float dy = obj->Y - this->Y;
    float angle=atan(dy/dx)*180/PI;
    return angle;
}

void Enemy::Attack(mainCar* car){
    float angle=0;
    angle=this->calcAngle(car);
    if(this->Distance(car)<400){
        this->attack=true;
        this->heading=this->calcAngle(car)+90; 
        this->Vtri=abs(this->Vtri);
    } else if (this->Distance(car)>400) {
        this->attack=false;
    }
}

Vtri是移动速度。 标题是度数的方向。

如果你能给我一个链接到它描述的地方或者告诉我这里,那就太好了。我有2天的时间来提交我的项目。

1 个答案:

答案 0 :(得分:2)

为了使对象从源点移动到目标点,您需要做一些事情:

  1. 当前位置X和Y坐标
  2. 目的地位置X和Y坐标
  3. 从源头移至目的地的攻击角度
  4. 从目的地移动到源的速度
  5. <强>伪代码:

    dy = PositionDestination.Y - PositionCurrent.Y
    dx = PositionDestination.X - PositionCurrent.X
    angle = atan2(dy/dx)
    
    vx = v * cos(angle)
    vy = v * sin(angle)
    
    PositionCurrent += Vector(vx, vy)
    

    <强> C#:

     // angle is the arctan placed in the correct quadrant of the Y difference and X difference
     float angleOfAttack = 
          (float)Math.Atan2((double)(PositionDestination.Y - PositionCurrent.Y), 
          (double)(PositionDestination.X - PositionCurrent.X));
    
     // velocity is the cos(angle*speed), sin(angle*speed)
     Vector2 velocity = 
          new Vector2((float)Math.Cos(angleOfAttack) * projectileMoveSpeed,
          (float)Math.Sin(angleOfAttack) * projectileMoveSpeed);
    
     // new position is +velocity
     PositionCurrent += velocity;
    

    因此,您首先根据源和目标坐标获得角度。然后,您可以根据角度和速度获得速度方向和距离。最后,根据速度矢量将当前位置移动到新位置。