Esempio n. 1
0
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;
}
Esempio n. 2
0
    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();
    }
Esempio n. 3
0
    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();
    }