//导弹结构体
typedef struct
{
float missile_v; //速度
float missile_a; //加速度
float vx, vy, vz; //速度在x,y,z轴的分量
int state; //导弹的状态,初始时state=0; 当state=1时,导弹发射;
vgPlayer* player_missile; //导弹运动体player指针
vgPlayer* player_enemy; //敌方导弹运动体指针
}missile_data;
//初始化导弹结构体
void myInitMissile( missile_data* missile )
{
missile->missile_a = 20;
missile->missile_v = 0;
missile->state = 0;
missile->player_missile = vgFindPlyr( "player_missile" );
missile->player_enemy = vgFindPlyr( "player_enemy" );
}
//导弹发射
void myLaunchMissile( vgCommon *handle, void *data)
{
missile_data* missile = (missile_data*)data;
vgPosition* pos = vgNewPos();
float x, y, z, h, p, r;
float x1, y1, z1, h1, p1, r1;
float sin_h, cos_h;
float sin_p, cos_p;
float sin_r, cos_r;
float dt;
dt=vgGetDeltaFrameTime();
//如果导弹处于发射状态、发射架完全打开且已经锁定目标,则令导弹发射
if( missile->state == 1 && lopen && missile->player_enemy != NULL )
{
missile->missile_v += missile->missile_a * dt; //计算导弹速度
vgGetWCSPos( missile->player_missile, pos );
vgGetPosVec( pos, &x, &y, &z, &h, &p, &r );
//如果导弹高度<=200,令导弹垂直上升
if( z <= 200 )
{
vgGetSinCos(h,&sin_h,&cos_h);
vgGetSinCos(p,&sin_p,&cos_p);
vgGetSinCos(r,&sin_r,&cos_r);
missile->vx = missile->missile_v * sin_p * sin_h;
missile->vy = missile->missile_v * sin_p * cos_h;
missile->vz = missile->missile_v * cos_p;
x += missile->vx * dt;
y -= missile->vy * dt;
z += missile->vz * dt;
vgPosVec( pos, x, y, z, h, p, r );
vgPos( missile->player_missile, pos );
}
//如果导弹高度>200,则令导弹追踪目标
else
{
//计算导弹与目标连线的HPR
myGetHPR( missile->player_missile, missile->player_enemy, pos );
vgGetPosVec( pos, &x1, &y1, &z1, &h1, &p1, &r1);
if(h<h1)
h+=0.4;
else
h-=0.4;
if(p<p1)
p+=0.4;
else
p-=0.4;
vgGetSinCos(h,&sin_h,&cos_h);
vgGetSinCos(p,&sin_p,&cos_p);
vgGetSinCos(r,&sin_r,&cos_r);
missile->vx = missile->missile_v * sin_p * sin_h;
missile->vy = missile->missile_v * sin_p * cos_h;
missile->vz = missile->missile_v * cos_p;
x += missile->vx * dt;
y -= missile->vy * dt;
z += missile->vz * dt;
vgPosVec( pos, x, y, z, h, p, r );
vgPos( missile->player_missile, pos );
}
}
}
void myGetHPR( vgPlayer* player_missile, vgPlayer* player_enemy, vgPosition* pos )
{
vgPosition* pos_missile = vgNewPos();
vgPosition* pos_enemy = vgNewPos();
float x1,y1,z1,h1,p1,r1;
float x2,y2,z2,h2,p2,r2;
float x ,y ,z ,h ,p ,r ;
float l_xyz,l_xy,l_yz;
vgGetWCSPos( player_missile, pos_missile );
vgGetWCSPos( player_enemy, pos_enemy );
vgGetPosVec( pos_missile, &x1, &y1, &z1, &h1, &p1, &r1 );
vgGetPosVec( pos_enemy , &x2, &y2, &z2, &h2, &p2, &r2 );
x=x2-x1;
y=y2-y1;
z=z2-z1;
l_xyz=vgGet3DRng(x,y,z);
l_xy =vgGet2DRng(x,y);
l_yz =vgGet2DRng(y,z);
h=-atan2(x,y)*180/3.14159;
if(z>=0)
p = -atan2( l_xy, z ) * 180 / 3.14159;
else
p= atan2( l_xy, z ) * 180 / 3.14159 + 180;
vgPosVec(pos,x1,y1,z1,h,p,r);
}