/** Run the actual main loop. */ void MainLoop::run() { IrrlichtDevice* device = irr_driver->getDevice(); m_curr_time = device->getTimer()->getRealTime(); while(!m_abort) { PROFILER_PUSH_CPU_MARKER("Main loop", 0xFF, 0x00, 0xF7); m_prev_time = m_curr_time; float dt = getLimitedDt(); network_manager->update(dt); if (World::getWorld()) // race is active if world exists { // Busy wait if race_manager is active (i.e. creating of world is done) // till all clients have reached this state. if (network_manager->getState()==NetworkManager::NS_READY_SET_GO_BARRIER) continue; updateRace(dt); } // if race is active // We need to check again because update_race may have requested // the main loop to abort; and it's not a good idea to continue // since the GUI engine is no more to be called then. // Also only do music, input, and graphics update if graphics are // enabled. if (!m_abort && !ProfileWorld::isNoGraphics()) { PROFILER_PUSH_CPU_MARKER("Music manager update", 0x7F, 0x00, 0x00); music_manager->update(dt); PROFILER_POP_CPU_MARKER(); PROFILER_PUSH_CPU_MARKER("Input manager update", 0x00, 0x7F, 0x00); input_manager->update(dt); PROFILER_POP_CPU_MARKER(); #ifdef ENABLE_WIIUSE wiimote_manager->update(); #endif PROFILER_PUSH_CPU_MARKER("IrrDriver update", 0x00, 0x00, 0x7F); irr_driver->update(dt); PROFILER_POP_CPU_MARKER(); PROFILER_SYNC_FRAME(); } PROFILER_POP_CPU_MARKER(); } // while !m_exit } // run
/** Run the actual main loop. * The sequnce in which various parts of STK are updated is: * - Determine next time step size (`getLimitedDt`). This takes maximum fps * into account (i.e. sleep if the fps would be too high), and will actually * slow down the in-game clock if the fps are too low (if more than 3/60 of * a second have passed, more than 3 physics time steps would be needed, * and physics do at most 3 time steps). * - if a race is taking place (i.e. not only a menu being shown), call * `updateRace()`, which is a thin wrapper around a call to * `World::updateWorld()`: * - Update history manager (which will either set the kart position and/or * controls when replaying, or store the current info for a replay). * This is mostly for debugging only (though available even in release * mode). * - Updates Replays - either storing data when not replaying, or * updating kart positions/control when replaying). * - Calls `WorldStatus::update()`, which updates the race state (e.g. * go from 'ready' to 'set' etc), and clock. * - Updates the physics (`Physics::update()`). This will simulate all * physical objects for the specified time with bullet. * - Updates all karts (`Kart::update()`). Obviously the update function * does a lot more than what is described here, this is only supposed to * be a _very_ high level overview: * - Updates its rewinder (to store potentially changed controls * as events) in `KartRewinder::update()`. * - Calls `Moveable::update()`, which takes the new position from * the physics and saves it (and computes dependent values, like * heading, local velocity). * - Updates its controller. This is either: * - an AI using `SkiddingController::update()` (which then will * compute the new controls), or * - a player controller using `PlayerController::update()`, which will * handle smooth steering (in case of digital input devices steering * is adjusted a bit over time to avoid an instant change from all * left to all right). Input events will be handled when updating * the irrlicht driver later at the end of the main loop. * - Updates kart animation (like rescue, ...) if one is shown atm. * - Update attachments. * - update physics, i.e. taking the current steering and updating * the bullet raycast vehicle with that data. The settings are actually * only used in the next frame when the physics are updated. * - Updates all cameras via `Camera::update()`. The camera position and * rotation is adjusted according to the position etc of the kart (and * special circumstances like rescue, falling). * - Updates all projectiles using the projectile manager. Some of the * projectiles are mostly handled by the physics (e.g. a cake will mainly * check if it's out of bounds), others (like basket ball) do all * their aiming and movement here. * - Updates the rewind manager to store rewind states. * - Updates the music manager. * - Updates the input manager (which only updates internal time, actual * input handling follows late) * - Updates the wiimote manager. This will read the data of all wiimotes * and feed the corresponding events to the irrlicht event system. * - Updates the STK internal gui engine. This updates all widgets, and * e.g. takes care of the rotation of the karts in the KartSelection * screen using the ModelViewWidget. * - Updates STK's irrlicht driver `IrrDriver::update()`: * - Calls Irrlicht's `beginScene()` . * - Renders the scene (several times with different viewport if * split screen is being used) * - Calls `GUIEngine::render()`, which renders all widgets with the * help of Irrlicht's GUIEnvironment (`drawAll()`). This will also * handle all events, i.e. all input is now handled (e.g. steering, * firing etc are all set in the corresponding karts depending on * user input). * - Calls Irrlicht's `endScene()` */ void MainLoop::run() { IrrlichtDevice* device = irr_driver->getDevice(); m_curr_time = device->getTimer()->getRealTime(); while(!m_abort) { PROFILER_PUSH_CPU_MARKER("Main loop", 0xFF, 0x00, 0xF7); m_prev_time = m_curr_time; float dt = getLimitedDt(); if (!m_abort && !ProfileWorld::isNoGraphics()) { // Render the previous frame, and also handle all user input. PROFILER_PUSH_CPU_MARKER("IrrDriver update", 0x00, 0x00, 0x7F); irr_driver->update(dt); PROFILER_POP_CPU_MARKER(); } if (World::getWorld()) // race is active if world exists { PROFILER_PUSH_CPU_MARKER("Update race", 0, 255, 255); updateRace(dt); PROFILER_POP_CPU_MARKER(); } // if race is active // We need to check again because update_race may have requested // the main loop to abort; and it's not a good idea to continue // since the GUI engine is no more to be called then. // Also only do music, input, and graphics update if graphics are // enabled. if (!m_abort && !ProfileWorld::isNoGraphics()) { PROFILER_PUSH_CPU_MARKER("Music/input/GUI", 0x7F, 0x00, 0x00); input_manager->update(dt); #ifdef ENABLE_WIIUSE wiimote_manager->update(); #endif GUIEngine::update(dt); PROFILER_POP_CPU_MARKER(); // Update sfx and music after graphics, so that graphics code // can use as many threads as possible without interfering // with audio PROFILER_PUSH_CPU_MARKER("Music/input/GUI", 0x7F, 0x00, 0x00); SFXManager::get()->update(); PROFILER_POP_CPU_MARKER(); PROFILER_PUSH_CPU_MARKER("Protocol manager update", 0x7F, 0x00, 0x7F); if (STKHost::existHost()) { if (STKHost::get()->requestedShutdown()) STKHost::get()->shutdown(); else ProtocolManager::getInstance()->update(dt); } PROFILER_POP_CPU_MARKER(); PROFILER_PUSH_CPU_MARKER("Database polling update", 0x00, 0x7F, 0x7F); Online::RequestManager::get()->update(dt); PROFILER_POP_CPU_MARKER(); } else if (!m_abort && ProfileWorld::isNoGraphics()) { PROFILER_PUSH_CPU_MARKER("Protocol manager update", 0x7F, 0x00, 0x7F); if(NetworkConfig::get()->isNetworking()) ProtocolManager::getInstance()->update(dt); PROFILER_POP_CPU_MARKER(); PROFILER_PUSH_CPU_MARKER("Database polling update", 0x00, 0x7F, 0x7F); Online::RequestManager::get()->update(dt); PROFILER_POP_CPU_MARKER(); } if (World::getWorld() ) { World::getWorld()->updateTime(dt); } PROFILER_POP_CPU_MARKER(); PROFILER_SYNC_FRAME(); } // while !m_abort } // run
CharCreateDialog::CharCreateDialog(CharSelectDialog *const parent, const int slot) : // TRANSLATORS: char create dialog name Window(_("New Character"), Modal_true, parent, "charcreate.xml"), ActionListener(), KeyListener(), mCharSelectDialog(parent), mNameField(new TextField(this, "")), // TRANSLATORS: char create dialog label mNameLabel(new Label(this, _("Name:"))), // TRANSLATORS: This is a narrow symbol used to denote 'next'. // You may change this symbol if your language uses another. // TRANSLATORS: char create dialog button mNextHairColorButton(new Button(this, _(">"), "nextcolor", this)), // TRANSLATORS: This is a narrow symbol used to denote 'previous'. // You may change this symbol if your language uses another. // TRANSLATORS: char create dialog button mPrevHairColorButton(new Button(this, _("<"), "prevcolor", this)), // TRANSLATORS: char create dialog label mHairColorLabel(new Label(this, _("Hair color:"))), mHairColorNameLabel(new Label(this, "")), // TRANSLATORS: char create dialog button mNextHairStyleButton(new Button(this, _(">"), "nextstyle", this)), // TRANSLATORS: char create dialog button mPrevHairStyleButton(new Button(this, _("<"), "prevstyle", this)), // TRANSLATORS: char create dialog label mHairStyleLabel(new Label(this, _("Hair style:"))), mHairStyleNameLabel(new Label(this, "")), mNextRaceButton(nullptr), mPrevRaceButton(nullptr), mRaceLabel(nullptr), mRaceNameLabel(nullptr), mNextLookButton(nullptr), mPrevLookButton(nullptr), mLookLabel(nullptr), mLookNameLabel(nullptr), // TRANSLATORS: char create dialog button mActionButton(new Button(this, _("^"), "action", this)), // TRANSLATORS: char create dialog button mRotateButton(new Button(this, _(">"), "rotate", this)), mAttributeSlider(), mAttributeLabel(), mAttributeValue(), mAttributesLeft(new Label(this, // TRANSLATORS: char create dialog label strprintf(_("Please distribute %d points"), 99))), // TRANSLATORS: char create dialog button mCreateButton(new Button(this, _("Create"), "create", this)), // TRANSLATORS: char create dialog button mCancelButton(new Button(this, _("Cancel"), "cancel", this)), mPlayer(new Being(BeingId_zero, ActorType::Player, BeingTypeId_zero, nullptr)), mPlayerBox(new PlayerBox(this, mPlayer, "charcreate_playerbox.xml", "charcreate_selectedplayerbox.xml")), mGenderStrip(nullptr), mMaxPoints(0), mUsedPoints(0), mRace(CharDB::getMinRace()), mLook(0), mMinLook(CharDB::getMinLook()), mMaxLook(CharDB::getMaxLook()), mMinRace(CharDB::getMinRace()), mMaxRace(CharDB::getMaxRace()), mHairStyle(0), mHairColor(0), mSlot(slot), mDefaultGender(Gender::FEMALE), mGender(Gender::UNSPECIFIED), maxHairColor(CharDB::getMaxHairColor()), minHairColor(CharDB::getMinHairColor()), maxHairStyle(CharDB::getMaxHairStyle()), minHairStyle(CharDB::getMinHairStyle()), mAction(0), mDirection(0) { setStickyButtonLock(true); setSticky(true); setWindowName("NewCharacter"); const int w = 480; const int h = 350; setContentSize(w, h); mPlayer->setGender(Gender::MALE); const std::vector<int> &items = CharDB::getDefaultItems(); int i = 1; for (std::vector<int>::const_iterator it = items.begin(), it_end = items.end(); it != it_end; ++ it, i ++) { mPlayer->setSprite(i, *it); } if (!maxHairColor) maxHairColor = ColorDB::getHairSize(); if (!maxHairStyle) maxHairStyle = mPlayer->getNumOfHairstyles(); if (maxHairStyle) { mHairStyle = (static_cast<unsigned int>(rand()) % maxHairStyle) + minHairStyle; } else { mHairStyle = 0; } if (maxHairColor) { mHairColor = (static_cast<unsigned int>(rand()) % maxHairColor) + minHairColor; } else { mHairColor = 0; } mNameField->setMaximum(24); if (serverFeatures->haveRaceSelection()) { // TRANSLATORS: char create dialog button mNextRaceButton = new Button(this, _(">"), "nextrace", this); // TRANSLATORS: char create dialog button mPrevRaceButton = new Button(this, _("<"), "prevrace", this); // TRANSLATORS: char create dialog label mRaceLabel = new Label(this, _("Race:")); mRaceNameLabel = new Label(this, ""); } if (serverFeatures->haveLookSelection() && mMinLook < mMaxLook) { // TRANSLATORS: char create dialog button mNextLookButton = new Button(this, _(">"), "nextlook", this); // TRANSLATORS: char create dialog button mPrevLookButton = new Button(this, _("<"), "prevlook", this); // TRANSLATORS: char create dialog label mLookLabel = new Label(this, _("Look:")); mLookNameLabel = new Label(this, ""); } if (serverFeatures->haveCreateCharGender()) { const int size = config.getIntValue("fontSize"); mGenderStrip = new TabStrip(this, "gender_" + getWindowName(), size + 16); mGenderStrip->setPressFirst(false); mGenderStrip->addActionListener(this); mGenderStrip->setActionEventId("gender_"); // TRANSLATORS: one char size female character gender mGenderStrip->addButton(_("F"), "f", false); // TRANSLATORS: one char size male character gender mGenderStrip->addButton(_("M"), "m", false); // TRANSLATORS: one char size unknown character gender mGenderStrip->addButton(_("U"), "u", true); mGenderStrip->setVisible(Visible_true); add(mGenderStrip); mGenderStrip->setPosition(385, 130); mGenderStrip->setWidth(500); mGenderStrip->setHeight(50); } mPlayerBox->setWidth(74); mNameField->setActionEventId("create"); mNameField->addActionListener(this); mPlayerBox->setDimension(Rect(360, 0, 110, 90)); mActionButton->setPosition(385, 100); mRotateButton->setPosition(415, 100); mNameLabel->setPosition(5, 2); mNameField->setDimension( Rect(60, 2, 300, mNameField->getHeight())); const int leftX = 120; const int rightX = 300; const int labelX = 5; const int nameX = 145; int y = 30; mPrevHairColorButton->setPosition(leftX, y); mNextHairColorButton->setPosition(rightX, y); y += 5; mHairColorLabel->setPosition(labelX, y); mHairColorNameLabel->setPosition(nameX, y); y += 24; mPrevHairStyleButton->setPosition(leftX, y); mNextHairStyleButton->setPosition(rightX, y); y += 5; mHairStyleLabel->setPosition(labelX, y); mHairStyleNameLabel->setPosition(nameX, y); if (serverFeatures->haveLookSelection() && mMinLook < mMaxLook) { y += 24; if (mPrevLookButton) mPrevLookButton->setPosition(leftX, y); if (mNextLookButton) mNextLookButton->setPosition(rightX, y); y += 5; if (mLookLabel) mLookLabel->setPosition(labelX, y); if (mLookNameLabel) mLookNameLabel->setPosition(nameX, y); // 93 } if (serverFeatures->haveRaceSelection()) { y += 24; if (mPrevRaceButton) mPrevRaceButton->setPosition(leftX, y); if (mNextRaceButton) mNextRaceButton->setPosition(rightX, y); y += 5; if (mRaceLabel) mRaceLabel->setPosition(labelX, y); if (mRaceNameLabel) mRaceNameLabel->setPosition(nameX, y); } updateSliders(); setButtonsPosition(w, h); add(mPlayerBox); add(mNameField); add(mNameLabel); add(mNextHairColorButton); add(mPrevHairColorButton); add(mHairColorLabel); add(mHairColorNameLabel); add(mNextHairStyleButton); add(mPrevHairStyleButton); add(mHairStyleLabel); add(mHairStyleNameLabel); add(mActionButton); add(mRotateButton); if (serverFeatures->haveLookSelection() && mMinLook < mMaxLook) { add(mNextLookButton); add(mPrevLookButton); add(mLookLabel); add(mLookNameLabel); } if (serverFeatures->haveRaceSelection()) { add(mNextRaceButton); add(mPrevRaceButton); add(mRaceLabel); add(mRaceNameLabel); } add(mAttributesLeft); add(mCreateButton); add(mCancelButton); center(); setVisible(Visible_true); mNameField->requestFocus(); updateHair(); if (serverFeatures->haveRaceSelection()) updateRace(); if (serverFeatures->haveLookSelection() && mMinLook < mMaxLook) updateLook(); updatePlayer(); addKeyListener(this); }
void CharCreateDialog::action(const ActionEvent &event) { const std::string &id = event.getId(); if (id == "create") { if (getName().length() >= 4) { // Attempt to create the character mCreateButton->setEnabled(false); std::vector<int> atts; for (size_t i = 0, sz = mAttributeSlider.size(); i < sz; i++) { atts.push_back(static_cast<int>( mAttributeSlider[i]->getValue())); } const int characterSlot = mSlot; charServerHandler->newCharacter(getName(), characterSlot, mGender, mHairStyle, mHairColor, static_cast<unsigned char>(mRace), static_cast<unsigned char>(mLook), atts); } else { CREATEWIDGET(OkDialog, // TRANSLATORS: char creation error _("Error"), // TRANSLATORS: char creation error _("Your name needs to be at least 4 characters."), // TRANSLATORS: ok dialog button _("OK"), DialogType::ERROR, Modal_true, ShowCenter_true, nullptr, 260); } } else if (id == "cancel") { scheduleDelete(); } else if (id == "nextcolor") { mHairColor ++; updateHair(); } else if (id == "prevcolor") { mHairColor --; updateHair(); } else if (id == "nextstyle") { mHairStyle ++; updateHair(); } else if (id == "prevstyle") { mHairStyle --; updateHair(); } else if (id == "nextrace") { mRace ++; updateRace(); } else if (id == "prevrace") { mRace --; updateRace(); } else if (id == "nextlook") { mLook ++; updateLook(); } else if (id == "prevlook") { mLook --; updateLook(); } else if (id == "statslider") { updateSliders(); } else if (id == "action") { mAction ++; if (mAction >= 5) mAction = 0; updatePlayer(); } else if (id == "rotate") { mDirection ++; if (mDirection >= 4) mDirection = 0; updatePlayer(); } else if (id == "gender_m") { mGender = Gender::MALE; mPlayer->setGender(Gender::MALE); } else if (id == "gender_f") { mGender = Gender::FEMALE; mPlayer->setGender(Gender::FEMALE); } else if (id == "gender_u") { mGender = Gender::UNSPECIFIED; mPlayer->setGender(mDefaultGender); } }
CharCreateDialog::CharCreateDialog(CharSelectDialog *parent, int slot): Window(_("New Character"), true, parent, "charcreate.xml"), mCharSelectDialog(parent), mRace(0), mSlot(slot), mAction(0), mDirection(0) { setStickyButtonLock(true); setSticky(true); setWindowName("NewCharacter"); mPlayer = new Being(0, ActorSprite::PLAYER, mRace, nullptr); mPlayer->setGender(GENDER_MALE); maxHairColor = CharDB::getMaxHairColor(); minHairColor = CharDB::getMinHairColor(); if (!maxHairColor) maxHairColor = ColorDB::getHairSize(); maxHairStyle = CharDB::getMaxHairStyle(); minHairStyle = CharDB::getMinHairStyle(); if (!maxHairStyle) maxHairStyle = mPlayer->getNumOfHairstyles(); mHairStyle = (rand() % maxHairStyle) + minHairStyle; mHairColor = (rand() % maxHairColor) + minHairColor; mNameField = new TextField(""); mNameField->setMaximum(24); mNameLabel = new Label(_("Name:")); // TRANSLATORS: This is a narrow symbol used to denote 'next'. // You may change this symbol if your language uses another. mNextHairColorButton = new Button(_(">"), "nextcolor", this); // TRANSLATORS: This is a narrow symbol used to denote 'previous'. // You may change this symbol if your language uses another. mPrevHairColorButton = new Button(_("<"), "prevcolor", this); mHairColorLabel = new Label(_("Hair color:")); mHairColorNameLabel = new Label(""); mNextHairStyleButton = new Button(_(">"), "nextstyle", this); mPrevHairStyleButton = new Button(_("<"), "prevstyle", this); mHairStyleLabel = new Label(_("Hair style:")); mHairStyleNameLabel = new Label(""); mActionButton = new Button(_("^"), "action", this); mRotateButton = new Button(_(">"), "rotate", this); if (serverVersion >= 2) { mNextRaceButton = new Button(_(">"), "nextrace", this); mPrevRaceButton = new Button(_("<"), "prevrace", this); mRaceLabel = new Label(_("Race:")); mRaceNameLabel = new Label(""); } mCreateButton = new Button(_("Create"), "create", this); mCancelButton = new Button(_("Cancel"), "cancel", this); mMale = new RadioButton(_("Male"), "gender"); mFemale = new RadioButton(_("Female"), "gender"); mOther = new RadioButton(_("Other"), "gender"); // Default to a Male character mMale->setSelected(true); mMale->setActionEventId("gender"); mFemale->setActionEventId("gender"); mOther->setActionEventId("gender"); mMale->addActionListener(this); mFemale->addActionListener(this); mOther->addActionListener(this); mPlayerBox = new PlayerBox(mPlayer); mPlayerBox->setWidth(74); mNameField->setActionEventId("create"); mNameField->addActionListener(this); mAttributesLeft = new Label( strprintf(_("Please distribute %d points"), 99)); int w = 480; int h = 350; setContentSize(w, h); mPlayerBox->setDimension(gcn::Rectangle(350, 40, 110, 90)); mActionButton->setPosition(375, 140); mRotateButton->setPosition(405, 140); mNameLabel->setPosition(5, 10); mNameField->setDimension( gcn::Rectangle(60, 10, 300, mNameField->getHeight())); int leftX = 120; int rightX = 300; int labelX = 5; int nameX = 145; mPrevHairColorButton->setPosition(leftX, 40); mNextHairColorButton->setPosition(rightX, 40); mHairColorLabel->setPosition(labelX, 45); mHairColorNameLabel->setPosition(nameX, 45); mPrevHairStyleButton->setPosition(leftX, 69); mNextHairStyleButton->setPosition(rightX, 69); mHairStyleLabel->setPosition(labelX, 74); mHairStyleNameLabel->setPosition(nameX, 74); if (serverVersion >= 2) { mPrevRaceButton->setPosition(leftX, 103); mNextRaceButton->setPosition(rightX, 103); mRaceLabel->setPosition(labelX, 108); mRaceNameLabel->setPosition(nameX, 108); } mAttributesLeft->setPosition(15, 280); updateSliders(); mCancelButton->setPosition( w / 2, h - 5 - mCancelButton->getHeight()); mCreateButton->setPosition( mCancelButton->getX() - 5 - mCreateButton->getWidth(), h - 5 - mCancelButton->getHeight()); mMale->setPosition(30, 120); mFemale->setPosition(100, 120); mOther->setPosition(170, 120); add(mPlayerBox); add(mNameField); add(mNameLabel); add(mNextHairColorButton); add(mPrevHairColorButton); add(mHairColorLabel); add(mHairColorNameLabel); add(mNextHairStyleButton); add(mPrevHairStyleButton); add(mHairStyleLabel); add(mHairStyleNameLabel); add(mActionButton); add(mRotateButton); if (serverVersion >= 2) { add(mNextRaceButton); add(mPrevRaceButton); add(mRaceLabel); add(mRaceNameLabel); } add(mAttributesLeft); add(mCreateButton); add(mCancelButton); add(mMale); add(mFemale); add(mOther); center(); setVisible(true); mNameField->requestFocus(); updateHair(); if (serverVersion >= 2) updateRace(); updatePlayer(); addKeyListener(this); }
void CharCreateDialog::action(const gcn::ActionEvent &event) { const std::string id = event.getId(); if (id == "create") { if ( #ifdef MANASERV_SUPPORT Net::getNetworkType() == ServerInfo::MANASERV || #endif getName().length() >= 4) { // Attempt to create the character mCreateButton->setEnabled(false); std::vector<int> atts; for (unsigned i = 0; i < mAttributeSlider.size(); i++) { atts.push_back(static_cast<int>( mAttributeSlider[i]->getValue())); } int characterSlot = mSlot; #ifdef MANASERV_SUPPORT // On Manaserv, the slots start at 1, so we offset them. if (Net::getNetworkType() == ServerInfo::MANASERV) ++characterSlot; #endif Net::getCharHandler()->newCharacter(getName(), characterSlot, mFemale->isSelected(), mHairStyle, mHairColor, mRace, atts); } else { new OkDialog(_("Error"), _("Your name needs to be at least 4 characters."), DIALOG_ERROR, true, this); } } else if (id == "cancel") { scheduleDelete(); } else if (id == "nextcolor") { mHairColor ++; updateHair(); } else if (id == "prevcolor") { mHairColor --; updateHair(); } else if (id == "nextstyle") { mHairStyle ++; updateHair(); } else if (id == "prevstyle") { mHairStyle --; updateHair(); } else if (id == "nextrace") { mRace ++; updateRace(); } else if (id == "prevrace") { mRace --; updateRace(); } else if (id == "statslider") { updateSliders(); } else if (id == "gender") { if (mMale->isSelected()) mPlayer->setGender(GENDER_MALE); else mPlayer->setGender(GENDER_FEMALE); } else if (id == "action") { mAction ++; if (mAction >= 5) mAction = 0; updatePlayer(); } else if (id == "rotate") { mDirection ++; if (mDirection >= 4) mDirection = 0; updatePlayer(); } }
/** Run the actual main loop. */ void MainLoop::run() { IrrlichtDevice* device = irr_driver->getDevice(); m_curr_time = device->getTimer()->getRealTime(); while(!m_abort) { PROFILER_PUSH_CPU_MARKER("Main loop", 0xFF, 0x00, 0xF7); m_prev_time = m_curr_time; float dt = getLimitedDt(); if (World::getWorld()) // race is active if world exists { PROFILER_PUSH_CPU_MARKER("Update race", 0, 255, 255); updateRace(dt); PROFILER_POP_CPU_MARKER(); } // if race is active // We need to check again because update_race may have requested // the main loop to abort; and it's not a good idea to continue // since the GUI engine is no more to be called then. // Also only do music, input, and graphics update if graphics are // enabled. if (!m_abort && !ProfileWorld::isNoGraphics()) { PROFILER_PUSH_CPU_MARKER("Music/input/GUI", 0x7F, 0x00, 0x00); music_manager->update(dt); input_manager->update(dt); #ifdef ENABLE_WIIUSE wiimote_manager->update(); #endif GUIEngine::update(dt); PROFILER_POP_CPU_MARKER(); PROFILER_PUSH_CPU_MARKER("IrrDriver update", 0x00, 0x00, 0x7F); irr_driver->update(dt); PROFILER_POP_CPU_MARKER(); PROFILER_PUSH_CPU_MARKER("Protocol manager update", 0x7F, 0x00, 0x7F); ProtocolManager::getInstance()->update(); PROFILER_POP_CPU_MARKER(); PROFILER_PUSH_CPU_MARKER("Database polling update", 0x00, 0x7F, 0x7F); Online::RequestManager::get()->update(dt); PROFILER_POP_CPU_MARKER(); PROFILER_SYNC_FRAME(); } else if (!m_abort && ProfileWorld::isNoGraphics()) { PROFILER_PUSH_CPU_MARKER("Protocol manager update", 0x7F, 0x00, 0x7F); ProtocolManager::getInstance()->update(); PROFILER_POP_CPU_MARKER(); PROFILER_PUSH_CPU_MARKER("Database polling update", 0x00, 0x7F, 0x7F); Online::RequestManager::get()->update(dt); PROFILER_POP_CPU_MARKER(); } PROFILER_SYNC_FRAME(); PROFILER_POP_CPU_MARKER(); } // while !m_exit } // run