当前位置: 首页>>代码示例>>C++>>正文


C++ CCircuitAI::GetMap方法代码示例

本文整理汇总了C++中CCircuitAI::GetMap方法的典型用法代码示例。如果您正苦于以下问题:C++ CCircuitAI::GetMap方法的具体用法?C++ CCircuitAI::GetMap怎么用?C++ CCircuitAI::GetMap使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在CCircuitAI的用法示例。


在下文中一共展示了CCircuitAI::GetMap方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: Execute

void CAttackTask::Execute(CCircuitUnit* unit, bool isUpdating)
{
    Unit* u = unit->GetUnit();

    CCircuitAI* circuit = manager->GetCircuit();
    CTerrainManager* terrainManager = circuit->GetTerrainManager();

    float minSqDist;
    CEnemyUnit* bestTarget = FindBestTarget(unit, minSqDist);

    if (bestTarget == nullptr) {
        if (!isUpdating) {
            float x = rand() % (terrainManager->GetTerrainWidth() + 1);
            float z = rand() % (terrainManager->GetTerrainHeight() + 1);
            position = AIFloat3(x, circuit->GetMap()->GetElevationAt(x, z), z);
        }
    } else {
        position = bestTarget->GetPos();
        float range = u->GetMaxRange();
        if (minSqDist < range * range) {
            u->Attack(bestTarget->GetUnit(), UNIT_COMMAND_OPTION_INTERNAL_ORDER, circuit->GetLastFrame() + FRAMES_PER_SEC * 300);
            return;
        }
    }
    u->Fight(position, UNIT_COMMAND_OPTION_INTERNAL_ORDER, circuit->GetLastFrame() + FRAMES_PER_SEC * 300);
}
开发者ID:abma,项目名称:CircuitAI,代码行数:26,代码来源:AttackTask.cpp

示例2: Execute

void IBuilderTask::Execute(CCircuitUnit* unit)
{
    Unit* u = unit->GetUnit();
    u->ExecuteCustomCommand(CMD_PRIORITY, {static_cast<float>(priority)});

    CCircuitAI* circuit = manager->GetCircuit();
    if (target != nullptr) {
        Unit* tu = target->GetUnit();
        u->Build(target->GetCircuitDef()->GetUnitDef(), tu->GetPos(), tu->GetBuildingFacing(), UNIT_COMMAND_OPTION_INTERNAL_ORDER, circuit->GetLastFrame() + FRAMES_PER_SEC * 60);
        return;
    }
    CTerrainManager* terrainManager = circuit->GetTerrainManager();
    UnitDef* buildUDef = buildDef->GetUnitDef();
    if (buildPos != -RgtVector) {
        if (circuit->GetMap()->IsPossibleToBuildAt(buildUDef, buildPos, facing)) {
            u->Build(buildUDef, buildPos, facing, UNIT_COMMAND_OPTION_INTERNAL_ORDER, circuit->GetLastFrame() + FRAMES_PER_SEC * 60);
            return;
        } else {
            terrainManager->RemoveBlocker(buildDef, buildPos, facing);
            // FIXME: If enemy blocked position then reset will have no effect
//			terrain->ResetBuildFrame();
        }
    }

    circuit->GetThreatMap()->SetThreatType(unit);
    // FIXME: Replace const 999.0f with build time?
    if (circuit->IsAllyAware() && (cost > 999.0f)) {
//		circuit->UpdateFriendlyUnits();
        auto friendlies = std::move(circuit->GetCallback()->GetFriendlyUnitsIn(position, cost));
        for (Unit* au : friendlies) {
            CCircuitUnit* alu = circuit->GetFriendlyUnit(au);
            if (alu == nullptr) {
                continue;
            }
            if ((*alu->GetCircuitDef() == *buildDef) && au->IsBeingBuilt()) {
                const AIFloat3& pos = au->GetPos();
                if (terrainManager->CanBuildAt(unit, pos)) {
                    u->Build(buildUDef, pos, au->GetBuildingFacing(), UNIT_COMMAND_OPTION_INTERNAL_ORDER, circuit->GetLastFrame() + FRAMES_PER_SEC * 60);
                    utils::free_clear(friendlies);
                    return;
                }
            }
        }
        utils::free_clear(friendlies);
    }

    // Alter/randomize position
    AIFloat3 pos;
    if (isShake) {
        AIFloat3 offset((float)rand() / RAND_MAX - 0.5f, 0.0f, (float)rand() / RAND_MAX - 0.5f);
        pos = position + offset * SQUARE_SIZE * 16;
    } else {
        pos = position;
    }

    const float searchRadius = 200.0f * SQUARE_SIZE;
    FindBuildSite(unit, pos, searchRadius);

    if (buildPos != -RgtVector) {
        terrainManager->AddBlocker(buildDef, buildPos, facing);
        u->Build(buildUDef, buildPos, facing, UNIT_COMMAND_OPTION_INTERNAL_ORDER, circuit->GetLastFrame() + FRAMES_PER_SEC * 60);
    } else {
        // TODO: Select new proper BasePos, like near metal cluster.
        int terWidth = terrainManager->GetTerrainWidth();
        int terHeight = terrainManager->GetTerrainHeight();
        float x = terWidth / 4 + rand() % (int)(terWidth / 2 + 1);
        float z = terHeight / 4 + rand() % (int)(terHeight / 2 + 1);
        AIFloat3 pos(x, circuit->GetMap()->GetElevationAt(x, z), z);
        circuit->GetSetupManager()->SetBasePos(pos);

        // Fallback to Guard/Assist/Patrol
        manager->FallbackTask(unit);
    }
}
开发者ID:abma,项目名称:CircuitAI,代码行数:74,代码来源:BuilderTask.cpp


注:本文中的CCircuitAI::GetMap方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。