package com.fteams.siftrain.screens; import com.badlogic.gdx.Game; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Input; import com.badlogic.gdx.InputMultiplexer; import com.badlogic.gdx.InputProcessor; import com.badlogic.gdx.Screen; import com.badlogic.gdx.graphics.GL20; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.scenes.scene2d.ui.ButtonGroup; import com.badlogic.gdx.scenes.scene2d.ui.CheckBox; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.Label; import com.badlogic.gdx.scenes.scene2d.ui.Slider; import com.badlogic.gdx.scenes.scene2d.ui.Stack; import com.badlogic.gdx.scenes.scene2d.ui.Table; import com.badlogic.gdx.scenes.scene2d.ui.TextButton; import com.badlogic.gdx.scenes.scene2d.utils.ChangeListener; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.fteams.siftrain.assets.Assets; import com.fteams.siftrain.assets.GlobalConfiguration; import com.fteams.siftrain.util.SongUtils; @SuppressWarnings("unchecked") public class SettingsScreen extends ChangeListener implements Screen, InputProcessor { private Texture texture = Assets.mainMenuBackgroundTexture; private Image splashImage = new Image(texture); private Stage stage = new Stage(); private Label titleLabel = new Label("Settings/設定", Assets.menuSkin, "settings_title"); private Label songVolumeLabel = new Label("Song Volume", Assets.menuSkin, "song_style_result"); private Label feedbackVolumeLabel = new Label("Touch Feedback Volume", Assets.menuSkin, "song_style_result"); private Label offsetLabel = new Label("Global offset", Assets.menuSkin, "song_style_result"); private Label inputOffsetLabel = new Label("Input offset", Assets.menuSkin, "song_style_result"); private Label noteSpeedLabel = new Label("Note Speed (Approach Rate)", Assets.menuSkin, "song_style_result"); private Label overallDifficultyLabel = new Label("Timing Window (Overall Difficulty)", Assets.menuSkin, "song_style_result"); private Label pathToBeatmaps = new Label("Path to Beatmaps", Assets.menuSkin, "song_style_result"); private TextButton volumeSettingsTabButton = new TextButton("Volume Settings", Assets.menuSkin, "item1"); private TextButton offsetSettingsTabButton = new TextButton("Timing Settings", Assets.menuSkin, "item1"); private TextButton otherSettingsTabButton = new TextButton("Other", Assets.menuSkin, "item1"); private Table tabbedPane = new Table(); private Stack content = new Stack(); private Label songVolumeValueLabel; private Label feedbackVolumeValueLabel; private CheckBox offsetValueLabel; private CheckBox inputOffsetValueLabel; private Label noteSpeedValueLabel; private Label overallDifficultyValueLabel; private Slider songVolumeSlider; private Slider feedbackVolumeSlider; private Slider offsetSlider; private Slider inputOffsetSlider; private Slider noteSpeedSlider; private Slider overallDifficultySlider; private CheckBox playHintSoundCheckbox; private CheckBox syncModeCheckbox; private CheckBox sortingModeChooser; private CheckBox randomModeChooser; private CheckBox sortingOrderChooser; private String[] sortingModes = {"File Name", "Song Name"}; private String[] sortingOrders = {"Ascending", "Descending"}; private final static boolean DEBUG = false; private Label pathValueLabel = new Label(GlobalConfiguration.pathToBeatmaps, Assets.menuSkin, "song_style_result"); private TextButton returnButton = new TextButton("Save and Return", Assets.menuSkin, "item1"); private TextButton reloadBeatmaps = new TextButton("Reload Beatmaps!", Assets.menuSkin, "item1"); private Integer newVolume; private Integer newFeedbackVolume; private Integer newGlobalOffset; private Integer newInputOffset; private Boolean newHitSoundsSetting; private Integer newSortingMode; private Integer newRandomMode; private Integer newSortingOrder; private Integer newSyncMode; private Integer newNoteSpeed; private Integer newOverallDifficulty; @Override public void show() { float fontScale = stage.getHeight() / GlobalConfiguration.BASE_HEIGHT; splashImage.setSize(stage.getWidth(), stage.getHeight()); stage.addActor(splashImage); volumeSettingsTabButton.getLabel().setFontScale(fontScale * 0.7f); offsetSettingsTabButton.getLabel().setFontScale(fontScale * 0.7f); otherSettingsTabButton.getLabel().setFontScale(fontScale * 0.7f); returnButton.getLabel().setFontScale(fontScale * 0.7f); reloadBeatmaps.getLabel().setFontScale(fontScale * 0.7f); newVolume = GlobalConfiguration.songVolume; newFeedbackVolume = GlobalConfiguration.feedbackVolume; newGlobalOffset = GlobalConfiguration.offset; newInputOffset = GlobalConfiguration.inputOffset; newNoteSpeed = GlobalConfiguration.noteSpeed; newOverallDifficulty = GlobalConfiguration.overallDifficulty; newHitSoundsSetting = GlobalConfiguration.playHintSounds; newSortingMode = GlobalConfiguration.sortMode; newSortingOrder = GlobalConfiguration.sortOrder; newRandomMode = GlobalConfiguration.randomMode; newSyncMode = GlobalConfiguration.syncMode; ButtonGroup<TextButton> buttonGroup = new ButtonGroup<>(); buttonGroup.add(volumeSettingsTabButton); buttonGroup.add(offsetSettingsTabButton); buttonGroup.add(otherSettingsTabButton); buttonGroup.setMaxCheckCount(1); buttonGroup.setMinCheckCount(1); buttonGroup.setUncheckLast(true); volumeSettingsTabButton.setChecked(true); // settings title titleLabel.setFontScale(fontScale * 0.6f); tabbedPane.add(titleLabel).padBottom(stage.getHeight() * 0.05f).colspan(2).fillX().row(); /* buttons info: width: 0.3 spawn between 0.1 and 0.4 */ // settings buttons tabbedPane.setDebug(DEBUG); tabbedPane.add(volumeSettingsTabButton).padTop(stage.getHeight() * 0.005f).padBottom(stage.getHeight() * 0.005f).width(stage.getWidth() * 0.25f).height(stage.getHeight() * 0.14f); tabbedPane.add().width(stage.getWidth() * 0.1f).row(); tabbedPane.add(offsetSettingsTabButton).padTop(stage.getHeight() * 0.005f).padBottom(stage.getHeight() * 0.005f).width(stage.getWidth() * 0.25f).height(stage.getHeight() * 0.14f); tabbedPane.add().width(stage.getWidth() * 0.1f).row(); tabbedPane.add(otherSettingsTabButton).padTop(stage.getHeight() * 0.005f).padBottom(stage.getHeight() * 0.005f).width(stage.getWidth() * 0.25f).height(stage.getHeight() * 0.14f); tabbedPane.add().width(stage.getWidth() * 0.1f).row(); tabbedPane.setX(stage.getWidth() * 0.225f); tabbedPane.setY(stage.getHeight() / 2); tabbedPane.add(returnButton).padTop(stage.getHeight() * 0.005f).padBottom(stage.getHeight() * 0.005f).width(stage.getWidth() * 0.25f).height(stage.getHeight() * 0.14f); tabbedPane.add().width(stage.getWidth() * 0.1f).row(); // volume block songVolumeLabel.setFontScale(fontScale); songVolumeValueLabel = new Label(Integer.toString(GlobalConfiguration.songVolume), Assets.menuSkin, "song_style_result"); songVolumeValueLabel.setFontScale(fontScale); songVolumeSlider = new Slider(0, 100f, 1f, false, Assets.menuSkin); songVolumeSlider.setValue(GlobalConfiguration.songVolume); songVolumeSlider.addListener(this); feedbackVolumeLabel.setFontScale(fontScale); feedbackVolumeValueLabel = new Label(Integer.toString(GlobalConfiguration.feedbackVolume), Assets.menuSkin, "song_style_result"); feedbackVolumeValueLabel.setFontScale(fontScale); feedbackVolumeSlider = new Slider(0, 100f, 1f, false, Assets.menuSkin); feedbackVolumeSlider.setValue(GlobalConfiguration.feedbackVolume); feedbackVolumeSlider.addListener(this); playHintSoundCheckbox = new CheckBox("Hint Sounds (" + (GlobalConfiguration.playHintSounds ? "X" : " ") + ")", Assets.menuSkin); playHintSoundCheckbox.getLabel().setFontScale(fontScale); playHintSoundCheckbox.getImageCell().width(0); playHintSoundCheckbox.setChecked(GlobalConfiguration.playHintSounds); playHintSoundCheckbox.addListener(this); final Table volumeTable = new Table(); volumeTable.setHeight(stage.getHeight() * 0.7f); volumeTable.setWidth(stage.getWidth() * 0.6f); // song volume volumeTable.add(songVolumeLabel).width(stage.getWidth() * 0.3f).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).left(); volumeTable.add().width(stage.getWidth() * 0.25f); volumeTable.add(songVolumeValueLabel).width(stage.getWidth() * 0.05f).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).right().row(); volumeTable.add(songVolumeSlider).width(stage.getWidth() * 0.6f).height(songVolumeLabel.getHeight() * fontScale).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).colspan(3).row(); volumeTable.add().height(songVolumeLabel.getHeight()).row(); // feedback volume volumeTable.add(feedbackVolumeLabel).width(stage.getWidth() * 0.3f).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).left(); volumeTable.add().width(stage.getWidth() * 0.25f); volumeTable.add(feedbackVolumeValueLabel).width(stage.getWidth() * 0.05f).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).right().row(); volumeTable.add(feedbackVolumeSlider).width(stage.getWidth() * 0.6f).height(songVolumeLabel.getHeight() * fontScale).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).colspan(3).row(); volumeTable.add().height(songVolumeLabel.getHeight()).row(); volumeTable.add(playHintSoundCheckbox).height(songVolumeLabel.getHeight() * fontScale).colspan(3).left().row(); volumeTable.add().expand().fill().row(); volumeTable.setDebug(DEBUG); content.add(volumeTable); // timing block offsetLabel.setFontScale(fontScale); offsetValueLabel = new CheckBox((GlobalConfiguration.offset > 0 ? "+" : "") + Integer.toString(GlobalConfiguration.offset) + " ms.", Assets.menuSkin); offsetValueLabel.addListener(this); offsetValueLabel.getLabel().setFontScale(fontScale); offsetValueLabel.getImageCell().width(0); offsetSlider = new Slider(-1000f, 1000f, 1f, false, Assets.menuSkin); offsetSlider.setValue(GlobalConfiguration.offset); offsetSlider.addListener(this); inputOffsetLabel.setFontScale(fontScale); inputOffsetValueLabel = new CheckBox((GlobalConfiguration.inputOffset > 0 ? "+" : "") + Integer.toString(GlobalConfiguration.inputOffset) + " ms.", Assets.menuSkin); inputOffsetValueLabel.getLabel().setFontScale(fontScale); inputOffsetValueLabel.getImageCell().width(0); inputOffsetValueLabel.addListener(this); inputOffsetSlider = new Slider(-250f, 250f, 1f, false, Assets.menuSkin); inputOffsetSlider.setValue(GlobalConfiguration.inputOffset); inputOffsetSlider.addListener(this); // Approach Rate noteSpeedSlider = new Slider(0, 10, 1, false, Assets.menuSkin); noteSpeedSlider.setValue(GlobalConfiguration.noteSpeed); noteSpeedSlider.addListener(this); noteSpeedLabel.setFontScale(fontScale); noteSpeedValueLabel = new Label(Integer.toString(GlobalConfiguration.noteSpeed) + "", Assets.menuSkin, "song_style_result"); noteSpeedValueLabel.setFontScale(fontScale); // Overall Difficulty overallDifficultySlider = new Slider(0, 10, 1, false, Assets.menuSkin); overallDifficultySlider.setValue(GlobalConfiguration.overallDifficulty); overallDifficultySlider.addListener(this); overallDifficultyLabel.setFontScale(fontScale); overallDifficultyValueLabel = new Label(Integer.toString(GlobalConfiguration.overallDifficulty) + "", Assets.menuSkin, "song_style_result"); overallDifficultyValueLabel.setFontScale(fontScale); syncModeCheckbox = new CheckBox("Sync Mode: " + SongUtils.syncModes[newSyncMode], Assets.menuSkin); syncModeCheckbox.getLabel().setFontScale(fontScale); syncModeCheckbox.getImageCell().width(0); syncModeCheckbox.addListener(this); final Table offsetTable = new Table(); // global offset offsetTable.setHeight(stage.getHeight() * 0.7f); offsetTable.setWidth(stage.getWidth() * 0.6f); offsetTable.add(offsetLabel).width(stage.getWidth() * 0.3f).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).fillX(); offsetTable.add().width(stage.getWidth() * 0.20f); offsetTable.add(offsetValueLabel).width(stage.getWidth() * 0.10f).height(offsetLabel.getHeight() * fontScale).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).right().row(); offsetTable.add(offsetSlider).width(stage.getWidth() * 0.6f).height(offsetLabel.getHeight() * fontScale).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).colspan(3).row(); offsetTable.add().height(offsetLabel.getHeight() / 2f).row(); // input offset offsetTable.add(inputOffsetLabel).width(stage.getWidth() * 0.3f).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).fillX(); offsetTable.add().width(stage.getWidth() * 0.20f); offsetTable.add(inputOffsetValueLabel).width(stage.getWidth() * 0.10f).height(offsetLabel.getHeight() * fontScale).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).right().row(); offsetTable.add(inputOffsetSlider).width(stage.getWidth() * 0.6f).height(inputOffsetLabel.getHeight() * fontScale).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).colspan(3).row(); offsetTable.add().height(inputOffsetLabel.getHeight() / 2f).row(); // Approach Rate offsetTable.add(noteSpeedLabel).width(stage.getWidth() * 0.3f).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).fillX(); offsetTable.add().width(stage.getWidth() * 0.20f); offsetTable.add(noteSpeedValueLabel).width(stage.getWidth() * 0.10f).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).right().row(); offsetTable.add(noteSpeedSlider).width(stage.getWidth() * 0.6f).height(noteSpeedLabel.getHeight() * fontScale).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).colspan(3).row(); offsetTable.add().height(noteSpeedValueLabel.getHeight() / 2f).row(); // Overall Difficulty offsetTable.add(overallDifficultyLabel).width(stage.getWidth() * 0.3f).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).fillX(); offsetTable.add().width(stage.getWidth() * 0.20f); offsetTable.add(overallDifficultyValueLabel).width(stage.getWidth() * 0.10f).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).right().row(); offsetTable.add(overallDifficultySlider).width(stage.getWidth() * 0.6f).height(overallDifficultyLabel.getHeight() * fontScale).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).colspan(3).row(); offsetTable.add().height(overallDifficultyValueLabel.getHeight() / 2f).row(); // sync mode setting offsetTable.add(syncModeCheckbox).height(inputOffsetLabel.getHeight() * fontScale).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).left().colspan(3).row(); offsetTable.add().expand().fill().row(); offsetTable.setVisible(false); offsetTable.setDebug(DEBUG); content.add(offsetTable); // extras - path to beatmaps pathToBeatmaps.setFontScale(fontScale); pathValueLabel.setFontScale(fontScale); // extras - sorting mode sortingModeChooser = new CheckBox("Sorting Mode: " + sortingModes[GlobalConfiguration.sortMode], Assets.menuSkin); sortingModeChooser.getLabel().setFontScale(fontScale); sortingModeChooser.getImageCell().width(0); sortingModeChooser.addListener(this); sortingOrderChooser = new CheckBox("Sorting Order: " + sortingOrders[GlobalConfiguration.sortOrder], Assets.menuSkin); sortingOrderChooser.getLabel().setFontScale(fontScale); sortingOrderChooser.getImageCell().width(0); sortingOrderChooser.addListener(this); // extras - random mode randomModeChooser = new CheckBox("Random Mode: " + SongUtils.randomModes[GlobalConfiguration.randomMode], Assets.menuSkin); randomModeChooser.getLabel().setFontScale(fontScale); randomModeChooser.getImageCell().width(0); randomModeChooser.addListener(this); final Table otherTable = new Table(); otherTable.setHeight(stage.getHeight() * 0.7f); otherTable.setWidth(stage.getWidth() * 0.6f); otherTable.add(pathToBeatmaps).width(stage.getWidth() * 0.6f).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).fillX().left().row(); otherTable.add(pathValueLabel).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).fillX().left().padLeft(stage.getWidth() * 0.03f).row(); otherTable.add(sortingModeChooser).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).left().row(); otherTable.add(sortingOrderChooser).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).left().row(); otherTable.add(randomModeChooser).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).left().row(); otherTable.add().expand().fill().row(); otherTable.add(reloadBeatmaps).padTop(stage.getHeight() * 0.01f).padBottom(stage.getHeight() * 0.01f).left().row(); otherTable.setVisible(false); otherTable.setDebug(DEBUG); content.add(otherTable); // fill in the UI content.setWidth(stage.getWidth() * 0.6f); content.setHeight(stage.getHeight() * 0.7f); content.setX(stage.getWidth() * 0.35f); content.setY(stage.getHeight() * 0.10f); stage.addActor(content); stage.addActor(tabbedPane); ChangeListener tabListener = new ChangeListener() { @Override public void changed(ChangeEvent event, Actor actor) { volumeTable.setVisible(volumeSettingsTabButton.isChecked()); offsetTable.setVisible(offsetSettingsTabButton.isChecked()); otherTable.setVisible(otherSettingsTabButton.isChecked()); } }; volumeSettingsTabButton.addListener(tabListener); offsetSettingsTabButton.addListener(tabListener); otherSettingsTabButton.addListener(tabListener); reloadBeatmaps.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { Assets.hardReloadBeatmaps(); ((Game) Gdx.app.getApplicationListener()).setScreen(new BeatmapReloadScreen()); } }); returnButton.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { GlobalConfiguration.songVolume = newVolume; GlobalConfiguration.feedbackVolume = newFeedbackVolume; GlobalConfiguration.offset = newGlobalOffset; GlobalConfiguration.inputOffset = newInputOffset; GlobalConfiguration.noteSpeed = newNoteSpeed; GlobalConfiguration.overallDifficulty = newOverallDifficulty; GlobalConfiguration.playHintSounds = newHitSoundsSetting; GlobalConfiguration.sortMode = newSortingMode; GlobalConfiguration.sortOrder = newSortingOrder; GlobalConfiguration.randomMode = newRandomMode; GlobalConfiguration.syncMode = newSyncMode; GlobalConfiguration.storeConfiguration(); ((Game) Gdx.app.getApplicationListener()).setScreen(new MainMenuScreen()); } }); InputMultiplexer impx = new InputMultiplexer(); impx.addProcessor(this); impx.addProcessor(stage); Gdx.input.setInputProcessor(impx); Gdx.input.setCatchBackKey(true); } @Override public void render(float delta) { Gdx.gl.glClearColor(0, 0, 0, 1); Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); stage.act(); stage.draw(); } @Override public void resize(int width, int height) { } @Override public void pause() { } @Override public void resume() { } @Override public void hide() { } @Override public void dispose() { stage.dispose(); } @Override public void changed(ChangeEvent event, Actor actor) { if (actor == songVolumeSlider) { newVolume = (int) ((Slider) actor).getValue(); songVolumeValueLabel.setText(Integer.toString(newVolume)); } if (actor == feedbackVolumeSlider) { newFeedbackVolume = (int) ((Slider) actor).getValue(); feedbackVolumeValueLabel.setText(Integer.toString(newFeedbackVolume)); } if (actor == offsetSlider) { newGlobalOffset = (int) ((Slider) actor).getValue(); offsetValueLabel.setText((newGlobalOffset > 0 ? "+" : "") + Integer.toString(newGlobalOffset) + " ms."); } if (actor == inputOffsetSlider) { newInputOffset = (int) ((Slider) actor).getValue(); inputOffsetValueLabel.setText((newInputOffset > 0 ? "+" : "") + Integer.toString(newInputOffset) + " ms."); } if (actor == noteSpeedSlider) { newNoteSpeed = (int) ((Slider) actor).getValue(); noteSpeedValueLabel.setText(newNoteSpeed + ""); } if (actor == overallDifficultySlider) { newOverallDifficulty = (int) ((Slider) actor).getValue(); overallDifficultyValueLabel.setText(newOverallDifficulty + ""); } if (actor == playHintSoundCheckbox) { newHitSoundsSetting = playHintSoundCheckbox.isChecked(); playHintSoundCheckbox.setText("Hint Sounds (" + (playHintSoundCheckbox.isChecked() ? "X" : " ") + ")"); } if (actor == sortingModeChooser) { newSortingMode = (newSortingMode + 1) % sortingModes.length; sortingModeChooser.setText("Sorting Mode: " + sortingModes[newSortingMode]); } if (actor == sortingOrderChooser) { newSortingOrder = (newSortingOrder + 1) % sortingOrders.length; sortingOrderChooser.setText("Sorting Order: " + sortingOrders[newSortingOrder]); } if (actor == randomModeChooser) { newRandomMode = (newRandomMode + 1) % SongUtils.randomModes.length; randomModeChooser.setText("Random Mode: " + SongUtils.randomModes[newRandomMode]); } if (actor == syncModeCheckbox) { newSyncMode = (newSyncMode + 1) % 4; syncModeCheckbox.setText("Sync Mode: " + SongUtils.syncModes[newSyncMode]); } if (actor == offsetValueLabel) { Input.TextInputListener listener = new Input.TextInputListener() { @Override public void input(String text) { try { newGlobalOffset = Integer.parseInt(text); offsetValueLabel.setText((newGlobalOffset > 0 ? "+" : "") + Integer.toString(newGlobalOffset) + " ms."); offsetSlider.setValue(newGlobalOffset); } catch (Exception e) { // fail silently - we expect time in milliseconds } } @Override public void canceled() { } }; Gdx.input.getTextInput(listener, "Offset", "", "Previous value: " + newGlobalOffset + " ms."); } if (actor == inputOffsetValueLabel) { Input.TextInputListener listener = new Input.TextInputListener() { @Override public void input(String text) { try { newInputOffset = Integer.parseInt(text); inputOffsetValueLabel.setText((newInputOffset > 0 ? "+" : "") + Integer.toString(newInputOffset) + " ms."); inputOffsetSlider.setValue(newInputOffset); } catch (Exception e) { // fail silently - we expect time in milliseconds } } @Override public void canceled() { } }; Gdx.input.getTextInput(listener, "Input Offset", "", "Previous value: " + newInputOffset + " ms."); } } @Override public boolean keyDown(int keycode) { return false; } @Override public boolean keyUp(int keycode) { if (keycode == Input.Keys.BACK || keycode == Input.Keys.ESCAPE) { // do nothing // Return without saving the changes ((Game) Gdx.app.getApplicationListener()).setScreen(new MainMenuScreen()); return true; } return false; } @Override public boolean keyTyped(char character) { return false; } @Override public boolean touchDown(int screenX, int screenY, int pointer, int button) { return false; } @Override public boolean touchUp(int screenX, int screenY, int pointer, int button) { return false; } @Override public boolean touchDragged(int screenX, int screenY, int pointer) { return false; } @Override public boolean mouseMoved(int screenX, int screenY) { return false; } @Override public boolean scrolled(int amount) { return false; } }