diff --git a/android/assets/gfx/screen_loader_bighand.png b/android/assets/gfx/screen_loader_bighand.png new file mode 100644 index 0000000000000000000000000000000000000000..434875f3c490e13b87a8022adb506bd3dfd029ed Binary files /dev/null and b/android/assets/gfx/screen_loader_bighand.png differ diff --git a/android/assets/gfx/screen_loader_smallhand.png b/android/assets/gfx/screen_loader_smallhand.png new file mode 100644 index 0000000000000000000000000000000000000000..70dc3586db2d259be4f316e992bbc69f8a6eac2c Binary files /dev/null and b/android/assets/gfx/screen_loader_smallhand.png differ diff --git a/android/assets/text/application/application_cs.properties b/android/assets/text/application/application_cs.properties index d4386f691c1b3420e178cc58a7babf31663b089e..4b6a65816764b04d018408284ca6eb69196eb18f 100644 --- a/android/assets/text/application/application_cs.properties +++ b/android/assets/text/application/application_cs.properties @@ -10,6 +10,10 @@ mainmenu_preferences=Nastavenà mainmenu_about=O aplikaci mainmenu_logout=Odhlásit +gamedifficulty_easy=Lehká +gamedifficulty_medium=Střednà +gamedifficulty_hard=Těžká + game_robbery_title=Lupiči game_kidnapping_title=Únos game_pursuit_title=Pronásledovánà diff --git a/android/assets/text/application/application_sk.properties b/android/assets/text/application/application_sk.properties index d4c46b7076da1910e37015b1a6140c01949d5b1c..f0d8c3f841ebf41ed97107a5ca9174d867189bc3 100644 --- a/android/assets/text/application/application_sk.properties +++ b/android/assets/text/application/application_sk.properties @@ -10,6 +10,10 @@ mainmenu_preferences=Nastavenie mainmenu_about=O aplikácià mainmenu_logout=Odhlásiť +gamedifficulty_easy=Ľahká +gamedifficulty_medium=Stredná +gamedifficulty_hard=Ťažká + game_robbery_title=Lupiči game_kidnapping_title=Únos game_pursuit_title=Prenasledovanie diff --git a/core/assets/common/screen/gamemenu/overlay.png b/core/assets/common/screen/gamemenu/overlay.png new file mode 100644 index 0000000000000000000000000000000000000000..d8fc30a3129c1ed8bf6f5c1ffb25a031c3e894ea Binary files /dev/null and b/core/assets/common/screen/gamemenu/overlay.png differ diff --git a/core/assets/cs/screen/gamemenu/helplayer.png b/core/assets/cs/screen/gamemenu/helplayer.png index da37c81316dd950ae7b84b38bac43182e042abf9..ef6ac7ca9283901add57541243ccbe741c211fc9 100644 Binary files a/core/assets/cs/screen/gamemenu/helplayer.png and b/core/assets/cs/screen/gamemenu/helplayer.png differ diff --git a/core/assets/cs/screen/gamemenu/potme_startbutton_pressed.png b/core/assets/cs/screen/gamemenu/potme_startbutton_pressed.png index f38ebf062a39a51a8bb5674d4d47ba78797c9779..ce252cdc69a0b48eec7744fc6d3a95ccad3e4ae8 100644 Binary files a/core/assets/cs/screen/gamemenu/potme_startbutton_pressed.png and b/core/assets/cs/screen/gamemenu/potme_startbutton_pressed.png differ diff --git a/core/assets/cs/screen/gamemenu/strelnice_startbutton_pressed.png b/core/assets/cs/screen/gamemenu/strelnice_startbutton_pressed.png index e484ec595785f360b844146b8c3f20b0ff450d38..8c5143946d6aa7eee7f430ce2c29fe69cceaf65c 100644 Binary files a/core/assets/cs/screen/gamemenu/strelnice_startbutton_pressed.png and b/core/assets/cs/screen/gamemenu/strelnice_startbutton_pressed.png differ diff --git a/core/src/cz/nic/tablexia/Tablexia.java b/core/src/cz/nic/tablexia/Tablexia.java index 1aab38fab885ea66d7109c68b3a7b06855900cc0..641a10cfda4bbcd4aa3d9c87ba6a2f3b41fd6f32 100644 --- a/core/src/cz/nic/tablexia/Tablexia.java +++ b/core/src/cz/nic/tablexia/Tablexia.java @@ -22,11 +22,11 @@ import cz.nic.tablexia.util.Log; import cz.nic.tablexia.util.Utility; public class Tablexia extends TablexiaApplication { - - private boolean loadingComplete = false; - private MainMenuContainer mainMenuContainer; - private ZipAssetLoader zipAssetLoader; - private boolean resetState; + + private boolean loadingComplete = false; + private MainMenuContainer mainMenuContainer; + private ZipAssetLoader zipAssetLoader; + private boolean resetState; public Tablexia(boolean debug, Locale systemLocale, String versionName, String applicationId, boolean resetState) { TablexiaSettings.init(debug, systemLocale, versionName, applicationId); @@ -37,14 +37,14 @@ public class Tablexia extends TablexiaApplication { TablexiaSettings.init(buildTypeKey, systemLocale, versionName, applicationId); this.resetState = resetState; } - - private void loadingComplete() { - if (!loadingComplete) { - loadingComplete = true; - showLastOrInitialScreen(); - ApplicationBus.getInstance().publishAsync(new ApplicationLoadingCompleteEvent()); - } - } + + private void loadingComplete() { + if (!loadingComplete) { + loadingComplete = true; + showLastOrInitialScreen(); + ApplicationBus.getInstance().publishAsync(new ApplicationLoadingCompleteEvent()); + } + } private void showLastOrInitialScreen() { AbstractTablexiaScreen<?> lastScreen = TablexiaSettings.getInstance().getCurrentScreen(); @@ -58,7 +58,7 @@ public class Tablexia extends TablexiaApplication { private void prepareMainMenu() { mainMenuContainer = new MainMenuContainer(getStage().getWidth(), getStage().getHeight()); getStage().addActor(mainMenuContainer); - } + } private void startLoading(Locale locale) { // sync loaded screen with loader image @@ -106,13 +106,13 @@ public class Tablexia extends TablexiaApplication { } }); } - - + + //////////////////////////// LIBGDX LIFECYCLE - - @Override - public void create () { - super.create(); + + @Override + public void create() { + super.create(); TablexiaSettings.getInstance().loadPreferences(resetState); Log.setLoglevel(TablexiaSettings.getInstance().getLogLevel()); @@ -122,7 +122,7 @@ public class Tablexia extends TablexiaApplication { // start loading application scope data startLoading(TablexiaSettings.getInstance().getLocale()); - } + } @Override public void pause() { @@ -134,76 +134,77 @@ public class Tablexia extends TablexiaApplication { } @Override - public void render () { - // render other screens - super.render(); - - // process loading - if (!loadingComplete) { + public void render() { + // render other screens + super.render(); + + // process loading + if (!loadingComplete) { // load internal assets if (!ApplicationFontManager.getInstance().update()) return; if (!ApplicationTextManager.getInstance().update()) return; // load external assets if (!zipAssetLoader.update()) return; - if (!ApplicationTextureManager.getInstance().update()) return; + if (!ApplicationTextureManager.getInstance().update()) return; if (!ApplicationSoundManager.getInstance().update()) return; - - prepareMainMenu(); - loadingComplete(); - } - } - - @Override - public void dispose() { + + prepareMainMenu(); + loadingComplete(); + } + } + + @Override + public void dispose() { super.dispose(); - clearLoadedData(); - } - - + clearLoadedData(); + } + + //////////////////////////// APPLICATION LOADING COMPLETE EVENT - - public static class ApplicationLoadingCompleteEvent implements ApplicationEvent {} - - + + public static class ApplicationLoadingCompleteEvent implements ApplicationEvent { + } + + //////////////////////////// CHANGE SCREEN EVENT - - public static class ChangeScreenEvent implements ApplicationEvent { - - private Class<? extends AbstractTablexiaScreen<?>> screen; - private ScreenTransaction screenTransaction; - public ChangeScreenEvent(Class<? extends AbstractTablexiaScreen<?>> screen, ScreenTransaction screenTransaction) { - this.screen = screen; - this.screenTransaction = screenTransaction; - } - - public Class<? extends AbstractTablexiaScreen<?>> getScreen() { - return screen; - } - - public ScreenTransaction getScreenTransaction() { - return screenTransaction; - } - } - - @Handler - public void handleChangeScreenEvent(final ChangeScreenEvent changeScreenEvent) { - final Class<? extends AbstractTablexiaScreen<?>> screenClass = changeScreenEvent.getScreen(); - if (!loadingComplete) { - Log.err(getClass(), "Cannot change screen -> Application loading not complete!"); - return; - } - if (screenClass == null) { - Log.err(getClass(), "Cannot change screen -> Received empty screen class!"); - return; - } - // create new screen on GL thread - Gdx.app.postRunnable(new Runnable() { - - @Override - public void run() { + public static class ChangeScreenEvent implements ApplicationEvent { + + private Class<? extends AbstractTablexiaScreen<?>> screen; + private ScreenTransaction screenTransaction; + + public ChangeScreenEvent(Class<? extends AbstractTablexiaScreen<?>> screen, ScreenTransaction screenTransaction) { + this.screen = screen; + this.screenTransaction = screenTransaction; + } + + public Class<? extends AbstractTablexiaScreen<?>> getScreen() { + return screen; + } + + public ScreenTransaction getScreenTransaction() { + return screenTransaction; + } + } + + @Handler + public void handleChangeScreenEvent(final ChangeScreenEvent changeScreenEvent) { + final Class<? extends AbstractTablexiaScreen<?>> screenClass = changeScreenEvent.getScreen(); + if (!loadingComplete) { + Log.err(((Object)this).getClass(), "Cannot change screen -> Application loading not complete!"); + return; + } + if (screenClass == null) { + Log.err(((Object)this).getClass(), "Cannot change screen -> Received empty screen class!"); + return; + } + // create new screen on GL thread + Gdx.app.postRunnable(new Runnable() { + + @Override + public void run() { setScreenIfIsDifferent(Utility.getScreenForScreenClass(screenClass), changeScreenEvent.getScreenTransaction()); - } - }); - } + } + }); + } } diff --git a/core/src/cz/nic/tablexia/TablexiaSettings.java b/core/src/cz/nic/tablexia/TablexiaSettings.java index 2b8eb30643771d1b53b3459af7eb91311695093c..6e2404d613f51a319230da6016d9e00380d370d8 100644 --- a/core/src/cz/nic/tablexia/TablexiaSettings.java +++ b/core/src/cz/nic/tablexia/TablexiaSettings.java @@ -17,38 +17,38 @@ import cz.nic.tablexia.util.Utility; public class TablexiaSettings { - private static final int DEFAULT_SCREEN_WIDTH = 1000; - private static final double MAXIMUM_RATIO = 9.0 / 16.0; - private static final int MIN_SCREEN_HEIGHT = (int) (DEFAULT_SCREEN_WIDTH * MAXIMUM_RATIO); - private static final boolean DEBUG_SHOW_BOUNDING_BOXES = true; + private static final int DEFAULT_SCREEN_WIDTH = 1000; + private static final double MAXIMUM_RATIO = 9.0 / 16.0; + private static final int MIN_SCREEN_HEIGHT = (int) (DEFAULT_SCREEN_WIDTH * MAXIMUM_RATIO); + private static final boolean DEBUG_SHOW_BOUNDING_BOXES = true; - public static final Class<? extends AbstractTablexiaScreen<?>> INITIAL_SCREEN = GameMenuScreen.class; + public static final Class<? extends AbstractTablexiaScreen<?>> INITIAL_SCREEN = GameMenuScreen.class; - public static final String LOCALE_KEY = "locale"; - public static final String CURRENT_SCREEN_KEY = "current_screen"; + public static final String LOCALE_KEY = "locale"; + public static final String CURRENT_SCREEN_KEY = "current_screen"; - private static final String IDE_BUILD_APPLICATION_ID = "cz.nic.tablexia.debug"; - private static final String IDE_BUILD_VERSION_NAME = "IDE-BUILD"; + private static final String IDE_BUILD_APPLICATION_ID = "cz.nic.tablexia.debug"; + private static final String IDE_BUILD_VERSION_NAME = "IDE-BUILD"; - private final BuildType BUILD_TYPE; - private final String VERSION_NAME; - private final String APPLICATION_ID; + private final BuildType BUILD_TYPE; + private final String VERSION_NAME; + private final String APPLICATION_ID; - private Preferences preferences; - private LocaleDefinition systemLocale; - private LocaleDefinition selectedLocale; + private Preferences preferences; + private LocaleDefinition systemLocale; + private LocaleDefinition selectedLocale; public static enum BuildType { - RELEASE ("release", false, Log.TablexiaLogLevel.ERROR), - DEBUG ("debug", true, Log.TablexiaLogLevel.DEBUG); + RELEASE("release", false, Log.TablexiaLogLevel.ERROR), + DEBUG("debug", true, Log.TablexiaLogLevel.DEBUG); private final static BuildType FALLBACK_VARIANT = BuildType.DEBUG; - private final String key; - private final boolean isDebug; - private Log.TablexiaLogLevel logLevel; + private final String key; + private final boolean isDebug; + private Log.TablexiaLogLevel logLevel; private BuildType(String key, boolean isDebug, Log.TablexiaLogLevel logLevel) { this.key = key; @@ -65,7 +65,7 @@ public class TablexiaSettings { } public static BuildType getBuildTypeForKey(String key) { - for(BuildType buildType : BuildType.values()) { + for (BuildType buildType : BuildType.values()) { if (buildType.key.equals(key)) { return buildType; } @@ -76,12 +76,12 @@ public class TablexiaSettings { public enum LocaleDefinition { - SYSTEM (null, "system", ApplicationTextManager.LANGUAGE_SYSTEM), - cs_CZ (new Locale("cs", "CZ"), "cs_CZ", ApplicationTextManager.LANGUAGE_CZECH), - sk_SK (new Locale("sk", "SK"), "sk_SK", ApplicationTextManager.LANGUAGE_SLOVAK); + SYSTEM(null, "system", ApplicationTextManager.LANGUAGE_SYSTEM), + cs_CZ(new Locale("cs", "CZ"), "cs_CZ", ApplicationTextManager.LANGUAGE_CZECH), + sk_SK(new Locale("sk", "SK"), "sk_SK", ApplicationTextManager.LANGUAGE_SLOVAK); - public final static LocaleDefinition DEFAULT_LOCALE = LocaleDefinition.cs_CZ; - private final static LocaleDefinition FALLBACK_VARIANT = LocaleDefinition.SYSTEM; + public final static LocaleDefinition DEFAULT_LOCALE = LocaleDefinition.cs_CZ; + private final static LocaleDefinition FALLBACK_VARIANT = LocaleDefinition.SYSTEM; private final Locale locale; private final String localeKey; @@ -111,7 +111,7 @@ public class TablexiaSettings { } public static LocaleDefinition getLocaleDefinitionForKey(String key) { - for(LocaleDefinition localeDefinition: LocaleDefinition.values()) { + for (LocaleDefinition localeDefinition : LocaleDefinition.values()) { if (localeDefinition.localeKey.equals(key)) { return localeDefinition; } @@ -120,7 +120,7 @@ public class TablexiaSettings { } public static LocaleDefinition getLocaleDefinitionForLocale(Locale locale) { - for(LocaleDefinition localeDefinition: LocaleDefinition.values()) { + for (LocaleDefinition localeDefinition : LocaleDefinition.values()) { if (localeDefinition.locale != null && localeDefinition.locale.equals(locale)) { return localeDefinition; } @@ -135,10 +135,10 @@ public class TablexiaSettings { private static TablexiaSettings instance; private TablexiaSettings(BuildType buildType, Locale systemLocale, String versionName, String applicationId) { - BUILD_TYPE = buildType; - VERSION_NAME = versionName == null ? IDE_BUILD_VERSION_NAME : versionName; - APPLICATION_ID = applicationId == null ? IDE_BUILD_APPLICATION_ID : applicationId; - this.systemLocale = LocaleDefinition.getLocaleDefinitionForLocale(systemLocale); + BUILD_TYPE = buildType; + VERSION_NAME = versionName == null ? IDE_BUILD_VERSION_NAME : versionName; + APPLICATION_ID = applicationId == null ? IDE_BUILD_APPLICATION_ID : applicationId; + this.systemLocale = LocaleDefinition.getLocaleDefinitionForLocale(systemLocale); } public static TablexiaSettings getInstance() { @@ -172,8 +172,8 @@ public class TablexiaSettings { //////////////////////////// LIBGDX PREFERENCES public void loadPreferences(boolean resetState) { - preferences = Gdx.app.getPreferences(getApplicationId()); - selectedLocale = LocaleDefinition.getLocaleDefinitionForKey(preferences.getString(LOCALE_KEY)); + preferences = Gdx.app.getPreferences(getApplicationId()); + selectedLocale = LocaleDefinition.getLocaleDefinitionForKey(preferences.getString(LOCALE_KEY)); if (resetState) { preferences.remove(CURRENT_SCREEN_KEY); preferences.flush(); diff --git a/core/src/cz/nic/tablexia/game/difficulty/GameDifficulty.java b/core/src/cz/nic/tablexia/game/difficulty/GameDifficulty.java index 519a293597b4dba2a10470452701918cf32b9d5f..64111b5a60c11361cc2d3605d9b6167a9a5f9846 100644 --- a/core/src/cz/nic/tablexia/game/difficulty/GameDifficulty.java +++ b/core/src/cz/nic/tablexia/game/difficulty/GameDifficulty.java @@ -19,6 +19,8 @@ package cz.nic.tablexia.game.difficulty; +import cz.nic.tablexia.loader.application.ApplicationTextManager; + /** * Game difficulty types * @@ -26,33 +28,28 @@ package cz.nic.tablexia.game.difficulty; */ public enum GameDifficulty { - // TODO use string resources - EASY(1), - MEDIUM(2), - HARD(3); + EASY ("gamedifficulty_easy"), + MEDIUM ("gamedifficulty_medium"), + HARD ("gamedifficulty_hard"); + + private String descriptionResourceKey; - private int descriptionResourceId; - private GameDifficulty(int descriptionResourceId) { - this.descriptionResourceId = descriptionResourceId; + private GameDifficulty(String descriptionResourceKey) { + this.descriptionResourceKey = descriptionResourceKey; } - /** - * Returns id of description for current difficulty - * - * @return id of description string resource - */ - public int getDescriptionResourceId() { - return descriptionResourceId; + public String getTextDescription() { + return ApplicationTextManager.getInstance().getText(getDescriptionResourceKey()); } /** - * Returns string key for intent extra + * Returns key of description for current difficulty * - * @return string key for intent extra + * @return key of description string resource */ - public static String getIntentKey() { - return GameDifficulty.class.getName(); + public String getDescriptionResourceKey() { + return descriptionResourceKey; } /** diff --git a/core/src/cz/nic/tablexia/screen/ScreenDefinition.java b/core/src/cz/nic/tablexia/screen/ScreenDefinition.java new file mode 100644 index 0000000000000000000000000000000000000000..ba280e041995f5fd3a6ce0c40f98f4ad8c53683c --- /dev/null +++ b/core/src/cz/nic/tablexia/screen/ScreenDefinition.java @@ -0,0 +1,66 @@ +package cz.nic.tablexia.screen; + +import net.engio.mbassy.listener.Handler; + +import cz.nic.tablexia.Tablexia.ChangeScreenEvent; +import cz.nic.tablexia.TablexiaApplication.ScreenTransaction; +import cz.nic.tablexia.bus.ApplicationBus; +import cz.nic.tablexia.menu.MainMenuDefinition; +import cz.nic.tablexia.screen.about.AboutScreen; +import cz.nic.tablexia.screen.encyclopedia.EncyclopediaScreen; +import cz.nic.tablexia.screen.gamemenu.GameMenuScreen; +import cz.nic.tablexia.screen.halloffame.HallOfFameScreen; +import cz.nic.tablexia.screen.loader.LoaderScreen; +import cz.nic.tablexia.screen.preferences.PreferencesScreen; +import cz.nic.tablexia.screen.statistics.StatisticsScreen; + +public enum ScreenDefinition { + LOADER(LoaderScreen.class, null), + GAME_MENU(GameMenuScreen.class, null), + HALL_OF_FAME(HallOfFameScreen.class, MainMenuDefinition.HALL_OF_FAME), + STATISTICS(StatisticsScreen.class, MainMenuDefinition.STATISTICS), + ENCYCLOPEDIA(EncyclopediaScreen.class, MainMenuDefinition.ENCYCLOPEDIA), + PREFERENCES(PreferencesScreen.class, MainMenuDefinition.PREFERENCES), + ABOUT_APPLICATION(AboutScreen.class, MainMenuDefinition.ABOUT_APPLICATION); + + private Class<? extends AbstractTablexiaScreen<?>> screenClass; + private MainMenuDefinition mainMenuDefinition; + private static Object messageHandler; + + private ScreenDefinition(Class<? extends AbstractTablexiaScreen<?>> screenClass, MainMenuDefinition mainMenuDefinition) { + this.screenClass = screenClass; + this.mainMenuDefinition = mainMenuDefinition; + } + + public MainMenuDefinition getMainMenuDefinition() { + return mainMenuDefinition; + } + + public Class<? extends AbstractTablexiaScreen<?>> getScreenClass() { + return screenClass; + } + + public void performMenuAction() { + ApplicationBus.getInstance().publishAsync(new ChangeScreenEvent(screenClass, ScreenTransaction.FADE)); + } + + public static ScreenDefinition getScreenDefinitionForMainMenuDefinition(MainMenuDefinition mainMenuDefinition) { + for (ScreenDefinition screenDefinition : ScreenDefinition.values()) { + if (screenDefinition.getMainMenuDefinition() == mainMenuDefinition) { + return screenDefinition; + } + } + return null; + } + + public static void initBus() { + messageHandler = new Object() { + + @Handler + public void handleChangeScreenEvent(MainMenuDefinition mainMenuDefinition) { + ScreenDefinition.getScreenDefinitionForMainMenuDefinition(mainMenuDefinition).performMenuAction(); + } + }; + ApplicationBus.getInstance().subscribe(messageHandler); + } +} diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuAssets.java b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuAssets.java index 20c688976647c8d9fee6bc7f61d7ffa8400acad7..b86aed5b550d6f2d11691d0e92fecf2919608033 100644 --- a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuAssets.java +++ b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuAssets.java @@ -23,6 +23,7 @@ public final class GameMenuAssets { public static final String OFFICE = GAMEMENU_PATH + "office.jpg"; public static final String OFFICE_CLICKMAP = GAMEMENU_PATH + "clickablemap.png"; public static final String OFFICE_HELP = GAMEMENU_PATH + "helplayer.png"; + public static final String OVERLAY = GAMEMENU_PATH + "overlay.png"; public static final String VIGNETTE = GAMEMENU_PATH + "vignetting.png"; public static final String DESK = GAMEMENU_PATH + "desk.png"; public static final String ENCYCLOPEDIA_PRESSED = GAMEMENU_PATH + "encyclopedia_pressed.png"; @@ -54,6 +55,7 @@ public final class GameMenuAssets { textures.add(DESK); textures.add(OFFICE_HELP); textures.add(VIGNETTE); + textures.add(OVERLAY); textures.add(DIFF_BAR); textures.add(DIFF_THUMB); diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java index cf74b3063c55015955de3cfc55624d40e2d53335..9fc0efbecdf452775909c568aac8124bc80b94d1 100644 --- a/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java +++ b/core/src/cz/nic/tablexia/screen/gamemenu/GameMenuScreen.java @@ -1,22 +1,24 @@ package cz.nic.tablexia.screen.gamemenu; +import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.scenes.scene2d.Touchable; import com.badlogic.gdx.scenes.scene2d.ui.Image; +import net.engio.mbassy.listener.Handler; + import java.util.List; +import cz.nic.tablexia.bus.ApplicationBus; import cz.nic.tablexia.game.GameDefinition; import cz.nic.tablexia.screen.AbstractTablexiaScreen; import cz.nic.tablexia.screen.gamemenu.pages.GameMenuPage; import cz.nic.tablexia.screen.gamemenu.pages.OfficeMenuPage; -import cz.nic.tablexia.util.Log; import cz.nic.tablexia.util.ui.ViewPager; public class GameMenuScreen extends AbstractTablexiaScreen<Void> { private ViewPager vp; - @Override protected void prepareScreenTextureAssetNames(List<String> textureFileNames) { super.prepareScreenTextureAssetNames(textureFileNames); @@ -26,7 +28,6 @@ public class GameMenuScreen extends AbstractTablexiaScreen<Void> { @Override protected void screenLoaded() { vp = new ViewPager(); - vp.addPage(new OfficeMenuPage(this)); for (GameDefinition gd : GameDefinition.getActiveGames()) { @@ -34,15 +35,25 @@ public class GameMenuScreen extends AbstractTablexiaScreen<Void> { } vp.setSize(getStage().getWidth(), getStage().getHeight()); - - Log.info(getClass().getName(), "ViewPager size: " + getStage().getWidth() + "x" + getStage().getHeight()); - getStage().addActor(vp); - Image im = new Image(getTexture(GameMenuAssets.VIGNETTE)); im.setTouchable(Touchable.disabled); im.setSize(getStage().getWidth(), getStage().getHeight()); getStage().addActor(im); + + ApplicationBus.getInstance().subscribe(this); + } + + @Handler + public void handleShowStreet(OfficeMenuPage.ShowStreetEvent message) { + vp.scrollToPage(1); + } + + @Override + public Texture getTexture(String textureName) { + Texture texture = super.getTexture(textureName); + texture.setFilter(Texture.TextureFilter.Linear, Texture.TextureFilter.Linear); + return texture; } } 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 f276a04f6f90a54ff9b7df2226d0049405a3ab19..4243708a5b2a8bd5fc84901fe1311da13d747289 100644 --- a/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java +++ b/core/src/cz/nic/tablexia/screen/gamemenu/pages/GameMenuPage.java @@ -3,6 +3,7 @@ package cz.nic.tablexia.screen.gamemenu.pages; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Texture; import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.graphics.g2d.BitmapFont; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.InputEvent; import com.badlogic.gdx.scenes.scene2d.InputListener; @@ -10,10 +11,13 @@ import com.badlogic.gdx.scenes.scene2d.actions.AlphaAction; import com.badlogic.gdx.scenes.scene2d.actions.MoveToAction; import com.badlogic.gdx.scenes.scene2d.ui.Image; import com.badlogic.gdx.scenes.scene2d.ui.Label; +import com.badlogic.gdx.scenes.scene2d.ui.Stack; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; import cz.nic.tablexia.TablexiaSettings; import cz.nic.tablexia.game.GameDefinition; +import cz.nic.tablexia.game.difficulty.GameDifficulty; +import cz.nic.tablexia.loader.application.ApplicationTextManager; import cz.nic.tablexia.screen.AbstractTablexiaScreen; import cz.nic.tablexia.screen.gamemenu.GameMenuAssets; import cz.nic.tablexia.util.ui.ViewPager; @@ -26,6 +30,9 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener { private GameDefinition game; private float diffEasyX, diffMediumX, diffHardX; + private Actor diffEasy, diffMedium, diffHard; + private Stack diffStack; + private GameDifficulty gameDifficulty = GameDifficulty.EASY; private float scrollOffset = TablexiaSettings.getDefaultScreenWidth(); // hack to keep paralax layers out of picture before scrolled for first time @@ -33,7 +40,6 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener { super(screen); this.game = game; - // Title Texture title = getScreen().getTexture(GameMenuAssets.getResourcePath(game, GameMenuAssets.GameMenuLayers.TITLE)); Image titleImage = new Image(title); @@ -68,7 +74,6 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener { addActor(startDownButton); addActor(startButton); - startButton.addListener(new ClickListener() { @Override public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { @@ -93,53 +98,59 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener { } }); - // Labels for diffuculty slider - Label.LabelStyle labelStyle = new Label.LabelStyle(screen.getDefaultRegularFont(), Color.BLACK); - // TODO load texts from GameDifficulty enum - Label easy = new Label("Easy", labelStyle); - Label medium = new Label("Medium", labelStyle); - Label hard = new Label("Hard", labelStyle); - - easy.setPosition((screen.getStage().getWidth() / 2) - (screen.getStage().getWidth() * 0.1f) - easy.getWidth() / 2, screen.getStage().getHeight() * 0.0f); - medium.setPosition((screen.getStage().getWidth() / 2) - medium.getWidth() / 2, screen.getStage().getHeight() * 0.0f); - hard.setPosition((screen.getStage().getWidth() / 2) + (screen.getStage().getWidth() * 0.1f) - hard.getWidth() / 2, screen.getStage().getHeight() * 0.0f); - - addActor(easy); - addActor(medium); - addActor(hard); + final Texture diff = getScreen().getTexture(GameMenuAssets.DIFF_THUMB_EASY); + float diffY = screen.getStage().getHeight() * 0.06f; + float diffHeight = screen.getStage().getHeight() * 0.12f; + float diffWidth = diffHeight * ((float) diff.getWidth() / (float) diff.getHeight()); // Difficulty bar Texture diffBar = getScreen().getTexture(GameMenuAssets.DIFF_BAR); Image diffBarImage = new Image(diffBar); - int diffBarHeight = (int) (screen.getStage().getHeight() * 0.05); + int diffBarHeight = (int) (screen.getStage().getHeight() * 0.04f); int diffBarWidth = (int) (diffBarHeight * ((float) diffBar.getWidth() / (float) diffBar.getHeight())); int diffBarX = (int) screen.getStage().getWidth() / 2 - diffBarWidth / 2; - int diffBarY = (int) (screen.getStage().getHeight() * 0.1 - diffBarHeight); + int diffBarY = (int) (screen.getStage().getHeight() * 0.1); diffBarImage.setPosition(diffBarX, diffBarY); diffBarImage.setSize(diffBarWidth, diffBarHeight); addActor(diffBarImage); - // Difficulty button + diffMediumX = (screen.getStage().getWidth() / 2) - (diffWidth / 2); + diffEasyX = diffMediumX - (diffBarWidth / 2) + (diffWidth * 0.1f); + diffHardX = diffMediumX + (diffBarWidth / 2) - (diffWidth * 0.1f); + // Labels for diffuculty slider + BitmapFont font = screen.getDefaultBoldFont(); + font.setScale(0.5f); + Label.LabelStyle labelStyle = new Label.LabelStyle(font, Color.BLACK); - final Texture diff = getScreen().getTexture(GameMenuAssets.DIFF_THUMB_MEDIUM); - final Image diffButton = new Image(diff); - float diffY = 0; - float diffHeight = screen.getStage().getHeight() * 0.15f; - float diffWidth = diffHeight * ((float) diff.getWidth() / (float) diff.getHeight()); + Label easy = new Label(GameDifficulty.EASY.getTextDescription(), labelStyle); + Label medium = new Label(GameDifficulty.MEDIUM.getTextDescription(), labelStyle); + Label hard = new Label(GameDifficulty.HARD.getTextDescription(), labelStyle); - diffEasyX = (screen.getStage().getWidth() / 2 - diffWidth / 2 + (int) (diffWidth * 0.1f)) - diffBarWidth / 2; - diffMediumX = screen.getStage().getWidth() / 2 - diffWidth / 2 + (int) (diffWidth * 0.1f); - diffHardX = (screen.getStage().getWidth() / 2 - diffWidth / 2 + (int) (diffWidth * 0.1f)) + diffBarWidth / 2; + float labelY = screen.getStage().getHeight() * 0.06f; + float labelAddX = diffWidth / 2; + easy.setPosition(diffEasyX + labelAddX - easy.getWidth() / 2, labelY); + medium.setPosition(diffMediumX + labelAddX - medium.getWidth() / 2, labelY); + hard.setPosition(diffHardX + labelAddX - hard.getWidth() / 2, labelY); - float diffX = diffEasyX; - diffButton.setSize(diffWidth, diffHeight); - diffButton.setPosition(diffX, diffY); - addActor(diffButton); + addActor(easy); + addActor(medium); + addActor(hard); + // Difficulty button + diffStack = new Stack(); + diffStack.addActor(diffEasy = new Image(diff)); + diffStack.addActor(diffMedium = new Image(getScreen().getTexture(GameMenuAssets.DIFF_THUMB_MEDIUM))); + diffStack.addActor(diffHard = new Image(getScreen().getTexture(GameMenuAssets.DIFF_THUMB_HARD))); + + float diffX = diffEasyX; + diffStack.setSize(diffWidth, diffHeight); + diffStack.setPosition(diffX, diffY); + addActor(diffStack); + setDifficulty(gameDifficulty); - diffButton.addListener(new InputListener() { + diffStack.addListener(new InputListener() { float lastX; @Override @@ -153,41 +164,117 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener { @Override public void touchDragged(InputEvent event, float x, float y, int pointer) { super.touchDragged(event, x, y, pointer); - float bx = diffButton.getX() + (x - lastX); + float bx = diffStack.getX() + (x - lastX); if (bx >= diffEasyX && bx <= diffHardX) { - diffButton.setPosition(bx, diffButton.getY()); + diffStack.setPosition(bx, diffStack.getY()); } + showDifficulty(getDifficulty()); event.stop(); } @Override public void touchUp(InputEvent event, float x, float y, int pointer, int button) { super.touchUp(event, x, y, pointer, button); - float bx = diffButton.getX() + (x - lastX); - MoveToAction ma = new MoveToAction(); - if (bx < diffMediumX) { - if ((diffEasyX + ((diffMediumX - diffEasyX) / 2)) > bx) { - ma.setPosition(diffEasyX, diffButton.getY()); - } else { - ma.setPosition(diffMediumX, diffButton.getY()); - } - } else { - if ((diffMediumX + ((diffHardX - diffMediumX) / 2)) > bx) { - ma.setPosition(diffMediumX, diffButton.getY()); - } else { - ma.setPosition(diffHardX, diffButton.getY()); - } + float bx = diffStack.getX() + (x - lastX); + + GameDifficulty newDiff = getDifficulty(); + setDifficulty(newDiff); + if (gameDifficulty != newDiff) { + difficultyChanged(newDiff); } - diffButton.addAction(ma); event.stop(); } }); } + /** + * Change selector to custom difficulty + * + * @param difficulty + */ + public void setDifficulty(GameDifficulty difficulty) { + showDifficulty(difficulty); + MoveToAction ma = new MoveToAction(); + switch (difficulty) { + case EASY: + ma.setPosition(diffEasyX, diffStack.getY()); + break; + case MEDIUM: + ma.setPosition(diffMediumX, diffStack.getY()); + break; + case HARD: + ma.setPosition(diffHardX, diffStack.getY()); + break; + } + diffStack.addAction(ma); + if (gameDifficulty != difficulty) { + difficultyChanged(difficulty); + } + } + + /** + * Called when difficulty is changed + * + * @param difficulty + */ + public void difficultyChanged(GameDifficulty difficulty) { + gameDifficulty = difficulty; + // TODO + } + + /** + * Get nearest difficulty from current slider position + * + * @return + */ + private GameDifficulty getDifficulty() { + float bx = diffStack.getX(); + if (bx < diffMediumX) { + if ((diffEasyX + ((diffMediumX - diffEasyX) / 2)) > bx) { + return GameDifficulty.EASY; + } else { + return GameDifficulty.MEDIUM; + } + } else { + if ((diffMediumX + ((diffHardX - diffMediumX) / 2)) > bx) { + return GameDifficulty.MEDIUM; + } else { + return GameDifficulty.HARD; + } + } + } + + /** + * Check difficulty image and display corresponding image + * + * @param diff + */ + private void showDifficulty(GameDifficulty diff) { + diffEasy.setVisible(false); + diffMedium.setVisible(false); + diffHard.setVisible(false); + + switch (diff) { + case EASY: + diffEasy.setVisible(true); + break; + case MEDIUM: + diffMedium.setVisible(true); + break; + case HARD: + diffHard.setVisible(true); + break; + } + } + @Override public void draw(Batch batch, float parentAlpha) { // Paralax layers // Back layer travels half the speed of scroll + // needed to make fade work + Color color = new Color(this.getColor().r, this.getColor().g, this.getColor().b, this.getColor().a * parentAlpha); + batch.setColor(color); + Texture back = getScreen().getTexture(GameMenuAssets.getResourcePath(game, GameMenuAssets.GameMenuLayers.BACK)); float scrollHalf = (Math.abs(scrollOffset / 2) / getWidth()) * back.getWidth(); int srcX = (int) scrollHalf; @@ -200,7 +287,6 @@ public class GameMenuPage extends MenuPage implements ViewPager.ScrollListener { batch.draw(getScreen().getTexture(GameMenuAssets.getResourcePath(game, GameMenuAssets.GameMenuLayers.MID)), getX(), getY(), getWidth(), getHeight()); // Foreground layer travels faster and could be wider than screen. Needs to be clipped - Texture fore = getScreen().getTexture(GameMenuAssets.getResourcePath(game, GameMenuAssets.GameMenuLayers.FORE)); float foreWidth = (getHeight() / fore.getHeight()) * fore.getWidth(); batch.draw(fore, getX() - ((foreWidth - getWidth()) / 2) + (scrollOffset / 2), getY(), foreWidth, getHeight()); diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/pages/MenuPage.java b/core/src/cz/nic/tablexia/screen/gamemenu/pages/MenuPage.java index 5711a8cf1962a3f0685b53602a81a358e73b6547..b00985334a213070b600ce10ac26199bf07632da 100644 --- a/core/src/cz/nic/tablexia/screen/gamemenu/pages/MenuPage.java +++ b/core/src/cz/nic/tablexia/screen/gamemenu/pages/MenuPage.java @@ -1,5 +1,6 @@ package cz.nic.tablexia.screen.gamemenu.pages; +import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.Group; import cz.nic.tablexia.screen.AbstractTablexiaScreen; @@ -17,4 +18,12 @@ public abstract class MenuPage extends Group { protected AbstractTablexiaScreen getScreen() { return screen; } + + @Override + public void setDebug(boolean enabled) { + super.setDebug(enabled); + for (Actor a : getChildren()) { + a.setDebug(enabled); + } + } } diff --git a/core/src/cz/nic/tablexia/screen/gamemenu/pages/OfficeMenuPage.java b/core/src/cz/nic/tablexia/screen/gamemenu/pages/OfficeMenuPage.java index 980cefa66dbf75e034f19c08fc7b12a0a7bc061c..5d1e9667f1fdc26801512f63343ee0e9881d6b9f 100644 --- a/core/src/cz/nic/tablexia/screen/gamemenu/pages/OfficeMenuPage.java +++ b/core/src/cz/nic/tablexia/screen/gamemenu/pages/OfficeMenuPage.java @@ -3,13 +3,21 @@ package cz.nic.tablexia.screen.gamemenu.pages; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.graphics.Pixmap; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.g2d.Batch; +import com.badlogic.gdx.scenes.scene2d.Group; import com.badlogic.gdx.scenes.scene2d.InputEvent; +import com.badlogic.gdx.scenes.scene2d.InputListener; +import com.badlogic.gdx.scenes.scene2d.actions.Actions; +import com.badlogic.gdx.scenes.scene2d.ui.Image; +import com.badlogic.gdx.scenes.scene2d.ui.Stack; import com.badlogic.gdx.scenes.scene2d.utils.ClickListener; +import cz.nic.tablexia.Tablexia; +import cz.nic.tablexia.TablexiaApplication; +import cz.nic.tablexia.bus.ApplicationBus; import cz.nic.tablexia.menu.MainMenuDefinition; import cz.nic.tablexia.screen.AbstractTablexiaScreen; import cz.nic.tablexia.screen.gamemenu.GameMenuAssets; +import cz.nic.tablexia.screen.profile.ProfileScreen; import cz.nic.tablexia.util.Log; /** @@ -23,34 +31,120 @@ public class OfficeMenuPage extends MenuPage { public static final Color ENCYCLOPEDIA_COLOR = Color.BLACK; public static final Color PROFILE_COLOR = Color.BLUE; + private Group help; + + private Image hallOfFame; + private Image statistics; + private Image encyclopedia; + private Image street; + private Image profile; + public OfficeMenuPage(AbstractTablexiaScreen screen) { super(screen); + createImageStack(); + + // TODO show help layer button + + addListener(new InputListener() { + private Color downColor; + + @Override + public boolean touchDown(InputEvent event, float x, float y, int pointer, int button) { + super.touchDown(event, x, y, pointer, button); + Color color = getTouchedColor(x, y); + downColor = color; + help.addAction(Actions.fadeOut(0.5f)); + if (color.equals(ENCYCLOPEDIA_COLOR)) { + encyclopedia.setVisible(true); + } else if (color.equals(STATISTICS_COLOR)) { + statistics.setVisible(true); + } else if (color.equals(HALLOFFAME_COLOR)) { + hallOfFame.setVisible(true); + } else if (color.equals(STREET_COLOR)) { + street.setVisible(true); + } else if (color.equals(PROFILE_COLOR)) { + profile.setVisible(true); + } else { + return false; + } + return true; + } + + @Override + public void touchUp(InputEvent event, float x, float y, int pointer, int button) { + super.touchUp(event, x, y, pointer, button); + Log.info(((Object) this).getClass().getName(), "Touch up "); + hideAllActions(); + } + }); + addListener(new ClickListener() { @Override public void clicked(InputEvent event, float x, float y) { super.clicked(event, x, y); - Color color = getTouchedColor(x, y); - if (color.equals(ENCYCLOPEDIA_COLOR)) { - MainMenuDefinition.ENCYCLOPEDIA.performAction(); + ApplicationBus.getInstance().publishAsync(MainMenuDefinition.ENCYCLOPEDIA); } else if (color.equals(STATISTICS_COLOR)) { - MainMenuDefinition.STATISTICS.performAction(); + ApplicationBus.getInstance().publishAsync(MainMenuDefinition.STATISTICS); } else if (color.equals(HALLOFFAME_COLOR)) { - MainMenuDefinition.HALL_OF_FAME.performAction(); + ApplicationBus.getInstance().publishAsync(MainMenuDefinition.HALL_OF_FAME); } else if (color.equals(STREET_COLOR)) { - Log.info(((Object) this).getClass().getName(), "Clicked STREET_COLOR"); - // TODO go to street + ApplicationBus.getInstance().publishAsync(new ShowStreetEvent()); } else if (color.equals(PROFILE_COLOR)) { - // TODO show profile - } else { - // TODO hide help layer + ApplicationBus.getInstance().publishAsync(new Tablexia.ChangeScreenEvent(ProfileScreen.class, TablexiaApplication.ScreenTransaction.FADE)); } + hideAllActions(); } }); } + private void createImageStack() { + Stack stack = new Stack(); + stack.setSize(getScreen().getStage().getWidth(), getScreen().getStage().getHeight()); + stack.setPosition(0, 0); + addActor(stack); + + stack.addActor(createImage(GameMenuAssets.OFFICE)); + stack.addActor(street = createImage(GameMenuAssets.DOOR_PRESSED)); + stack.addActor(encyclopedia = createImage(GameMenuAssets.ENCYCLOPEDIA_PRESSED)); + stack.addActor(statistics = createImage(GameMenuAssets.STATISTICS_PRESSED)); + stack.addActor(hallOfFame = createImage(GameMenuAssets.HALLOFFAME_PRESSED)); + stack.addActor(createImage(GameMenuAssets.DESK)); + stack.addActor(profile = createImage(GameMenuAssets.PROFILE_PRESSED)); + + hideAllActions(); + + help = new Stack(); + help.setSize(getScreen().getStage().getWidth(), getScreen().getStage().getHeight()); + help.setPosition(0, 0); + stack.addActor(help); + Image overlay = createImage(GameMenuAssets.OVERLAY); + overlay.getColor().a = 0.5f; + help.addActor(overlay); + help.addActor(createImage(GameMenuAssets.OFFICE_HELP)); + } + + private void hideAllActions() { + profile.setVisible(false); + street.setVisible(false); + encyclopedia.setVisible(false); + statistics.setVisible(false); + hallOfFame.setVisible(false); + + } + + /** + * Helper method for creating image instances + * + * @param texture + * @return + */ + private Image createImage(String texture) { + Image image = new Image(getScreen().getTexture(texture)); + return image; + } private Color getTouchedColor(float x, float y) { Texture clickmap = getScreen().getTexture(GameMenuAssets.OFFICE_CLICKMAP); @@ -61,28 +155,12 @@ public class OfficeMenuPage extends MenuPage { Pixmap pixmap = clickmap.getTextureData().consumePixmap(); int clickX = (int) (x / getWidth() * clickmap.getWidth()); int clickY = clickmap.getHeight() - (int) (y / getHeight() * clickmap.getHeight()); - - Log.info(((Object) this).getClass().getName(), "Color map " + clickmap.getWidth() + ":" + clickmap.getHeight() + " at " + clickX + ": " + clickY); - return new Color(pixmap.getPixel(clickX, clickY)); } - - @Override - public void draw(Batch batch, float parentAlpha) { - batch.disableBlending(); - batch.draw(getScreen().getTexture(GameMenuAssets.OFFICE), getX(), getY(), getWidth(), getHeight()); - batch.enableBlending(); - - batch.draw(getScreen().getTexture(GameMenuAssets.OFFICE_HELP), getX(), getY(), getWidth(), getHeight()); - batch.draw(getScreen().getTexture(GameMenuAssets.PROFILE_PRESSED), getX(), getY(), getWidth(), getHeight()); - batch.draw(getScreen().getTexture(GameMenuAssets.DOOR_PRESSED), getX(), getY(), getWidth(), getHeight()); - batch.draw(getScreen().getTexture(GameMenuAssets.ENCYCLOPEDIA_PRESSED), getX(), getY(), getWidth(), getHeight()); - batch.draw(getScreen().getTexture(GameMenuAssets.STATISTICS_PRESSED), getX(), getY(), getWidth(), getHeight()); - batch.draw(getScreen().getTexture(GameMenuAssets.HALLOFFAME_PRESSED), getX(), getY(), getWidth(), getHeight()); - - batch.draw(getScreen().getTexture(GameMenuAssets.DESK), getX(), getY(), getWidth(), getHeight()); - - batch.draw(getScreen().getTexture(GameMenuAssets.OFFICE_HELP), getX(), getY(), getWidth(), getHeight()); + /** + * Event fired by clicking on door telling viewpager to page to first game + */ + public static class ShowStreetEvent implements ApplicationBus.ApplicationEvent { } } diff --git a/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java b/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java index e4d29a8d6a8938db0ea0210113b5a316c91fc856..028ef30f78f473ed5e5cb051788116be96987bdc 100644 --- a/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java +++ b/core/src/cz/nic/tablexia/screen/loader/LoaderScreen.java @@ -1,9 +1,8 @@ package cz.nic.tablexia.screen.loader; import com.badlogic.gdx.graphics.Texture; -import com.badlogic.gdx.graphics.Texture.TextureFilter; -import com.badlogic.gdx.graphics.g2d.Batch; -import com.badlogic.gdx.scenes.scene2d.Actor; +import com.badlogic.gdx.scenes.scene2d.actions.Actions; +import com.badlogic.gdx.scenes.scene2d.ui.Image; import java.util.List; @@ -13,27 +12,11 @@ import cz.nic.tablexia.screen.AbstractTablexiaScreen; public class LoaderScreen extends AbstractTablexiaScreen<Void> { private static final String LOADER_BACKGROUND = "gfx/screen_loader_background.jpg"; + private static final String LOADER_SMALL_HAND = "gfx/screen_loader_smallhand.png"; + private static final String LOADER_BIG_HAND = "gfx/screen_loader_bighand.png"; - private LoaderBackground background; private Texture backgroundTexture; - private class LoaderBackground extends Actor { - - - public LoaderBackground() { - backgroundTexture = getTexture(LOADER_BACKGROUND); - backgroundTexture.setFilter(TextureFilter.Linear, TextureFilter.Linear); - } - - @Override - public void draw(Batch batch, float parentAlpha) { - batch.disableBlending(); - batch.draw(backgroundTexture, 0, 0, getWidth(), getHeight()); - batch.enableBlending(); - } - - } - public LoaderScreen() { super(false, false, TablexiaAssetManager.StorageType.INTERNAL); } @@ -41,16 +24,29 @@ public class LoaderScreen extends AbstractTablexiaScreen<Void> { @Override protected void prepareScreenTextureAssetNames(List<String> textureFileNames) { textureFileNames.add(LOADER_BACKGROUND); + textureFileNames.add(LOADER_SMALL_HAND); + textureFileNames.add(LOADER_BIG_HAND); } @Override protected void screenLoaded() { - background = new LoaderBackground(); + Image background = new Image(getTexture(LOADER_BACKGROUND)); + background.setPosition(0, 0); + background.setSize(getStage().getWidth(), getStage().getHeight()); getStage().addActor(background); - } - @Override - public void screenResized(int width, int height) { - background.setSize(width, height); + Image smallhand = new Image(getTexture(LOADER_SMALL_HAND)); + smallhand.setPosition(getStage().getWidth()*0.22f, getStage().getHeight() * 0.64f); + smallhand.setSize(getStage().getWidth()*0.01f, getStage().getHeight()*0.06f); + getStage().addActor(smallhand); + smallhand.setOrigin(smallhand.getWidth()/2,0); + smallhand.addAction(Actions.forever(Actions.rotateBy(-360, 6))); + + Image bighand = new Image(getTexture(LOADER_BIG_HAND)); + bighand.setPosition(getStage().getWidth()*0.22f, getStage().getHeight() * 0.64f); + bighand.setSize(getStage().getWidth()*0.01f, getStage().getHeight()*0.06f); + getStage().addActor(bighand); + bighand.setOrigin(bighand.getWidth()/2,0); + bighand.addAction(Actions.forever(Actions.rotateBy(-360, 0.5f))); } } diff --git a/core/src/cz/nic/tablexia/util/ui/ViewPager.java b/core/src/cz/nic/tablexia/util/ui/ViewPager.java index 55403797fb53f895318510ae2ce53f2ec7adfb16..63c279437d71f12586b139866d752714ad05d645 100644 --- a/core/src/cz/nic/tablexia/util/ui/ViewPager.java +++ b/core/src/cz/nic/tablexia/util/ui/ViewPager.java @@ -14,11 +14,7 @@ import com.badlogic.gdx.utils.Array; public class ViewPager extends ScrollPane { private boolean wasPanDragFling = false; - private float lastX; - - private float pageSpacing; - private Table content; public ViewPager() { @@ -82,7 +78,7 @@ public class ViewPager extends ScrollPane { } - if(lastX != getWidget().getX()){ + if (lastX != getWidget().getX()) { float scrollX = -getWidget().getX(); Array<Actor> pages = content.getChildren(); float pageX = 0; @@ -103,7 +99,7 @@ public class ViewPager extends ScrollPane { sl.onScroll(pageX - scrollX); } } - if(pageX == scrollX){ + if (pageX == scrollX) { if (a instanceof ScrollListener) { ScrollListener sl = (ScrollListener) a; sl.onScrolledToPage(); @@ -117,7 +113,6 @@ public class ViewPager extends ScrollPane { } - @Override @Deprecated public void setWidget(Actor widget) { @@ -135,13 +130,28 @@ public class ViewPager extends ScrollPane { } } - public void setPageSpacing(float pageSpacing) { - if (content != null) { - content.defaults().space(pageSpacing); - for (Cell cell : content.getCells()) { - cell.space(pageSpacing); + /** + * Smooth scroll to child with given index + * + * @param page + */ + public void scrollToPage(int page) { + // TODO cleanup + if (content.getChildren().size <= page) { + throw new IllegalArgumentException("Page index " + page + " out of bounds"); + } + final float width = getWidth(); + final float maxX = getMaxX(); + + float pageX = 0; + float pageWidth = 0; + if (content.getChildren().size > 0) { + for (int i = 0; i <= page; i++) { + Actor a = content.getChildren().get(i); + pageX = a.getX(); + pageWidth = a.getWidth(); } - content.invalidate(); + setScrollX(MathUtils.clamp(pageX - (width - pageWidth) / 2, 0, maxX)); } }