diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java index 116a0143dc6a94f9547f08505307c543a920ebc8..bed02ff41b790d1d021e08e2c6c89eb92d957faa 100644 --- a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java +++ b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java @@ -7,6 +7,7 @@ import com.badlogic.gdx.math.Vector2; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Touchable; import com.badlogic.gdx.scenes.scene2d.actions.Actions; +import com.badlogic.gdx.scenes.scene2d.actions.SequenceAction; import com.badlogic.gdx.scenes.scene2d.ui.Image; import net.engio.mbassy.listener.Handler; @@ -18,7 +19,9 @@ import java.util.Map; import cz.nic.tablexia.bus.ApplicationBus; import cz.nic.tablexia.game.GameDefinition; +import cz.nic.tablexia.menu.AbstractMenu; import cz.nic.tablexia.menu.game.GameMenuDefinition; +import cz.nic.tablexia.menu.main.MainMenu; import cz.nic.tablexia.model.screen.ScreenDAO; import cz.nic.tablexia.screen.AbstractTablexiaScreen; import cz.nic.tablexia.screen.gamemenu.actions.ScrollHomeAction; @@ -27,6 +30,7 @@ import cz.nic.tablexia.screen.gamemenu.pages.GameMenuPage; import cz.nic.tablexia.screen.gamemenu.pages.MenuPage; import cz.nic.tablexia.screen.gamemenu.pages.OfficeMenuPage; import cz.nic.tablexia.screen.gamemenu.pages.WallPage; +import cz.nic.tablexia.util.MusicUtil; import cz.nic.tablexia.util.Utility; /** @@ -41,6 +45,12 @@ public class GameMenuScreen extends AbstractTablexiaScreen<int[][]> { private Music ambientMusic; + private Music introSpeechMusic; + private Music.OnCompletionListener introSpeechMusicCompleteListener; + + private SequenceAction initialScrollAction; + private boolean initialScrollActive = false; + public enum GameMenuPageDefinition { OFFICE_PAGE(0, null, null, null), ROBBERY_PAGE( 1, GameDefinition.ROBBERY, GameMenuAssets.BASE_ASSETS_ROBBERY, new Vector2(0.168f, 0.016f)), @@ -166,10 +176,10 @@ public class GameMenuScreen extends AbstractTablexiaScreen<int[][]> { } // show intro scroll and play intro speech only first time user visits GameMenuScreen - Music music = null; + introSpeechMusic = null; if(isFirstLogIn) { - music = getMusic(INTRO_SPEECH); - music.play(); + introSpeechMusic = getMusic(INTRO_SPEECH); + introSpeechMusic.play(); pagedScrollPane.setTouchable(Touchable.disabled); pagedScrollPane.scrollToPage(pagedScrollPane.getChildren().size - 1, false); @@ -178,26 +188,31 @@ public class GameMenuScreen extends AbstractTablexiaScreen<int[][]> { pagedScrollPane.setScrollX(pagedScrollPane.getContent().getWidth()); pagedScrollPane.updateVisualScroll(); - pagedScrollPane.addAction(Actions.sequence(Actions.delay(1f), ScrollHomeAction.createInstace(), Actions.run(new Runnable() { + initialScrollAction = Actions.sequence(Actions.delay(1f), ScrollHomeAction.createInstace(), Actions.run(new Runnable() { @Override public void run() { pagedScrollPane.setTouchable(Touchable.enabled); + initialScrollActive = false; } - }))); + })); + pagedScrollPane.addAction(initialScrollAction); + initialScrollActive = true; } //sound effect of street is waiting, until intro speech is finished //game sound effects in menu are turned of after intro speech is finished if(isFirstLogIn) { - if (music != null) { - music.setOnCompletionListener(new Music.OnCompletionListener() { + if (introSpeechMusic != null) { + introSpeechMusicCompleteListener = new Music.OnCompletionListener() { @Override public void onCompletion(Music music) { music.dispose(); playAmbientMusic(); resetGameMenuSounds(gameMenuPages); } - }); + }; + + introSpeechMusic.setOnCompletionListener(introSpeechMusicCompleteListener); } } else { playAmbientMusic(); @@ -206,6 +221,18 @@ public class GameMenuScreen extends AbstractTablexiaScreen<int[][]> { screenResized(0, 0); } + private void cancelInitialScroll() { + initialScrollActive = false; + pagedScrollPane.removeAction(initialScrollAction); + pagedScrollPane.cancel(); + pagedScrollPane.scrollToInitialPage(); + pagedScrollPane.setTouchable(Touchable.enabled); + + if(introSpeechMusic != null && introSpeechMusic.isPlaying()) { + MusicUtil.fadeOut(introSpeechMusic, 1f, introSpeechMusicCompleteListener); + } + } + private void playAmbientMusic() { ambientMusic = getMusic(GameMenuAssets.AMBIENT_MUSIC); ambientMusic.setVolume(AMBIENT_SOUND_VOLUME); @@ -284,10 +311,22 @@ public class GameMenuScreen extends AbstractTablexiaScreen<int[][]> { @Override public void backButtonPressed() { + if(initialScrollActive) { + cancelInitialScroll(); + return; + } + if (!pagedScrollPane.getCurrentPage().backButtonPressed()) { if (!pagedScrollPane.scrollToInitialPage()) { Gdx.app.exit(); } } } + + @Handler + public void onMenuEvent(AbstractMenu.MenuEvent menuEvent) { + if(initialScrollActive && menuEvent.getTargetMenu() == MainMenu.class) { + cancelInitialScroll(); + } + } } \ No newline at end of file diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/PagedScrollPane.java b/core/src/cz/nic/tablexia/screen/gamemenu/PagedScrollPane.java index c48a065b2fd7ddbc9125a6fa41b4cbc897c4c501..b4df09713f3860267b260530ce9b0e0d475938f5 100644 --- a/core/src/cz/nic/tablexia/screen/gamemenu/PagedScrollPane.java +++ b/core/src/cz/nic/tablexia/screen/gamemenu/PagedScrollPane.java @@ -9,6 +9,7 @@ import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.InputListener; import com.badlogic.gdx.scenes.scene2d.ui.HorizontalGroup; import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.utils.SnapshotArray; import cz.nic.tablexia.screen.gamemenu.pages.MenuPage; import cz.nic.tablexia.util.ui.ScrollPaneWithBorders; @@ -148,6 +149,20 @@ public class PagedScrollPane extends ScrollPaneWithBorders { }); } + @Override + public void setScrollX(float pixels) { + super.setScrollX(pixels); + + SnapshotArray<Actor> pages = content.getChildren(); + int page = 0; + for(int i = 0; i < pages.size; i++) { + if(pages.get(i).getX() < getScrollX()) { + page++; + } + } + currentPage = page; + } + /** * Determinates if PagedScrollPane should change page or not * according to swipes X coordinate diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java b/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java index e54d498c3643b4df29fad9caa4bf7cef92d460ca..a3bf0e3812d29601a961c410237675d0fcd741c9 100644 --- a/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java +++ b/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java @@ -358,6 +358,7 @@ public class GameMenuPage extends MenuPage { buttonDifficultyEasy.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { + super.clicked(event, x, y); dragSwitchListener.switchToStep(GameDifficulty.EASY.getDifficultyNumber() - 1); } }); @@ -365,6 +366,7 @@ public class GameMenuPage extends MenuPage { buttonDifficultyMedium.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { + super.clicked(event, x, y); dragSwitchListener.switchToStep(GameDifficulty.MEDIUM.getDifficultyNumber() - 1); } }); @@ -372,6 +374,7 @@ public class GameMenuPage extends MenuPage { buttonDifficultyHard.addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { + super.clicked(event, x, y); dragSwitchListener.switchToStep(GameDifficulty.HARD.getDifficultyNumber() - 1); } }); @@ -420,8 +423,8 @@ public class GameMenuPage extends MenuPage { difficultyChanged(GameDifficulty.getVisibleGameDifficultyList().get(step)); } }); - gameDifficulty = UserDifficultySettingsDAO.getUserSettingsByGame(TablexiaSettings.getInstance().getSelectedUser().getId(), game.getGameNumber()); - dragSwitchListener.switchToStep(gameDifficulty.getDifficultyNumber() - 1); + gameDifficulty = UserDifficultySettingsDAO.getUserSettingsByGame(TablexiaSettings.getInstance().getSelectedUser().getId(), game.getGameNumber()); + dragSwitchListener.switchToStep(gameDifficulty.getDifficultyNumber() - 1, false); stepSoundsEnabled = true; } @@ -482,7 +485,6 @@ public class GameMenuPage extends MenuPage { public void difficultyChanged(final GameDifficulty difficulty) { gameDifficulty = difficulty; TablexiaSettings.getInstance().setGameDifficulty(game, difficulty); - new Runnable() { @Override public void run() { diff --git a/core/src/cz/nic/tablexia/util/MusicUtil.java b/core/src/cz/nic/tablexia/util/MusicUtil.java index c9e381e0cadba3b9cac2d3022802d9df2253738c..2a8df99c5b453d0f21eae68396da935f4ac9f25d 100644 --- a/core/src/cz/nic/tablexia/util/MusicUtil.java +++ b/core/src/cz/nic/tablexia/util/MusicUtil.java @@ -13,9 +13,17 @@ public class MusicUtil { public static final float MAX_EFFECT_DURATION = 5; public static void fadeOut(final Music music, float time) { - fadeOut(music, time, true); + fadeOut(music, time, null, true); } + public static void fadeOut(final Music music, float time, boolean dispose) { + fadeOut(music, time, null, dispose); + } + + public static void fadeOut(final Music music, float time, Music.OnCompletionListener completionListener) { + fadeOut(music, time, completionListener, true); + } + public static void fadeIn(final Music music, float time) { fadeIn(music, time, true); } @@ -26,7 +34,7 @@ public class MusicUtil { * @param music Music you want to apply the effect to * @param time Duration of the effect in seconds */ - public static void fadeOut(final Music music, float time, final boolean dispose) { + public static void fadeOut(final Music music, float time, final Music.OnCompletionListener completionListener, final boolean dispose) { //Wrong arguments ? return... if(music == null || music.getVolume() <= 0 || !music.isPlaying()) return; @@ -53,7 +61,8 @@ public class MusicUtil { float volume = MathUtils.clamp(currentVolume - volumeStep, 0, 1); if(volume <= endVolume) { - music.stop(); + music.stop(); + if(completionListener != null) completionListener.onCompletion(music); if(dispose) music.dispose(); cancel(); } @@ -113,4 +122,4 @@ public class MusicUtil { } }, 0, SOUND_EFFECT_INTERVAL, repeatCount); } -} +} \ No newline at end of file