int main(int /*argc*/, char */*argv*/[]) { Util::init(); Util::UI::Window::Properties properties; properties.positioned = true; properties.posX = 100; properties.posY = 100; properties.clientAreaWidth = 1024; properties.clientAreaHeight = 768; properties.title = "GUI Textfield and Buttons"; properties.compatibilityProfile = true; auto window = Util::UI::createWindow(properties); Util::UI::EventContext eventContext; eventContext.getEventQueue().registerEventGenerator(std::bind(&Util::UI::Window::fetchEvents, window.get())); GUI::GUI_Manager guiManager(&eventContext); guiManager.setWindow(window.get()); Util::Reference<GUI::Window> guiWin = guiManager.createWindow(Geometry::Rect_f(10, 10, 200, 200), "Window"); Util::Reference<GUI::Textfield> guiText = guiManager.createTextfield("Text"); guiText->setRect(Geometry::Rect_f(0, 0, 40, 20)); guiWin->addContent(guiText.get()); Util::Reference<GUI::Button> guiButton = guiManager.createButton("Clear"); guiButton->setActionListener( [&guiText](GUI::Component *, const Util::StringIdentifier &) { guiText->setText(""); return true; }); guiButton->setRect(Geometry::Rect_f(0, 25, 40, 20)); guiWin->addContent(guiButton.get()); bool done = false; while(!done) { eventContext.getEventQueue().process(); while(eventContext.getEventQueue().getNumEventsAvailable() > 0) { auto event = eventContext.getEventQueue().popEvent(); if(event.type == Util::UI::EVENT_QUIT || (event.type == Util::UI::EVENT_KEYBOARD && event.keyboard.pressed && event.keyboard.key == Util::UI::KEY_ESCAPE)) { done = true; } else { guiManager.handleEvent(event); } } guiManager.display(); window->swapBuffers(); } return EXIT_SUCCESS; }
void EngineMain::runGameLoop(const bpo::variables_map& variables, const std::string& pathEXE) { FALevelGen::FAsrand(time(NULL)); FAWorld::Player* player; FARender::Renderer& renderer = *FARender::Renderer::get(); Engine::ThreadManager& threadManager = *Engine::ThreadManager::get(); std::string characterClass = variables["character"].as<std::string>(); DiabloExe::DiabloExe exe(pathEXE); if (!exe.isLoaded()) { renderer.stop(); return; } FAWorld::ItemManager& itemManager = FAWorld::ItemManager::get(); FAWorld::World world(exe); FAWorld::PlayerFactory playerFactory(exe); itemManager.loadItems(&exe); player = playerFactory.create(characterClass); world.addCurrentPlayer(player); world.generateLevels(); int32_t currentLevel = variables["level"].as<int32_t>(); FAGui::GuiManager guiManager(player->mInventory, *this, characterClass); // -1 represents the main menu if(currentLevel != -1) { world.setLevel(currentLevel); Level::Level& level = *world.getCurrentLevel(); player->mPos = FAWorld::Position(level.upStairsPos().first, level.upStairsPos().second); guiManager.showIngameGui(); } else { pause(); guiManager.showMainMenu(); threadManager.playMusic("music/dintro.wav"); } auto last = std::chrono::system_clock::now(); bool isServer = variables["mode"].as<std::string>() == "server"; NetManager netManager(isServer); // Main game logic loop while(!mDone) { auto now = std::chrono::system_clock::now(); while(std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch() - last.time_since_epoch()).count() < (int64_t)(1000/FAWorld::World::ticksPerSecond)) { std::this_thread::yield(); now = std::chrono::system_clock::now(); } last = now; mInputManager->update(mPaused); if(!mPaused) world.update(mNoclip); netManager.update(); guiManager.updateGui(); Level::Level* level = world.getCurrentLevel(); FARender::RenderState* state = renderer.getFreeState(); if(state) { state->mPos = player->mPos; if(level != NULL) state->tileset = renderer.getTileset(*level); state->level = level; if(!FAGui::cursorPath.empty()) state->mCursorEmpty = false; else state->mCursorEmpty = true; state->mCursorFrame = FAGui::cursorFrame; state->mCursorSpriteGroup = renderer.loadImage("data/inv/objcurs.cel"); world.fillRenderState(state); Render::updateGuiBuffer(&state->guiDrawBuffer); } else { Render::updateGuiBuffer(NULL); } renderer.setCurrentState(state); } renderer.stop(); renderer.waitUntilDone(); }
void EngineMain::runGameLoop(const bpo::variables_map& variables, const std::string& pathEXE) { FALevelGen::FAsrand(static_cast<int> (time(nullptr))); FAWorld::Player* player; FARender::Renderer& renderer = *FARender::Renderer::get(); Settings::Settings settings; if(!settings.loadUserSettings()) return; std::string characterClass = variables["character"].as<std::string>(); DiabloExe::DiabloExe exe(pathEXE); if (!exe.isLoaded()) { renderer.stop(); return; } FAWorld::ItemManager& itemManager = FAWorld::ItemManager::get(); FAWorld::World world(exe); FAWorld::PlayerFactory playerFactory(exe); bool isServer = variables["mode"].as<std::string>() == "server"; if(isServer) world.generateLevels(); itemManager.loadItems(&exe); player = playerFactory.create(characterClass); world.addCurrentPlayer(player); if (variables["invuln"].as<std::string>() == "on") player->setInvuln(true); mInputManager->registerKeyboardObserver(&world); mInputManager->registerMouseObserver(&world); int32_t currentLevel = variables["level"].as<int32_t>(); FAGui::GuiManager guiManager(*this, *player); world.setGuiManager (&guiManager); if (currentLevel == -1) currentLevel = 0; bool clientWaitingForLevel = false; // -1 represents the main menu if(currentLevel != -1 && isServer) world.setLevel(currentLevel); else clientWaitingForLevel = true; boost::asio::io_service io; NetManager netManager(isServer, playerFactory); // Main game logic loop while(!mDone) { boost::asio::deadline_timer timer(io, boost::posix_time::milliseconds(1000/FAWorld::World::ticksPerSecond)); if (clientWaitingForLevel) { clientWaitingForLevel = world.getCurrentLevel() != nullptr; } mInputManager->update(mPaused); if(!mPaused && !clientWaitingForLevel) { world.update(mNoclip); } nk_context* ctx = renderer.getNuklearContext(); netManager.update(); guiManager.update(mPaused, ctx); FAWorld::GameLevel* level = world.getCurrentLevel(); FARender::RenderState* state = renderer.getFreeState(); if(state) { state->mPos = player->getPos(); if(level != NULL) state->tileset = renderer.getTileset(*level); state->level = level; if(!FAGui::cursorPath.empty()) state->mCursorEmpty = false; else state->mCursorEmpty = true; state->mCursorFrame = FAGui::cursorFrame; state->mCursorSpriteGroup = renderer.loadImage("data/inv/objcurs.cel"); state->mCursorHotspot = FAGui::cursorHotspot; world.fillRenderState(state); state->nuklearData.fill(ctx); } std::vector<uint32_t> spritesToPreload; if (renderer.getAndClearSpritesNeedingPreloading(spritesToPreload)) ThreadManager::get()->sendSpritesForPreload(spritesToPreload); nk_clear(ctx); renderer.setCurrentState(state); auto remainingTickTime = timer.expires_from_now().total_milliseconds(); if(remainingTickTime < 0) std::cerr << "tick time exceeded by " << -remainingTickTime << "ms" << std::endl; timer.wait(); } renderer.stop(); renderer.waitUntilDone(); }