From 5a991b24abfe0aa84b4b257c9d0b7fc3fe006a49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maty=C3=A1=C5=A1=20Latner?= <matyas.latner@nic.cz> Date: Tue, 17 Mar 2015 10:22:04 +0100 Subject: [PATCH] #19 Pause/Resume in reaction to main menu state --- .../event/MainMenuPositionChangedEvent.java | 16 ++ core/src/cz/nic/tablexia/menu/MainMenu.java | 272 ++++++++++-------- .../screen/AbstractTablexiaScreen.java | 30 +- 3 files changed, 186 insertions(+), 132 deletions(-) create mode 100644 core/src/cz/nic/tablexia/bus/event/MainMenuPositionChangedEvent.java diff --git a/core/src/cz/nic/tablexia/bus/event/MainMenuPositionChangedEvent.java b/core/src/cz/nic/tablexia/bus/event/MainMenuPositionChangedEvent.java new file mode 100644 index 000000000..a2024d071 --- /dev/null +++ b/core/src/cz/nic/tablexia/bus/event/MainMenuPositionChangedEvent.java @@ -0,0 +1,16 @@ +package cz.nic.tablexia.bus.event; + +import cz.nic.tablexia.bus.ApplicationBus; + +public class MainMenuPositionChangedEvent implements ApplicationBus.ApplicationEvent { + + private boolean isMenuOpen; + + public MainMenuPositionChangedEvent(boolean isMenuOpen) { + this.isMenuOpen = isMenuOpen; + } + + public boolean isMenuOpen() { + return isMenuOpen; + } +} diff --git a/core/src/cz/nic/tablexia/menu/MainMenu.java b/core/src/cz/nic/tablexia/menu/MainMenu.java index 72d7a11c5..7d44b7f16 100644 --- a/core/src/cz/nic/tablexia/menu/MainMenu.java +++ b/core/src/cz/nic/tablexia/menu/MainMenu.java @@ -3,7 +3,6 @@ package cz.nic.tablexia.menu; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.Texture.TextureFilter; -import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.graphics.g2d.TextureRegion; import com.badlogic.gdx.math.Interpolation; import com.badlogic.gdx.math.Interpolation.PowOut; @@ -19,6 +18,8 @@ import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import com.badlogic.gdx.scenes.scene2d.utils.TextureRegionDrawable; import cz.nic.tablexia.TablexiaSettings; +import cz.nic.tablexia.bus.ApplicationBus; +import cz.nic.tablexia.bus.event.MainMenuPositionChangedEvent; import cz.nic.tablexia.graphics.ColorTexture; import cz.nic.tablexia.loader.application.ApplicationFontManager; import cz.nic.tablexia.loader.application.ApplicationSoundManager; @@ -26,138 +27,155 @@ import cz.nic.tablexia.loader.application.ApplicationTextureManager; /** * MainMenu container - * - * @author Matyáš Latner * + * @author Matyáš Latner */ public class MainMenu extends Stack { - - private static final float MENU_MOVE_DURATION = 1f; - private static final PowOut MENU_MOVE_INTERPOLATION = Interpolation.pow4Out; - private static final float MENU_CONTROLLER_SIZE_RATIO = (1f/7); - private static final Color MENU_TEXT_COLOR = Color.BLACK; - private static final int OPEN_MENU_BUTTON_WIDTH = 55; - private static final int OPEN_MENU_BUTTON_HEIGHT = 75; - private static final int OPEN_MENU_BUTTON_TOP_OFFSET = 60; - - private Table menuTableLayout; - private TextButtonStyle menuButtonStyle; - private boolean isMenuOpen; - private Button openCloseButton; - private float menuClosePositionX; - private int menuOpenPositionX; - private int menuPositionY; - - public MainMenu(float width, float height) { - setBounds(0, 0, width, height); - setDebug(TablexiaSettings.getInstance().isShowBoundingBoxes()); - Texture background = ApplicationTextureManager.getInstance().getTexture(ApplicationTextureManager.MAINMENU_BACKGROUND); - background.setFilter(TextureFilter.Linear, TextureFilter.Linear); - - // menu layout - menuTableLayout = new Table(); - menuTableLayout.setFillParent(true); - menuTableLayout.setBackground(new TextureRegionDrawable(new TextureRegion(background))); - addActor(menuTableLayout); - - // menu button style - menuButtonStyle = new TextButtonStyle(); - menuButtonStyle.font = ApplicationFontManager.getInstance().getFont(ApplicationFontManager.FONT_ROBOTO_REGULAR); - menuButtonStyle.fontColor = MENU_TEXT_COLOR; - menuButtonStyle.up = new TextureRegionDrawable(new TextureRegion(new ColorTexture(50, 50, Color.BLUE))); - - // open close button - openCloseButton = new Button(new TextureRegionDrawable(new TextureRegion(new ColorTexture(OPEN_MENU_BUTTON_WIDTH, OPEN_MENU_BUTTON_HEIGHT, Color.RED)))); - openCloseButton.addAction(Actions.alpha(0)); - openCloseButton.align(Align.topRight); - openCloseButton.addListener(new ClickListener() { - - @Override - public void clicked(InputEvent event, float x, float y) { - toggleMenu(); - } - }); - Table openCloseButtonContainer = new Table(); - openCloseButtonContainer.add(openCloseButton).expandX().padTop(OPEN_MENU_BUTTON_TOP_OFFSET).right(); - openCloseButtonContainer.row(); - openCloseButtonContainer.add().expandY(); - addActor(openCloseButtonContainer); - - prepareMenuPositions(); - closeMenu(false); - } - - + + private static final float MENU_MOVE_DURATION = 1f; + private static final PowOut MENU_MOVE_INTERPOLATION = Interpolation.pow4Out; + private static final float MENU_CONTROLLER_SIZE_RATIO = (1f / 7); + private static final Color MENU_TEXT_COLOR = Color.BLACK; + private static final int OPEN_MENU_BUTTON_WIDTH = 55; + private static final int OPEN_MENU_BUTTON_HEIGHT = 75; + private static final int OPEN_MENU_BUTTON_TOP_OFFSET = 60; + + private Table menuTableLayout; + private TextButtonStyle menuButtonStyle; + private boolean isMenuOpen; + private Button openCloseButton; + private float menuClosePositionX; + private int menuOpenPositionX; + private int menuPositionY; + + public MainMenu(float width, float height) { + setBounds(0, 0, width, height); + setDebug(TablexiaSettings.getInstance().isShowBoundingBoxes()); + Texture background = ApplicationTextureManager.getInstance().getTexture(ApplicationTextureManager.MAINMENU_BACKGROUND); + background.setFilter(TextureFilter.Linear, TextureFilter.Linear); + + // menu layout + menuTableLayout = new Table(); + menuTableLayout.setFillParent(true); + menuTableLayout.setBackground(new TextureRegionDrawable(new TextureRegion(background))); + addActor(menuTableLayout); + + // menu button style + menuButtonStyle = new TextButtonStyle(); + menuButtonStyle.font = ApplicationFontManager.getInstance().getFont(ApplicationFontManager.FONT_ROBOTO_REGULAR); + menuButtonStyle.fontColor = MENU_TEXT_COLOR; + menuButtonStyle.up = new TextureRegionDrawable(new TextureRegion(new ColorTexture(50, 50, Color.BLUE))); + + // open close button + openCloseButton = new Button(new TextureRegionDrawable(new TextureRegion(new ColorTexture(OPEN_MENU_BUTTON_WIDTH, OPEN_MENU_BUTTON_HEIGHT, Color.RED)))); + openCloseButton.addAction(Actions.alpha(0)); + openCloseButton.align(Align.topRight); + openCloseButton.addListener(new ClickListener() { + + @Override + public void clicked(InputEvent event, float x, float y) { + toggleMenu(); + } + }); + Table openCloseButtonContainer = new Table(); + openCloseButtonContainer.add(openCloseButton).expandX().padTop(OPEN_MENU_BUTTON_TOP_OFFSET).right(); + openCloseButtonContainer.row(); + openCloseButtonContainer.add().expandY(); + addActor(openCloseButtonContainer); + + prepareMenuPositions(); + closeMenu(false); + } + + //////////////////////////// MENU ITEMS - - public void initMenuItems() { - menuTableLayout.reset(); - menuTableLayout.setDebug(TablexiaSettings.getInstance().isShowBoundingBoxes()); - - for (final MainMenuDefinition menuItem : MainMenuDefinition.values()) { - addMenuItem(menuItem); - IMenuItem[] subMenu = menuItem.getSubmenu(); - if (subMenu != null) { - for (IMenuItem submenuItem : subMenu) { - addMenuItem(submenuItem); - } - } - } - } - - private void addMenuItem(final IMenuItem menuItem) { - TextButton subMenuButton = new TextButton(menuItem.getTitle(), menuButtonStyle); - subMenuButton.addListener(new ClickListener() { - - @Override - public void clicked(InputEvent event, float x, float y) { - menuItem.performAction(); - if (menuItem.isCloseMenu()) { - closeMenu(true); - } - } - - }); - menuTableLayout.add(subMenuButton).expandX(); - menuTableLayout.row(); - } - - + + public void initMenuItems() { + menuTableLayout.reset(); + menuTableLayout.setDebug(TablexiaSettings.getInstance().isShowBoundingBoxes()); + + for (final MainMenuDefinition menuItem : MainMenuDefinition.values()) { + addMenuItem(menuItem); + IMenuItem[] subMenu = menuItem.getSubmenu(); + if (subMenu != null) { + for (IMenuItem submenuItem : subMenu) { + addMenuItem(submenuItem); + } + } + } + } + + private void addMenuItem(final IMenuItem menuItem) { + TextButton subMenuButton = new TextButton(menuItem.getTitle(), menuButtonStyle); + subMenuButton.addListener(new ClickListener() { + + @Override + public void clicked(InputEvent event, float x, float y) { + menuItem.performAction(); + if (menuItem.isCloseMenu()) { + closeMenu(true); + } + } + + }); + menuTableLayout.add(subMenuButton).expandX(); + menuTableLayout.row(); + } + + //////////////////////////// MENU MOVEMENT - - private void prepareMenuPositions() { - isMenuOpen = false; - menuClosePositionX = -(getWidth() - (getWidth() * MENU_CONTROLLER_SIZE_RATIO)); - menuOpenPositionX = 0; - menuPositionY = 0; - } - - private void toggleMenu() { - if (isMenuOpen) { - closeMenu(true); - } else { - openMenu(true); - } - } - - private void closeMenu(boolean animated) { - isMenuOpen = false; - if (animated) { - addAction(Actions.moveTo(menuClosePositionX, menuPositionY, MENU_MOVE_DURATION, MENU_MOVE_INTERPOLATION)); + + private void prepareMenuPositions() { + isMenuOpen = false; + menuClosePositionX = -(getWidth() - (getWidth() * MENU_CONTROLLER_SIZE_RATIO)); + menuOpenPositionX = 0; + menuPositionY = 0; + } + + private void toggleMenu() { + if (isMenuOpen) { + closeMenu(true); + } else { + openMenu(true); + } + } + + private void closeMenu(boolean animated) { + isMenuOpen = false; + if (animated) { + addAction(Actions.sequence(Actions.moveTo(menuClosePositionX, menuPositionY, MENU_MOVE_DURATION, MENU_MOVE_INTERPOLATION), + Actions.run(new Runnable() { + + @Override + public void run() { + if (!isMenuOpen) { + sendMenuPositionChangedEvent(); + } + } + }))); ApplicationSoundManager.getInstance().getSound(ApplicationSoundManager.MAINMENU_CLOSE).play(); - } else { - setPosition(menuClosePositionX, menuPositionY); - } - } - - private void openMenu(boolean animated) { - isMenuOpen = true; - if (animated) { - addAction(Actions.moveTo(menuOpenPositionX, menuPositionY, MENU_MOVE_DURATION, MENU_MOVE_INTERPOLATION)); + } else { + setPosition(menuClosePositionX, menuPositionY); + sendMenuPositionChangedEvent(); + } + } + + private void openMenu(boolean animated) { + isMenuOpen = true; + sendMenuPositionChangedEvent(); + if (animated) { + addAction(Actions.moveTo(menuOpenPositionX, menuPositionY, MENU_MOVE_DURATION, MENU_MOVE_INTERPOLATION)); ApplicationSoundManager.getInstance().getSound(ApplicationSoundManager.MAINMENU_OPEN).play(); - } else { - setPosition(menuOpenPositionX, menuPositionY); - } - } + } else { + setPosition(menuOpenPositionX, menuPositionY); + } + } + + +//////////////////////////// POSITION CHANGED EVENT + + private void sendMenuPositionChangedEvent() { + ApplicationBus.getInstance().post(new MainMenuPositionChangedEvent(isMenuOpen)).asynchronously(); + } } diff --git a/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java b/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java index 2d4938990..31f3aec1f 100644 --- a/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java +++ b/core/src/cz/nic/tablexia/screen/AbstractTablexiaScreen.java @@ -12,6 +12,8 @@ import com.badlogic.gdx.scenes.scene2d.Stage; import com.badlogic.gdx.utils.I18NBundle; import com.badlogic.gdx.utils.async.AsyncTask; +import net.engio.mbassy.listener.Handler; + import java.util.ArrayList; import java.util.List; import java.util.Locale; @@ -19,6 +21,7 @@ import java.util.Locale; import cz.nic.tablexia.TablexiaSettings; import cz.nic.tablexia.bus.ApplicationBus; import cz.nic.tablexia.bus.ApplicationBus.ApplicationEvent; +import cz.nic.tablexia.bus.event.MainMenuPositionChangedEvent; import cz.nic.tablexia.loader.TablexiaAssetManager; import cz.nic.tablexia.loader.TablexiaDataManager; import cz.nic.tablexia.loader.TablexiaSoundManager; @@ -40,6 +43,7 @@ public abstract class AbstractTablexiaScreen<T> extends ScreenAdapter { private boolean loadingComplete; private boolean loadingStarted; private boolean loadAsync; + private boolean paused; private static class TextManager extends TablexiaDataManager<I18NBundle> { @@ -166,10 +170,19 @@ public abstract class AbstractTablexiaScreen<T> extends ScreenAdapter { } +//////////////////////////// MAIN MENU POSITION CHANGE HANDLER + + @Handler + public void handleMainMenuPositionChangedEvent(MainMenuPositionChangedEvent mainMenuPositionChangedEvent) { + paused = mainMenuPositionChangedEvent.isMenuOpen(); + } + + //////////////////////////// LIBGDX LIFECYCLE @Override public final void show() { + ApplicationBus.getInstance().subscribe(this); if (!loadingComplete) { startTextureLoader(); startSoundLoader(); @@ -178,8 +191,13 @@ public abstract class AbstractTablexiaScreen<T> extends ScreenAdapter { loadingStarted = true; } } - - @Override + + @Override + public void hide() { + ApplicationBus.getInstance().unsubscribe(this); + } + + @Override public final void resize(int width, int height) { stage.getViewport().update(width, height, true); if (loadingComplete) { @@ -210,10 +228,12 @@ public abstract class AbstractTablexiaScreen<T> extends ScreenAdapter { notifyLoadingCompleteListeners(); } } else { - screenRender(delta); - stage.act(delta); + screenRender(delta); + if (!paused) { + stage.act(delta); + } stage.draw(); - } + } } @Override -- GitLab