/** Localize the ball on the navigation mesh. */ void SoccerWorld::updateBallPosition(float dt) { if (isRaceOver()) return; m_ball_position = m_ball->getPresentation<TrackObjectPresentationMesh>() ->getNode()->getPosition(); if (m_track->hasNavMesh()) { m_ball_on_node = BattleGraph::get()->pointToNode(m_ball_on_node, m_ball_position, true/*ignore_vertical*/); if (m_ball_on_node == BattleGraph::UNKNOWN_POLY && World::getWorld()->getPhase() == RACE_PHASE) { m_ball_invalid_timer += dt; // Reset the ball and karts if out of navmesh after 2 seconds if (m_ball_invalid_timer >= 2.0f) { m_ball_invalid_timer = 0.0f; resetBall(); for (unsigned int i = 0; i < m_karts.size(); i++) moveKartAfterRescue(m_karts[i]); } } else m_ball_invalid_timer = 0.0f; } } // updateBallPosition
/** Localize the ball on the navigation mesh. */ void SoccerWorld::updateBallPosition(int ticks) { if (isRaceOver()) return; if (!ballNotMoving()) { // Only update heading if the ball is moving m_ball_heading = atan2f(m_ball_body->getLinearVelocity().getX(), m_ball_body->getLinearVelocity().getZ()); } if (Track::getCurrentTrack()->hasNavMesh()) { m_ball_track_sector ->update(getBallPosition(), true/*ignore_vertical*/); if (!m_ball_track_sector->isOnRoad() && getPhase() == RACE_PHASE) { m_ball_invalid_timer += ticks; // Reset the ball and karts if out of navmesh after 2 seconds if (m_ball_invalid_timer >= stk_config->time2Ticks(2.0f)) { m_ball_invalid_timer = 0; m_ball->reset(); for (unsigned int i = 0; i < m_karts.size(); i++) moveKartAfterRescue(m_karts[i]); if (UserConfigParams::m_arena_ai_stats) getKart(8)->flyUp(); } } else m_ball_invalid_timer = 0; } } // updateBallPosition
/** Update the world and the track. * \param dt Time step size. */ void SoccerWorld::update(float dt) { updateBallPosition(dt); if (m_track->hasNavMesh()) { updateKartNodes(); updateAIData(); } WorldWithRank::update(dt); WorldWithRank::updateTrack(dt); if (getPhase() == World::GOAL_PHASE) { if (m_goal_timer == 0.0f) { // Stop all karts for (unsigned int i = 0; i < m_karts.size(); i++) m_karts[i]->setVelocity(btVector3(0, 0, 0)); } m_goal_timer += dt; if (m_goal_timer > 3.0f) { setPhase(WorldStatus::RACE_PHASE); m_goal_timer = 0.0f; if (!isRaceOver()) { // Reset all karts for (unsigned int i = 0; i < m_karts.size(); i++) moveKartAfterRescue(m_karts[i]); if (UserConfigParams::m_arena_ai_stats) getKart(8)->flyUp(); } } } if (UserConfigParams::m_arena_ai_stats) m_frame_count++; } // update
/** Update the world and the track. * \param ticks Physics time steps - should be 1. */ void SoccerWorld::update(int ticks) { updateBallPosition(ticks); if (Track::getCurrentTrack()->hasNavMesh()) { updateSectorForKarts(); updateAIData(); } WorldWithRank::update(ticks); WorldWithRank::updateTrack(ticks); if (getPhase() == World::GOAL_PHASE) { if (m_goal_timer == 0) { // Stop all karts for (unsigned int i = 0; i < m_karts.size(); i++) m_karts[i]->setVelocity(btVector3(0, 0, 0)); } m_goal_timer += ticks; if (m_goal_timer > stk_config->time2Ticks(3.0f)) { setPhase(WorldStatus::RACE_PHASE); m_goal_timer = 0; if (!isRaceOver()) { // Reset all karts for (unsigned int i = 0; i < m_karts.size(); i++) moveKartAfterRescue(m_karts[i]); if (UserConfigParams::m_arena_ai_stats) getKart(8)->flyUp(); } } } if (UserConfigParams::m_arena_ai_stats) m_frame_count++; } // update
/** Update the world and the track. * \param dt Time step size. */ void SoccerWorld::update(float dt) { World *world = World::getWorld(); WorldWithRank::update(dt); WorldWithRank::updateTrack(dt); updateBallPosition(dt); if (m_track->hasNavMesh()) { updateKartNodes(); updateDefenders(); } if (world->getPhase() == World::GOAL_PHASE) { if (m_goal_timer == 0.0f) { // Stop all karts for (unsigned int i = 0; i < m_karts.size(); i++) m_karts[i]->setVelocity(btVector3(0, 0, 0)); } m_goal_timer += dt; if (m_goal_timer > 3.0f) { world->setPhase(WorldStatus::RACE_PHASE); m_goal_timer = 0.0f; if (!isRaceOver()) { // Reset all karts for (unsigned int i = 0; i < m_karts.size(); i++) moveKartAfterRescue(m_karts[i]); } } } } // update
/** Localize the ball on the navigation mesh. */ void SoccerWorld::updateBallPosition(float dt) { if (isRaceOver()) return; if (!ballNotMoving()) { // Only update heading if the ball is moving m_ball_heading = atan2f(m_ball_body->getLinearVelocity().getX(), m_ball_body->getLinearVelocity().getZ()); } if (m_track->hasNavMesh()) { m_ball_on_node = BattleGraph::get()->pointToNode(m_ball_on_node, getBallPosition(), true/*ignore_vertical*/); if (m_ball_on_node == BattleGraph::UNKNOWN_POLY && getPhase() == RACE_PHASE) { m_ball_invalid_timer += dt; // Reset the ball and karts if out of navmesh after 2 seconds if (m_ball_invalid_timer >= 2.0f) { m_ball_invalid_timer = 0.0f; m_ball->reset(); for (unsigned int i = 0; i < m_karts.size(); i++) moveKartAfterRescue(m_karts[i]); if (UserConfigParams::m_arena_ai_stats) getKart(8)->flyUp(); } } else m_ball_invalid_timer = 0.0f; } } // updateBallPosition