/** This is the main interface to update the world. This function calls * update(), and checks then for the end of the race. Note that race over * handling can not necessarily be done in update(), since not all * data structures might have been updated (e.g.LinearWorld must * call World::update() first, to get updated kart positions. If race * over would be handled in World::update, LinearWorld had no opportunity * to update its data structures before the race is finished). * \param dt Time step size. */ void World::updateWorld(float dt) { if (m_schedule_pause) { pause(m_scheduled_pause_phase); m_schedule_pause = false; } else if (m_schedule_unpause) { unpause(); m_schedule_unpause = false; } if (m_self_destruct) { delete this; return; } // Don't update world if a menu is shown or the race is over. if( getPhase() == FINISH_PHASE || getPhase() == IN_GAME_MENU_PHASE ) return; update(dt); if( (!isFinishPhase()) && isRaceOver()) { enterRaceOverState(); } } // updateWorld
/** This is the main interface to update the world. This function calls * update(), and checks then for the end of the race. Note that race over * handling can not necessarily be done in update(), since not all * data structures might have been updated (e.g.LinearWorld must * call World::update() first, to get updated kart positions. If race * over would be handled in World::update, LinearWorld had no opportunity * to update its data structures before the race is finished). * \param dt Time step size. */ void World::updateWorld(float dt) { #ifdef DEBUG assert(m_magic_number == 0xB01D6543); #endif if (m_schedule_pause) { pause(m_scheduled_pause_phase); m_schedule_pause = false; } else if (m_schedule_unpause) { unpause(); m_schedule_unpause = false; } if (m_self_destruct) { delete this; return; } // Don't update world if a menu is shown or the race is over. if( getPhase() == FINISH_PHASE || getPhase() == IN_GAME_MENU_PHASE ) return; try { update(dt); } catch (AbortWorldUpdateException& e) { (void)e; // avoid compiler warning return; } #ifdef DEBUG assert(m_magic_number == 0xB01D6543); #endif if( (!isFinishPhase()) && isRaceOver()) { enterRaceOverState(); } else { if (m_schedule_exit_race) { m_schedule_exit_race = false; race_manager->exitRace(false); race_manager->setAIKartOverride(""); StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance()); if (m_schedule_tutorial) { m_schedule_tutorial = false; race_manager->setNumLocalPlayers(1); race_manager->setMajorMode (RaceManager::MAJOR_MODE_SINGLE); race_manager->setMinorMode (RaceManager::MINOR_MODE_TUTORIAL); race_manager->setNumKarts( 1 ); race_manager->setTrack( "tutorial" ); race_manager->setDifficulty(RaceManager::DIFFICULTY_EASY); race_manager->setReverseTrack(false); // Use keyboard 0 by default (FIXME: let player choose?) InputDevice* device = input_manager->getDeviceManager()->getKeyboard(0); // Create player and associate player with keyboard StateManager::get()->createActivePlayer(PlayerManager::getCurrentPlayer(), device); if (!kart_properties_manager->getKart(UserConfigParams::m_default_kart)) { Log::warn("[World]", "Cannot find kart '%s', will revert to default.", UserConfigParams::m_default_kart.c_str()); UserConfigParams::m_default_kart.revertToDefaults(); } race_manager->setLocalKartInfo(0, UserConfigParams::m_default_kart); // ASSIGN should make sure that only input from assigned devices // is read. input_manager->getDeviceManager()->setAssignMode(ASSIGN); input_manager->getDeviceManager() ->setSinglePlayer( StateManager::get()->getActivePlayer(0) ); delete this; StateManager::get()->enterGameState(); race_manager->setupPlayerKartInfo(); race_manager->startNew(true); } else { delete this; if (race_manager->raceWasStartedFromOverworld()) { OverWorld::enterOverWorld(); } } } } } // updateWorld