Exemplo n.º 1
0
/** This is the main entry point for the AI.
 *  It is called once per frame for each AI and determines the behaviour of
 *  the AI, e.g. steering, accelerating/braking, firing.
 */
void ArenaAI::update(float dt)
{
    // This is used to enable firing an item backwards.
    m_controls->m_look_back = false;
    m_controls->m_nitro     = false;

    // Don't do anything if there is currently a kart animations shown.
    if (m_kart->getKartAnimation())
        return;

    if (isWaiting())
    {
        AIBaseController::update(dt);
        return;
    }

    checkIfStuck(dt);
    if (handleArenaUnstuck(dt))
        return;

    findClosestKart(true);
    findTarget();
    handleArenaItems(dt);
    handleArenaBanana();

    if (m_kart->getSpeed() > 15.0f && m_cur_kart_pos_data.angle < 0.2f)
    {
        // Only use nitro when target is straight
        m_controls->m_nitro = true;
    }

    if (m_is_uturn)
    {
        handleArenaUTurn(dt);
    }
    else
    {
        handleArenaAcceleration(dt);
        handleArenaSteering(dt);
        handleArenaBraking();
    }

    AIBaseController::update(dt);

}   // update
Exemplo n.º 2
0
/** This is the main entry point for the AI.
 *  It is called once per frame for each AI and determines the behaviour of
 *  the AI, e.g. steering, accelerating/braking, firing.
 *  \param dt Time step size.
 */
void ArenaAI::update(float dt)
{
    // This is used to enable firing an item backwards.
    m_controls->setLookBack(false);
    m_controls->setNitro(false);

    // Let the function below to reset it later
    m_controls->setAccel(0.0f);
    m_controls->setBrake(false);
    m_mini_skid = false;

    // Don't do anything if there is currently a kart animations shown.
    if (m_kart->getKartAnimation())
    {
        resetAfterStop();
        return;
    }

    if (!isKartOnRoad() && m_kart->isOnGround())
    {
        m_time_since_off_road += dt;
    }
    else if (m_time_since_off_road != 0.0f)
    {
        m_time_since_off_road = 0.0f;
    }

    // If the kart needs to be rescued, do it now (and nothing else)
    if (m_time_since_off_road > 5.0f && m_kart->isOnGround())
    {
        m_time_since_off_road = 0.0f;
        new RescueAnimation(m_kart);
        AIBaseController::update(dt);
        return;
    }

    if (isWaiting())
    {
        AIBaseController::update(dt);
        return;
    }

    checkIfStuck(dt);
    if (gettingUnstuck(dt))
        return;

    findTarget();

    // After found target, convert it to local coordinate, used for skidding or
    // u-turn
    if (!m_is_uturn)
    {
        m_target_point_lc = m_kart->getTrans().inverse()(m_target_point);
        doSkiddingTest();
        configSteering();
    }
    else
    {
        m_target_point_lc = m_kart->getTrans().inverse()(m_reverse_point);
    }
    useItems(dt);

    if (m_kart->getSpeed() > 15.0f && !m_is_uturn && m_turn_radius > 30.0f &&
        !ignorePathFinding())
    {
        // Only use nitro when turn angle is big (180 - angle)
        m_controls->setNitro(true);
    }

    if (m_is_uturn)
    {
        resetAfterStop();
        doUTurn(dt);
    }
    else
    {
        configSpeed();
        setSteering(m_steering_angle, dt);
    }

    AIBaseController::update(dt);

}   // update