package fr.wisper.screens.gamescreen; import aurelienribon.tweenengine.BaseTween; import aurelienribon.tweenengine.Tween; import aurelienribon.tweenengine.TweenCallback; import aurelienribon.tweenengine.TweenManager; import com.badlogic.gdx.*; import com.badlogic.gdx.assets.AssetManager; import com.badlogic.gdx.files.FileHandle; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.g2d.Sprite; import com.badlogic.gdx.graphics.g2d.SpriteBatch; import com.badlogic.gdx.graphics.g2d.TextureAtlas; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.ui.*; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.utils.Scaling; import com.badlogic.gdx.utils.viewport.ScalingViewport; import fr.wisper.Game.WisperGame; import fr.wisper.assets.SettingsAssets; import fr.wisper.animations.tween.SpriteAccessor; import fr.wisper.animations.tween.TableAccessor; import fr.wisper.screens.loading.LoadingScreen; import fr.wisper.utils.Config; import fr.wisper.utils.Debug; import fr.wisper.utils.ExtendedStage; public class SettingsMenu implements FadingScreen { public static final String SAVE_FOLDER = "save-folder"; public static final String V_SYNC = "v-sync"; // Background image private Sprite splash; private SpriteBatch batch; private TweenManager tweenManager; // Stage private ExtendedStage<SettingsMenu> stage; private Table table; private Skin skin; public static FileHandle levelDirectory() { String prefsDir = WisperGame.preferences.getString(SAVE_FOLDER, Config.DEFAULT_SAVE_FOLDER).trim(); return Gdx.files.absolute(prefsDir); } public static boolean vSync() { return WisperGame.preferences.getBoolean(V_SYNC, true); } @Override public void render(float delta) { Gdx.gl.glClearColor(0.95f, 0.95f, 0.95f, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); // Manage camera WisperGame.Camera.update(); batch.setProjectionMatrix(WisperGame.Camera.combined); // Display background image batch.begin(); splash.draw(batch); batch.end(); // Display menu stage.draw(); stage.act(delta); // Update animations tweenManager.update(delta); } @Override public void resize(int width, int height) { WisperGame.Camera.zoom = 1f; WisperGame.Camera.updateViewport(); ScalingViewport stageViewport = new ScalingViewport( Scaling.fit, WisperGame.VirtualViewport.getVirtualWidth(), WisperGame.VirtualViewport.getVirtualHeight(), WisperGame.Camera); stage.setViewport(stageViewport); stage.getViewport().update(width, height, true); table.invalidateHierarchy(); } @Override public void show() { // Stage skin = SettingsAssets.manager.get(SettingsAssets.GlobalSkin); stage = new ExtendedStage(this, new MainMenu()); table = new Table(skin); table.setFillParent(true); Gdx.input.setInputProcessor(stage); Gdx.input.setCatchBackKey(true); final CheckBox vSyncCheckBox = new CheckBox("", skin); vSyncCheckBox.setChecked(vSync()); final TextField saveFolderInput = new TextField(levelDirectory().path(), skin); saveFolderInput.setMessageText("Saves folder"); final TextButton backButton = new TextButton("Save configuration", skin, "medium"); backButton.pad(10); // Background image batch = new SpriteBatch(); splash = new Sprite(SettingsAssets.manager.get(SettingsAssets.SettingsSplash)); splash.setSize(Config.APP_WIDTH, Config.APP_HEIGHT); // Listener manageListener(vSyncCheckBox, saveFolderInput, backButton); // Table createTable(vSyncCheckBox, saveFolderInput, backButton); stage.addActor(table); // Animations initAnimations(); } private void initAnimations() { tweenManager = new TweenManager(); Tween.registerAccessor(Sprite.class, new SpriteAccessor()); Tween.registerAccessor(Table.class, new TableAccessor()); Tween.set(splash, SpriteAccessor.ALPHA).target(0).start(tweenManager); Tween.set(table, TableAccessor.ALPHA).target(0).start(tweenManager); Tween.to(splash, SpriteAccessor.ALPHA, Config.ANIMATION_DURATION).target(1).start(tweenManager); Tween.to(table, TableAccessor.ALPHA, Config.ANIMATION_DURATION).target(1).start(tweenManager); tweenManager.update(Float.MIN_VALUE); } private void manageListener(final CheckBox vSyncCheckBox, final TextField saveFolderInput, final TextButton backButton) { ClickListener buttonHandler = new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { if(event.getListenerActor() == vSyncCheckBox) { WisperGame.preferences.putBoolean(V_SYNC, vSyncCheckBox.isChecked()); WisperGame.preferences.flush(); Debug.Log("[Settings] vSync " + (vSync() ? "enabled" : "disabled")); } else if(event.getListenerActor() == backButton) { String actualLevelDirectory; if (saveFolderInput.getText().trim().isEmpty()) { actualLevelDirectory = Gdx.files.getExternalStoragePath() + Config.DEFAULT_SAVE_FOLDER; } else { actualLevelDirectory = saveFolderInput.getText().trim(); } WisperGame.preferences.putString(SAVE_FOLDER, actualLevelDirectory); WisperGame.preferences.flush(); Debug.Log("[Settings] Saved"); fadeTo(new MainMenu()); } } }; vSyncCheckBox.addListener(buttonHandler); backButton.addListener(buttonHandler); } public void fadeTo(final FadingScreen screen) { Tween.set(splash, SpriteAccessor.ALPHA).target(1).start(tweenManager); Tween.set(table, TableAccessor.ALPHA).target(1).start(tweenManager); Tween.to(splash, SpriteAccessor.ALPHA, Config.ANIMATION_DURATION / 3f).target(0).start(tweenManager); Tween.to(table, TableAccessor.ALPHA, Config.ANIMATION_DURATION / 3f).target(0).setCallback(new TweenCallback() { @Override public void onEvent(int type, BaseTween<?> source) { LoadingScreen loader = ((WisperGame) Gdx.app.getApplicationListener()).getLoader(); loader.setNextScreen(screen); } }).start(tweenManager); } @Override public AssetManager getAssetManager() { return SettingsAssets.manager; } @Override public void load() { SettingsAssets.load(); } private void createTable(CheckBox vSyncCheckBox, TextField saveFolderInput, TextButton backButton) { table.padTop(100); table.add(new Label("Preferences", skin, "big-bold")).spaceBottom(125).colspan(2).expandX().row(); table.add(new Label("Vertical Synchronization", skin, "medium-bold")).expandX(); table.add(vSyncCheckBox).left().expandX(); table.row(); table.add(new Label("Saves folder", skin, "medium-bold")).expandX().top(); table.add(saveFolderInput).top().left().fillX().row(); table.row(); table.add(backButton).colspan(2).bottom().spaceBottom(125).expandY(); } @Override public void hide() { dispose(); } @Override public void pause() { } @Override public void resume() { } @Override public void dispose() { batch.dispose(); skin.dispose(); stage.dispose(); SettingsAssets.dispose(); } }