void EnemyPlane::UpdatePlane() { if (g_Time - m_ShowTime < m_Delay) { return; } switch (m_iState) { case P_ALIVE: if (abs(m_iDesX-m_iX)>m_iSpeed || abs(m_iDesY-m_iY)>m_iSpeed) { m_iAngle = atan((double)(m_iDesX-m_iX)/(double)(m_iDesY-m_iY)); if (m_iDesY > m_iY) { SetX(m_iX + (int)(m_iSpeed*sin(m_iAngle))); SetY(m_iY + (int)(m_iSpeed*cos(m_iAngle))); } else if(m_iDesY < m_iY) { SetX(m_iX - (int)(m_iSpeed*sin(m_iAngle))); SetY(m_iY - (int)(m_iSpeed*cos(m_iAngle))); } else { if (m_iDesX > m_iX) { SetX(m_iX+m_iSpeed); } else { SetX(m_iX-m_iSpeed); } } //更新发射器的位置 for (int i=0; i<(int)m_vShooterGroup.size(); i++) { for (int j=0; j<(int)m_vShooterGroup[i].size(); j++) { m_vShooterGroup[i][j]->SetPos(m_iX, m_iY); } } //更新所携带物品的位置 for (int i=0; i<(int)items.size(); i++) { items[i]->SetPos(m_iX, m_iY); } } else { m_bMoveable = true; vector<Shooter*> *pShooters = NULL; if (!m_vShooterGroup.empty()) { pShooters = &m_vShooterGroup[m_iNowShooterGroup]; for (int i=0; i<(int)pShooters->size(); i++) { if (m_bFireCommand) { (*pShooters)[i]->SetCommand(true); m_bMoveable &= (*pShooters)[i]->Fire(false); } } } if (m_bMoveable) { m_iNowPos++; if (m_iNowPos >= (int)posMap.size()) { m_iNowPos = 0; } m_iDesX = posMap[m_iNowPos].x; m_iDesY = posMap[m_iNowPos].y; if (pShooters) { m_iNowShooterGroup = rand()%(int)m_vShooterGroup.size(); for (int i=0; i<(int)pShooters->size(); i++) { (*pShooters)[i]->SetCommand(false); (*pShooters)[i]->Reload(); } } } } { //判断与子弹的碰撞 vector<Bullet*> *pBullets = g_Manager.GetMyBulletVector(); for (int i=0; i<(int)pBullets->size(); i++) { if (!(*pBullets)[i]) { continue; } if (IsImpact((*pBullets)[i]->GetImpactBox())) { delete (*pBullets)[i]; (*pBullets)[i] = NULL; g_Manager.AddScore(10); m_iHp--; if (m_iHp <= 0) { //弹出物品 for (int i=0; i<(int)items.size(); i++) { if(!items[i]) continue; g_Manager.AddItemToVector(items[i]); } ClearItem(); //飞机爆炸 PlaySound(".\\Sound\\explosion.wav", NULL,SND_ASYNC|SND_NODEFAULT|SND_FILENAME); m_bExplodeOver = false; m_iState = P_EXPLODE; m_Time = g_Time; if (m_bIsBoss) { g_Manager.GetHeroPlane()->AddBoom(); g_Manager.GetHeroPlane()->BoomStart(false); } } } } } break; case P_EXPLODE: if (!m_bExplodeOver) { } else { m_iState = P_DISAPPEAR; } break; case P_DISAPPEAR: break; } }