/** Called when a mouse click happens. If the click happened while the mouse * was hovering on top of a challenge, the kart will be teleported to * the challenge. * \param x,y Mouse coordinates. */ void OverWorld::onMouseClick(int x, int y) { const OverworldChallenge *challenge = ((RaceGUIOverworld*)getRaceGUI())->getCurrentChallenge(); if(challenge) { // Use the 'get closest start point' rescue function // from WorldWithRank by setting the kart's position to // be the location of the challenge bubble. AbstractKart* kart = getKart(0); kart->setXYZ(challenge->m_position); unsigned int index = getRescuePositionIndex(kart); btTransform s = getRescueTransform(index); const btVector3 &xyz = s.getOrigin(); float angle = atan2(challenge->m_position.X - xyz[0], challenge->m_position.Z - xyz[2]); s.setRotation( btQuaternion(btVector3(0.0f, 1.0f, 0.0f), angle) ); moveKartTo(kart, s); return; } } // onMouseClick
/** This function is called after instanciating. This can't be moved to the * contructor as child classes must be instanciated, otherwise polymorphism * will fail and the results will be incorrect . Also in init() functions * can be called that use World::getWorld(). */ void World::init() { race_state = new RaceState(); m_faster_music_active = false; m_fastest_kart = 0; m_eliminated_karts = 0; m_eliminated_players = 0; m_num_players = 0; // Create the race gui before anything else is attached to the scene node // (which happens when the track is loaded). This allows the race gui to // do any rendering on texture. createRaceGUI(); // Grab the track file m_track = track_manager->getTrack(race_manager->getTrackName()); if(!m_track) { std::ostringstream msg; msg << "Track '" << race_manager->getTrackName() << "' not found.\n"; throw std::runtime_error(msg.str()); } // Create the physics m_physics = new Physics(); unsigned int num_karts = race_manager->getNumberOfKarts(); //assert(num_karts > 0); // Load the track models - this must be done before the karts so that the // karts can be positioned properly on (and not in) the tracks. m_track->loadTrackModel(this, race_manager->getReverseTrack()); for(unsigned int i=0; i<num_karts; i++) { std::string kart_ident = history->replayHistory() ? history->getKartIdent(i) : race_manager->getKartIdent(i); int local_player_id = race_manager->getKartLocalPlayerId(i); int global_player_id = race_manager->getKartGlobalPlayerId(i); AbstractKart* newkart = createKart(kart_ident, i, local_player_id, global_player_id, race_manager->getKartType(i)); m_karts.push_back(newkart); m_track->adjustForFog(newkart->getNode()); } // for i if(ReplayPlay::get()) ReplayPlay::get()->Load(); resetAllKarts(); // Note: track reset must be called after all karts exist, since check // objects need to allocate data structures depending on the number // of karts. m_track->reset(); if(!history->replayHistory()) history->initRecording(); if(ReplayRecorder::get()) ReplayRecorder::get()->init(); network_manager->worldLoaded(); powerup_manager->updateWeightsForRace(num_karts); // erase messages left over RaceGUIBase* rg = getRaceGUI(); if (rg) { rg->init(); rg->clearAllMessages(); } } // init