// Render on-screen text each frame void RenderSceneText( float updateTime ) { // Write FPS text string stringstream outText; outText << "Frame Time: " << updateTime * 1000.0f << "ms" << endl << "FPS:" << 1.0f / updateTime; RenderText( outText.str(), 0, 0, 1.0f, 1.0f, 0.0f ); outText.str(""); //Render tank names CEntity* Tank; TInt32 RenderTextX; TInt32 RenderTextY; for (int TankIndex = 0; TankIndex < TankVector.size(); TankIndex++) { if (EntityManager.GetEntity(TankVector.at(TankIndex))!=0) { Tank = EntityManager.GetEntity(TankVector.at(TankIndex)); MainCamera->PixelFromWorldPt(Tank->Position(),ViewportWidth,ViewportHeight,&RenderTextX,&RenderTextY); RenderText(Tank->GetInfo(ShowTankDetail),RenderTextX,RenderTextY,1.0f,1.0f,1.0f, true); } } }
bool operator() (const CEntity *pE1, const CEntity *pE2) const { return (pE1->Position().distance_to(enemy->Position()) > pE2->Position().distance_to(enemy->Position())); };
void CMonsterSquad::Attack_AssignTargetDir(ENTITY_VEC &members, const CEntity *enemy) { _elem first; _elem last; lines.clear(); // сортировать по убыванию расстояния от npc до врага std::sort(members.begin(), members.end(), sort_predicate(enemy)); if (members.empty()) return; float delta_yaw = PI_MUL_2 / members.size(); // обработать ближний элемент first.pE = members.back(); first.p_from = first.pE->Position(); first.yaw = 0; members.pop_back(); lines.push_back(first); // обработать дальний элемент if (!members.empty()) { last.pE = members[0]; last.p_from = last.pE->Position(); last.yaw = PI; members.erase (members.begin()); lines.push_back(last); } Fvector target_pos = enemy->Position(); float next_right_yaw = delta_yaw; float next_left_yaw = delta_yaw; // проходим с конца members в начало (начиная с наименьшего расстояния) while (!members.empty()) { CEntity *pCur; pCur = members.back(); members.pop_back(); _elem cur_line; cur_line.p_from = pCur->Position(); cur_line.pE = pCur; // определить cur_line.yaw float h1,p1,h2,p2; Fvector dir; dir.sub(target_pos, first.p_from); dir.getHP(h1,p1); dir.sub(target_pos, cur_line.p_from); dir.getHP(h2,p2); bool b_add_left = false; if (angle_normalize_signed(h2 - h1) > 0) { // right if ((next_right_yaw < PI) && !fsimilar(next_right_yaw, PI, PI/60.f)) b_add_left = false; else b_add_left = true; } else { // left if ((next_left_yaw < PI) && !fsimilar(next_left_yaw, PI, PI/60.f)) b_add_left = true; else b_add_left = false; } if (b_add_left) { cur_line.yaw = -next_left_yaw; next_left_yaw += delta_yaw; } else { cur_line.yaw = next_right_yaw; next_right_yaw += delta_yaw; } lines.push_back(cur_line); } // Пройти по всем линиям и заполнить таргеты у npc float first_h, first_p; Fvector d; d.sub(target_pos,first.p_from); d.getHP(first_h, first_p); for (u32 i = 0; i < lines.size(); i++){ SSquadCommand command; command.type = SC_ATTACK; command.entity = enemy; command.direction.setHP (first_h + lines[i].yaw, first_p); UpdateCommand(lines[i].pE, command); } }