void CTourist::YawPitchPos(float yaw,float pitch) { m_vAngle += D3DXVECTOR3(pitch, yaw, 0); ModifyAngle(m_vAngle.x); ModifyAngle(m_vAngle.y); UpdateWorldMatrix(); }
void CTourist::PrepairTour() { m_vAngleVel = D3DXVECTOR3(0,0,0); if ((m_pTourInfo == NULL)||(m_nNowTour < 0)||(m_nNowTour >= m_nNumTour)) return; switch(m_pTourInfo[m_nNowTour].nType) { case 0x01: //直线运动 { D3DXVECTOR3 vDistance = m_pTourInfo[m_nNowTour].vTarget - m_vPos; m_fTimeTest = m_pTourInfo[m_nNowTour].fTime; m_fSpeed = /*(*/D3DXVec3Length(&vDistance)/* - 10)*//m_fTimeTest; } break; case 0x02: //原地转动 { D3DXVECTOR3 vTemp = m_pTourInfo[m_nNowTour].vTarget; D3DXMATRIX inverseOrt; D3DXMatrixInverse(&inverseOrt, NULL, &m_mOrientation); D3DXVec3TransformCoord(&vTemp, &vTemp, &inverseOrt); m_fTimeTest = m_pTourInfo[m_nNowTour].fTime; float ang = CaculateYaw(&vTemp); ModifyAngle(ang); m_vAngleVel.y = ang/m_fTimeTest; ang = CaculatePitch(&vTemp); ModifyAngle(ang); m_vAngleVel.x = ang/m_fTimeTest; } break; case 0x08: //面向圆心做圆周运动 { D3DXVECTOR3 vTemp = m_pTourInfo[m_nNowTour].vTarget;// - m_vPos; D3DXMATRIX inverseOrt; D3DXMatrixInverse(&inverseOrt, NULL, &m_mOrientation); D3DXVec3TransformCoord(&vTemp, &vTemp, &inverseOrt); float ang = CaculateYaw(&vTemp); m_vAngle.y += ang; ModifyAngle(m_vAngle.y); UpdateWorldMatrix(); m_fTimeTest = m_pTourInfo[m_nNowTour].fTime; m_vAngleVel.y = m_pTourInfo[m_nNowTour].fAngle/m_fTimeTest; } break; default: break; } }
void CTourist::YawPitchAt(float yaw, float pitch, D3DXVECTOR3 *vCenter) { m_vAngle += D3DXVECTOR3(-pitch, yaw, 0); ModifyAngle(m_vAngle.x); ModifyAngle(m_vAngle.y); D3DXVECTOR3 vRadius = *vCenter - m_vPos; D3DXMATRIX mRot, mRotX, mRotY; D3DXMatrixRotationX(&mRotX, pitch); D3DXMatrixRotationY(&mRotY, yaw); D3DXMatrixMultiply(&mRot, &mRotY, &mRotX); D3DXVECTOR3 vTemp; D3DXVec3TransformCoord(&vTemp, &vRadius, &mRot); m_vPos += vRadius - vTemp; UpdateWorldMatrix(); }
int SpecialSyreen(pPlayer pl) { s16 b; s16 angle; pPlayer opp=(pPlayer)pl->opp; int ret=0; s32 dist=distanceBetweenPoints(pl->object.xpos,pl->object.ypos,opp->object.xpos, opp->object.ypos); if (dist<208&&(!(opp->ship_flags & CREW_IMMUNE))) { s8 crew_loss; crew_loss = ((8 * (208 - dist)/ 209)); if (crew_loss >= opp->crew) crew_loss = opp->crew - 1; for (int i=0;i<crew_loss&&opp->crew-ret>1;i++) { b=nextWeapon(pl,4,12); if (b>0) { pl->weapon[b].type=CREW; pl->weapon[b].object.life=1; pl->weapon[b].status=200;//GUESS pl->weapon[b].damage=0; pl->weapon[b].target=pl->opp; pl->weapon[b].parent=pl; pl->weapon[b].damageparent=1; pl->weapon[b].movefunc=&MoveCrew; pl->weapon[b].hitfunc=&HitCrew; pl->weapon[b].object.ignorecollision=0; pl->weapon[b].object.size=8; pl->weapon[b].object.angle = 0; pl->weapon[b].object.xspeed=0; pl->weapon[b].object.yspeed=0; pl->weapon[b].turn_wait=CREW_WAIT; angle=FindAngle(opp->object.xpos,opp->object.ypos,pl->object.xpos,pl->object.ypos); angle=ModifyAngle(angle,((i*2)-crew_loss)*20); pl->weapon[b].object.xpos = opp->object.xpos+((s32)(opp->offset*3 * SIN[angle])>>8); pl->weapon[b].object.ypos = opp->object.ypos-((s32)(opp->offset*3 * COS[angle])>>8); drawOnScreen(&pl->weapon[b].object.xscreen,&pl->weapon[b].object.yscreen, pl->weapon[b].object.xpos,pl->weapon[b].object.ypos,screenx,screeny,pl->weapon[b].object.size); sprites[pl->weapon[b].sprite].attribute0 = COLOR_256 | SQUARE | ROTATION_FLAG |SIZE_DOUBLE | MODE_TRANSPARENT | pl->weapon[b].object.yscreen; //setup sprite info, 256 colour, shape and y-coord sprites[pl->weapon[b].sprite].attribute1 =SIZE_8 | ROTDATA(pl->weapon[b].sprite) | pl->weapon[b].object.xscreen; sprites[pl->weapon[b].sprite].attribute2 = pl->SpriteStart+66 | PRIORITY(1); ret++; } } //loop
int FireUtwig(pPlayer pl) { s16 b; int ret=0; for (int i=0;i<6;i++) { b= nextWeapon(pl); if (b>=0) { pl->weapon[b].type=SIMPLE; pl->weapon[b].object.life=MISSILE_LIFE;//range pl->weapon[b].damage=-1*MISSILE_DAMAGE;//6 suspect 6 was for both guns; pl->weapon[b].target=pl->opp; pl->weapon[b].parent=pl; pl->weapon[b].damageparent=0; pl->weapon[b].movefunc=0; pl->weapon[b].hitfunc=0; pl->weapon[b].object.ignorecollision=0; pl->weapon[b].object.size=8; pl->weapon[b].object.angle = pl->object.angle; s32 speed=20; pl->weapon[b].object.xspeed = ((MISSILE_SPEED * (s32)SIN[pl->object.angle])>>8);///SPEED_REDUCT; pl->weapon[b].object.yspeed = ((MISSILE_SPEED * (s32)COS[pl->object.angle])>>8);///SPEED_REDUCT; //pl->weapon[b].object.xpos = pl->object.xpos+((52 * (s32)SIN[pl->object.angle+(i==0?-30:+30)])>>8)/3; //pl->weapon[b].object.ypos = pl->object.ypos-((52 * (s32)COS[pl->object.angle+(i==0?-30:+30)])>>8)/3; s16 angle; if (i==0) angle=ModifyAngle(pl->object.angle,-55); else if (i==1) angle=ModifyAngle(pl->object.angle,-35); else if (i==2) angle=ModifyAngle(pl->object.angle,-10); else if (i==3) angle=ModifyAngle(pl->object.angle,15); else if (i==4) angle=ModifyAngle(pl->object.angle,45); else if (i==5) angle=ModifyAngle(pl->object.angle,65); pl->weapon[b].object.xpos = pl->object.xpos+((52 * (s32)SIN[angle])>>8)/3; pl->weapon[b].object.ypos = pl->object.ypos-((52 * (s32)COS[angle])>>8)/3; #ifdef MISSILE_START pl->weapon[b].object.xpos-=pl->weapon[b].object.xspeed; pl->weapon[b].object.ypos+=pl->weapon[b].object.yspeed; #endif drawOnScreen(&pl->weapon[b].object.xscreen,&pl->weapon[b].object.yscreen, pl->weapon[b].object.xpos,pl->weapon[b].object.ypos,screenx,screeny,pl->weapon[b].object.size); sprites[pl->weapon[b].sprite].attribute0 = COLOR_256 | SQUARE | ROTATION_FLAG |SIZE_DOUBLE | MODE_TRANSPARENT | pl->weapon[b].object.yscreen; //setup sprite info, 256 colour, shape and y-coord sprites[pl->weapon[b].sprite].attribute1 =SIZE_8| ROTDATA(pl->weapon[b].sprite) | pl->weapon[b].object.xscreen; sprites[pl->weapon[b].sprite].attribute2 = pl->SpriteStart+64 | PRIORITY(1); ret++; } }