MenuState::MenuState(StateStack& stateStack, Context context, States::ID id) : State(stateStack, context, id), m_play_button(context.textures->getTexture(Textures::Button), context.fonts->getFont(Fonts::Main)), m_exit_button(context.textures->getTexture(Textures::Button), context.fonts->getFont(Fonts::Main)), m_background(*context.textures->getTexture(Textures::Titlescreen)), m_background_move(true), m_button_fade(false) { // Play button m_play_button.setAction([this] () { requestStackPop(); requestStackPush(States::Game); }); m_play_button.setText("Play"); m_play_button.setPosition(1280/2, 720/2 + 40); // Exit button m_exit_button.setAction([this] () { requestStackClear(); }); m_exit_button.setText("Exit"); m_exit_button.setPosition(1280/2, 720/2 + 80); // Background thing m_background.setPosition(640 - m_background.getLocalBounds().width/2, 360 - m_background.getLocalBounds().height/2); context.mouse->setState(gui::Mouse::Neutral); }
//private void MenuHighScoreState::buildMenu(const sf::Font& font) { const float centreX = xy::DefaultSceneSize.x / 2.f; const auto& scores = getContext().appInstance.getScores(); auto list = xy::UI::create<xy::UI::ScoreList>(font); list->setAlignment(xy::UI::Alignment::Centre); list->setPosition(centreX, 590.f); list->setList(scores); list->setIndex(getContext().appInstance.getLastScoreIndex()); m_uiContainer.addControl(list); auto upScroll = xy::UI::create<xy::UI::Button>(font, m_textureResource.get("assets/images/ui/scroll_arrow_vertical.png")); upScroll->setAlignment(xy::UI::Alignment::Centre); upScroll->setPosition(1310, 470.f); upScroll->addCallback([list]() { list->scroll(list->getVerticalSpacing()); }); m_uiContainer.addControl(upScroll); auto downScroll = xy::UI::create<xy::UI::Button>(font, m_textureResource.get("assets/images/ui/scroll_arrow_vertical.png")); downScroll->setAlignment(xy::UI::Alignment::Centre); downScroll->setRotation(180.f); downScroll->setPosition(1310.f, 720.f); downScroll->addCallback([list]() { list->scroll(-list->getVerticalSpacing()); }); m_uiContainer.addControl(downScroll); auto button = xy::UI::create<xy::UI::Button>(font, m_textureResource.get("assets/images/ui/start_button.png")); button->setString("OK"); button->setAlignment(xy::UI::Alignment::Centre); button->setPosition(centreX, 875.f); button->addCallback([this]() { auto msg = m_messageBus.post<xy::Message::UIEvent>(xy::Message::UIMessage); msg->type = xy::Message::UIEvent::MenuClosed; msg->value = 0.f; msg->stateID = (m_endGame) ? States::ID::HighScoresEnd : States::ID::HighScoresMenu; if (m_endGame) { requestStackClear(); requestStackPush(States::ID::MenuBackground); } else { requestStackPop(); requestStackPush(States::ID::MenuMain); } }); m_uiContainer.addControl(button); }
bool GameFinishedState::handleEvent(const sf::Event &event) { if (event.type != sf::Event::KeyPressed) { return false; } requestStackClear(); return false; }
bool GameOverState::update(sf::Time dt){ mElapsedTime += dt; if (mElapsedTime > sf::seconds(3)){ requestStackClear(); requestStackPush(States::Menu); } return false; }
void MyFirstState::createScene() { //add the systems auto& messageBus = getContext().appInstance.getMessageBus(); m_scene.addSystem<xy::TextSystem>(messageBus); m_scene.addSystem<xy::UISystem>(messageBus); m_scene.addSystem<xy::RenderSystem>(messageBus); m_font.loadFromFile("ProggyClean.ttf"); auto entity = m_scene.createEntity(); entity.addComponent<xy::Transform>().setPosition(200.f, 200.f); entity.addComponent<xy::Text>(m_font).setString("xygine tutorial"); entity.getComponent<xy::Text>().setCharacterSize(60); entity.addComponent<xy::Drawable>(); entity = m_scene.createEntity(); entity.addComponent<xy::Transform>().setPosition(200.f, 300.f); entity.addComponent<xy::Text>(m_font).setString("Play"); entity.getComponent<xy::Text>().setCharacterSize(40); entity.addComponent<xy::Drawable>(); entity.addComponent<xy::UIHitBox>().area = xy::Text::getLocalBounds(entity); auto callbackID = m_scene.getSystem<xy::UISystem>().addMouseButtonCallback( [&](xy::Entity, sf::Uint64 flags) { if(flags & xy::UISystem::LeftMouse) { requestStackClear(); requestStackPush(States::GameState); } }); entity.getComponent<xy::UIHitBox>().callbacks[xy::UIHitBox::MouseUp] = callbackID; entity = m_scene.createEntity(); entity.addComponent<xy::Transform>().setPosition(200.f, 360.f); entity.addComponent<xy::Text>(m_font).setString("Quit"); entity.getComponent<xy::Text>().setCharacterSize(40); entity.addComponent<xy::Drawable>(); entity.addComponent<xy::UIHitBox>().area = xy::Text::getLocalBounds(entity); callbackID = m_scene.getSystem<xy::UISystem>().addMouseButtonCallback( [&](xy::Entity, sf::Uint64 flags) { if(flags & xy::UISystem::LeftMouse) { getContext().appInstance.quit(); } }); entity.getComponent<xy::UIHitBox>().callbacks[xy::UIHitBox::MouseUp] = callbackID; }
//private void MenuPauseState::buildMenu(const sf::Font& font) { const float centreX = xy::DefaultSceneSize.x / 2.f; auto label = xy::UI::create<xy::UI::Label>(font); label->setAlignment(xy::UI::Alignment::Centre); label->setPosition(centreX, 300.f); label->setString("PAUSED"); m_uiContainer.addControl(label); auto button = xy::UI::create<xy::UI::Button>(font, m_textureResource.get("assets/images/ui/start_button.png")); button->setString("Continue"); button->setAlignment(xy::UI::Alignment::Centre); button->setPosition(centreX, 425.f); button->addCallback([this]() { close(); }); m_uiContainer.addControl(button); button = xy::UI::create<xy::UI::Button>(font, m_textureResource.get("assets/images/ui/start_button.png")); button->setString("Options"); button->setAlignment(xy::UI::Alignment::Centre); button->setPosition(centreX, 525.f); button->addCallback([this]() { close(); requestStackPush(States::ID::PausedOptions); }); m_uiContainer.addControl(button); button = xy::UI::create<xy::UI::Button>(font, m_textureResource.get("assets/images/ui/start_button.png")); button->setString("Quit to Main"); button->setAlignment(xy::UI::Alignment::Centre); button->setPosition(centreX, 625.f); button->addCallback([this]() { close(); requestStackClear(); requestStackPush(States::ID::MenuBackground); }); m_uiContainer.addControl(button); button = xy::UI::create<xy::UI::Button>(font, m_textureResource.get("assets/images/ui/start_button.png")); button->setString("Exit to Desktop"); button->setAlignment(xy::UI::Alignment::Centre); button->setPosition(centreX, 725.f); button->addCallback([this]() { xy::App::quit(); }); m_uiContainer.addControl(button); }
bool MenuState::handleEvents(const sf::Event& event) { if (!m_background_move && !m_button_fade) { m_play_button.handleEvent(event); m_exit_button.handleEvent(event); } if (event.KeyPressed) { if (event.key.code == sf::Keyboard::Escape) requestStackClear(); } return false; }
MainMenu::MainMenu( StateStack& stack, Context context ) : State( stack, context ) , m_container() { std::cout << "MainMenu State Entered..." << std::endl; getContext().fonts -> loadResource( Font::Arcade, "Resources/Fonts/arcade.ttf" ); auto play = std::make_shared< GUI::Button >( getContext() ); play -> setPosition( getContext().window -> getView().getSize() / 2.0f ); play -> setText( "Play" ); play -> setCharacterSize( 40 ); play -> setCallback( [ this ] () { requestStackPop(); requestStackPush( States::Game ); }); auto options = std::make_shared< GUI::Button >( getContext() ); options -> setPosition( play -> getPosition().x, play -> getPosition().y + play -> getCharacterSize() ); options -> setText( "Options" ); options -> setCharacterSize( 40 ); auto credits = std::make_shared< GUI::Button >( getContext() ); credits -> setPosition( options -> getPosition().x, options -> getPosition().y + options -> getCharacterSize() ); credits -> setText( "Credits" ); credits -> setCharacterSize( 40 ); auto exit = std::make_shared< GUI::Button >( getContext() ); exit -> setPosition( credits -> getPosition().x, credits -> getPosition().y + credits -> getCharacterSize() ); exit -> setText( "Exit" ); exit -> setCharacterSize( 40 ); exit -> setCallback( [ this ] () { requestStackClear(); getContext().window -> close(); }); m_container.pack( play ); m_container.pack( options ); m_container.pack( credits ); m_container.pack( exit ); }
bool PauseState::handleEvent(const sf::Event& event) { if (event.type != sf::Event::KeyPressed) return false; if (event.key.code == sf::Keyboard::Escape) { // Escape pressed, remove itself to return to the game requestStackPop(); } if (event.key.code == sf::Keyboard::BackSpace) { // Escape pressed, remove itself to return to the game requestStackClear(); requestStackPush(States::Menu); } return false; }
bool PauseState::handleEvent(const sf::Event& event) { if (event.type != sf::Event::KeyPressed) //sinon, il faut rester appuyé constament return false; if(event.key.code == sf::Keyboard::Escape) { //Escape is pressed, go back to previous state(game) requestStackPop(); } if(event.key.code == sf::Keyboard::BackSpace) { //Escape pressed, clear all the things, return to menu requestStackClear(); requestStackPush(States::Menu); } return false; }
bool TitleState::processEvent(const cpp3ds::Event& event) { // If any key is pressed, trigger the next screen if (event.type == cpp3ds::Event::KeyPressed) { if (event.key.code == cpp3ds::Keyboard::Select) { requestStackClear(); return true; } if (cpp3ds::Service::isEnabled(cpp3ds::NETWORK)) { requestStackPop(); requestStackPush(States::ServerSelect); } else { getContext().transition.message = _("No internet connection.\nConnect to internet and retry."); requestStackPush(States::TransitionMessage); } } return true; }
bool PauseState::handleEvent(const sf::Event &event) { //CommandQueue& commands = mWorld.getCommandQueue(); // If ESC key is pressed, we leave if (event.type == sf::Event::KeyReleased) { switch(event.key.code) { case sf::Keyboard::Escape: requestStackPop(); break; case sf::Keyboard::Q: requestStackClear(); break; default:break; } } return false; }
void SyncState::sync() { m_timer.restart(); // Set up directory structure, if necessary std::string tmpPath = cpp3ds::FileSystem::getFilePath("sdmc:/3ds/BrewMan/tmp"); std::string cachePath = cpp3ds::FileSystem::getFilePath("sdmc:/3ds/BrewMan/cache"); std::string installedPath = cpp3ds::FileSystem::getFilePath("sdmc:/3ds/BrewMan/installed"); if (pathExists(tmpPath.c_str(), false)) removeDirectory(tmpPath.c_str()); mkdir(tmpPath.c_str(), 0777); if (!pathExists(cachePath.c_str(), false)) mkdir(cachePath.c_str(), 0777); if (!pathExists(installedPath.c_str(), false)) mkdir(installedPath.c_str(), 0777); // If auto-dated, boot into newest BrewMan if (autoUpdate()) { char buf[256]; size_t len; FILE *src = fopen("sdmc:/3ds/BrewMan/tmp/update.3dsx", "rb"); FILE *dst = fopen("sdmc:/3ds/BrewMan/tmp/update-copy.3dsx", "wb"); while ((len = fread(buf, 1, sizeof(buf), src)) > 0) fwrite(buf, 1, sizeof(buf), dst); fclose(src); fclose(dst); bootApp("/3ds/BrewMan/tmp/update.3dsx", ""); requestStackClear(); return; } git_repository *repo = NULL; const char *repoUrl = "git://github.com/Repo3DS/ideal-enigma.git"; const std::string path = cpp3ds::FileSystem::getFilePath(REPO_DIR); git_clone_options opts = GIT_CLONE_OPTIONS_INIT; setStatus("Fetching git repo..."); int error = git_clone(&repo, repoUrl, path.c_str(), NULL); if (error < 0) { if (error == GIT_EEXISTS) { error = git_repository_open(&repo, path.c_str()); if (error == 0) { git_remote *remote; error = git_remote_lookup(&remote, repo, "origin"); if (error == 0) { error = git_remote_fetch(remote, NULL, NULL, "pull"); if (error == 0) { git_annotated_commit *our_head, *their_heads[1]; if (git_repository_fetchhead_foreach(repo, find_master, NULL) == 0) { git_annotated_commit_from_fetchhead(&their_heads[0], repo, "master", repoUrl, &m_git_oid); git_merge_analysis_t analysis; git_merge_preference_t prefs; git_merge_analysis(&analysis, &prefs, repo, (const git_annotated_commit**)their_heads, 1); if (analysis & GIT_MERGE_ANALYSIS_UP_TO_DATE) printf("up to date\n"); else if (analysis & GIT_MERGE_ANALYSIS_FASTFORWARD) { printf("fast-forwarding\n"); // if (git_merge(repo, (const git_annotated_commit **)their_heads, 1, NULL, NULL) == 0) { git_reference *ref; git_reference *newref; if (git_reference_lookup(&ref, repo, "refs/heads/master") == 0) git_reference_set_target(&newref, ref, &m_git_oid, "BrewMan pull: Fast-forward"); git_reset_from_annotated(repo, their_heads[0], GIT_RESET_HARD, NULL); git_reference_free(ref); git_repository_state_cleanup(repo); } git_annotated_commit_free(their_heads[0]); } } } } git_repository_free(repo); const git_error *e = giterr_last(); if (e) { setStatus(_("Error %d/%d\n%s\nCloning repo again...", error, e->klass, e->message)); if (!removeDirectory(path.c_str())) { cpp3ds::sleep(cpp3ds::seconds(2.f)); sync(); } else { setStatus("Repo failure. Please report this error.\nAnd delete /3ds/BrewMan/repo/ and try again."); } return; } } const git_error *e = giterr_last(); if (e) { setStatus(_("Error %d/%d: %s", error, e->klass, e->message)); return; } } setStatus("Everything up-to-date!"); // Give the Title animation time to finish if necessary while (m_timer.getElapsedTime() < cpp3ds::seconds(5.f)) cpp3ds::sleep(cpp3ds::milliseconds(50)); requestStackClear(); requestStackPush(States::Browse); }
//private void MenuWeaponState::buildMenu(const sf::Font& font) { const float centreX = xy::DefaultSceneSize.x / 2.f; auto label = xy::UI::create<xy::UI::Label>(font); label->setString("Select Secondary Weapon"); label->setAlignment(xy::UI::Alignment::Centre); label->setPosition(centreX, 86.f); label->setCharacterSize(40u); m_uiContainer.addControl(label); label = xy::UI::create<xy::UI::Label>(font); label->setString("Rank " + std::to_string(m_profile.getRank()) + ": " +std::to_string(m_profile.getXP()) + "XP"); label->setAlignment(xy::UI::Alignment::Centre); label->setPosition(centreX, 160.f); m_uiContainer.addControl(label); //weapon selector auto weaponSelect = xy::UI::create<lm::ui::WeaponSelect>(m_textureResource.get("assets/images/ui/weapon_select.png")); weaponSelect->setAlignment(xy::UI::Alignment::Centre); weaponSelect->setPosition(centreX, 420.f); sf::Int32 count = AchievementID::Rank50 - AchievementID::Rank10; sf::Uint8 flags = 0xff; for (auto i = 0; i < count; ++i) { if (m_profile.hasAchievement(static_cast<AchievementID>(AchievementID::Rank10 + i))) { flags &= ~(1 << i); } } weaponSelect->setLockedFlags(flags); m_uiContainer.addControl(weaponSelect); auto button = xy::UI::create<xy::UI::Button>(font, m_textureResource.get("assets/images/ui/start_button.png")); button->setString("Back"); button->setAlignment(xy::UI::Alignment::Centre); button->setPosition(600.f, 975.f); button->addCallback([this]() { auto msg = m_messageBus.post<xy::Message::UIEvent>(xy::Message::UIMessage); msg->type = xy::Message::UIEvent::MenuClosed; msg->value = 0.f; msg->stateID = States::ID::MenuWeapon; requestStackPop(); requestStackPush(States::ID::MenuMain); }); m_uiContainer.addControl(button); button = xy::UI::create<xy::UI::Button>(font, m_textureResource.get("assets/images/ui/start_button.png")); button->setString("Begin!"); button->setAlignment(xy::UI::Alignment::Centre); button->setPosition(1320.f, 975.f); button->addCallback([this, weaponSelect, flags]() { //set the currently selected weapon lm::SpecialWeapon weapon = lm::SpecialWeapon::None; auto idx = weaponSelect->getSelectedIndex(); if ((flags & (1 << idx)) == 0) { weapon = static_cast<lm::SpecialWeapon>(idx + 1); } m_profile.setSpecialWeapon(weapon); //and raise message to say we're done auto msg = m_messageBus.post<xy::Message::UIEvent>(xy::Message::UIMessage); msg->type = xy::Message::UIEvent::MenuClosed; msg->value = 0.f; msg->stateID = States::ID::MenuWeapon; requestStackClear(); requestStackPush(States::ID::SinglePlayer); }); m_uiContainer.addControl(button); }