本文整理汇总了C++中CGroup::selectTarget方法的典型用法代码示例。如果您正苦于以下问题:C++ CGroup::selectTarget方法的具体用法?C++ CGroup::selectTarget怎么用?C++ CGroup::selectTarget使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CGroup
的用法示例。
在下文中一共展示了CGroup::selectTarget方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: update
void CMilitary::update(int frame) {
int busyScoutGroups = 0;
std::vector<int> keys;
std::vector<int> occupied;
std::map<int, bool> isOccupied;
std::map<int, ATask*>::iterator itTask;
std::map<MilitaryGroupBehaviour, std::map<int, CGroup*>* >::iterator itGroup;
TargetsFilter tf;
// NOTE: we store occupied targets in two formats because vector is used
// for list of targets (which can be used if no suitable primary
// targets are found), second one is used for TargetFilter to filter out
// occupied targets when searching for primary targets
for (itTask = ai->tasks->activeTasks[TASK_ATTACK].begin(); itTask != ai->tasks->activeTasks[TASK_ATTACK].end(); ++itTask) {
AttackTask *task = (AttackTask*)itTask->second;
occupied.push_back(task->target);
isOccupied[task->target] = true;
}
for(itGroup = groups.begin(); itGroup != groups.end(); itGroup++) {
int target = -2;
MilitaryGroupBehaviour behaviour = itGroup->first;
// setup common target filter params per behaviour...
tf.reset();
switch(behaviour) {
case SCOUT:
tf.threatRadius = 300.0f;
tf.threatFactor = 1000.0f;
break;
case ENGAGE:
tf.threatFactor = 0.001f;
break;
case BOMBER:
tf.threatFactor = 100.0f;
// TODO: replace constant with maneuvering radius of plane?
tf.threatRadius = 1000.0f;
break;
case AIRFIGHTER:
tf.threatFactor = 100.0f;
break;
}
// NOTE: start with random group ID because some groups can't reach the
// target (e.g. Fleas); this helps to overcome the problem when there
// is a target, but first group can't reach it, and AI constantly
// trying to add same task again and again which leads to attack stall
keys.clear();
util::GetShuffledKeys<int, CGroup*>(keys, *(itGroup->second));
const std::vector<CategoryMatcher>& targetBlocks = ai->intel->targets[behaviour];
for (int i = 0; i < keys.size(); ++i) {
CGroup *group = (*(itGroup->second))[keys[i]];
// if group is busy, don't bother...
if (group->busy || !group->canPerformTasks()) {
if (group->busy) {
if (behaviour == SCOUT)
busyScoutGroups++;
if (drawTasks)
visualizeTasks(group);
}
continue;
}
// NOTE: each group can have different score on the same target
// because of their disposition, strength etc.
tf.scoreCeiling = std::numeric_limits<float>::max();
tf.excludeId = &isOccupied;
// setup custom target filter params per current group...
switch(behaviour) {
case SCOUT:
if ((group->cats&AIR).any())
tf.threatCeiling = 1.1f;
else
tf.threatCeiling = (std::max<float>((float)MAX_SCOUTS_IN_GROUP / group->units.size(), 1.0f)) * group->strength - EPS;
break;
case BOMBER:
tf.threatCeiling = group->strength + group->firstUnit()->type->dps;
break;
}
// basic target selection...
if (target != -1) {
for(int b = 0; b < targetBlocks.size(); b++) {
target = group->selectTarget(ai->intel->enemies.getUnits(targetBlocks[b]), tf);
}
}
bool isAssembling = isAssemblingGroup(group);
if ((!isAssembling && behaviour == SCOUT) || target < 0) {
// scan for better target among existing targets...
tf.excludeId = NULL;
int assistTarget = group->selectTarget(occupied, tf);
if (assistTarget >= 0 && assistTarget != target) {
//.........这里部分代码省略.........