diff --git a/src/itdelatrisu/opsu/GameImage.java b/src/itdelatrisu/opsu/GameImage.java index ac6ad301..5cbb9daa 100644 --- a/src/itdelatrisu/opsu/GameImage.java +++ b/src/itdelatrisu/opsu/GameImage.java @@ -204,13 +204,100 @@ public enum GameImage { SCORE_COMMA ("score-comma.png"), SCORE_DOT ("score-dot.png"), SCORE_PERCENT ("score-percent.png"), - SCORE_X ("score-x.png"); + SCORE_X ("score-x.png"), + + // Non-Game Components + MENU_BACK ("menu-back.png", false) { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy((h * 0.1f) / img.getHeight()); + } + }, + MENU_BUTTON_BG ("menu-button-background.png", false) { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy(w / 2, h / 6); + } + }, + MENU_TAB ("selection-tab.png", false) { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy((h * 0.033f) / img.getHeight()); + } + }, + MENU_SEARCH ("search.png", false) { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy(Utils.FONT_BOLD.getLineHeight() * 2f / img.getHeight()); + } + }, + MENU_OPTIONS ("options.png", false) { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy(Utils.FONT_BOLD.getLineHeight() * 2f / img.getHeight()); + } + }, + MENU_MUSICNOTE ("music-note.png", false) { + @Override + protected Image process_sub(Image img, int w, int h) { + int r = (int) (Utils.FONT_LARGE.getLineHeight() * 0.75f + Utils.FONT_DEFAULT.getLineHeight()); + return img.getScaledCopy(r, r); + } + }, + MENU_LOADER ("loader.png", false) { + @Override + protected Image process_sub(Image img, int w, int h) { + int r = (int) (Utils.FONT_LARGE.getLineHeight() * 0.75f + Utils.FONT_DEFAULT.getLineHeight()); + return img.getScaledCopy(r / 48f); + } + }, + MENU_LOGO ("logo.png", false) { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy((h / 1.2f) / img.getHeight()); + } + }, + // TODO: scale MENU_PLAY and MENU_EXIT + MENU_PlAY ("menu-play.png", false), + MENU_EXIT ("menu-exit.png", false), + MENU_BUTTON_MID ("button-middle.png", false) { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy(w / 2, img.getHeight()); + } + }, + MENU_BUTTON_LEFT ("button-left.png", false), + MENU_BUTTON_RIGHT ("button-right.png", false), + + MUSIC_PLAY ("music-play.png", false), + MUSIC_PAUSE ("music-pause.png", false), + MUSIC_NEXT ("music-next.png", false), + MUSIC_PREVIOUS ("music-previous.png", false), + + RANKING_RETRY ("ranking-retry.png", false) { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy((h * 0.15f) / img.getHeight()); + } + }, + RANKING_EXIT ("ranking-back.png", false) { + @Override + protected Image process_sub(Image img, int w, int h) { + return img.getScaledCopy((h * 0.15f) / img.getHeight()); + } + }; /** * The file name. */ private String filename; + /** + * Whether or not the image is related to gameplay. + * Game images are skinnable per beatmap, while other images are not. + */ + private boolean gameImage; + /** * The default image. */ @@ -237,13 +324,30 @@ public enum GameImage { } /** - * Constructor. + * Game image constructor. * @param filename the image file name */ GameImage(String filename) { this.filename = filename; + this.gameImage = true; } + /** + * Game image constructor. + * @param filename the image file name + * @param gameImage whether or not the image is related to gameplay + */ + GameImage(String filename, boolean gameImage) { + this.filename = filename; + this.gameImage = gameImage; + } + + /** + * Returns whether or not the image is related to gameplay. + * @return true if game image + */ + public boolean isGameImage() { return gameImage; } + /** * Returns the image associated with this resource. * The skin image takes priority over the default image. diff --git a/src/itdelatrisu/opsu/SongSort.java b/src/itdelatrisu/opsu/SongSort.java index 1865ade3..cf6a7aad 100644 --- a/src/itdelatrisu/opsu/SongSort.java +++ b/src/itdelatrisu/opsu/SongSort.java @@ -178,12 +178,13 @@ public enum SongSort { * @param width the container width * @param height the container height */ - public void init(Image img, int width, int height) { + public void init(int width, int height) { + Image tab = GameImage.MENU_TAB.getImage(); float buttonX = width * 0.6f; - float tabOffset = (width - buttonX - img.getWidth()) / (SIZE - 1); - this.tab = new MenuButton(img, - (buttonX + (img.getWidth() / 2f)) + (id * tabOffset), - (height * 0.15f) - (img.getHeight() / 2f) - 2f + float tabOffset = (width - buttonX - tab.getWidth()) / (SIZE - 1); + this.tab = new MenuButton(tab, + (buttonX + (tab.getWidth() / 2f)) + (id * tabOffset), + (height * 0.15f) - (tab.getHeight() / 2f) - 2f ); } diff --git a/src/itdelatrisu/opsu/Utils.java b/src/itdelatrisu/opsu/Utils.java index e8d807a7..6b83e8cc 100644 --- a/src/itdelatrisu/opsu/Utils.java +++ b/src/itdelatrisu/opsu/Utils.java @@ -88,11 +88,6 @@ public class Utils { */ private static MenuButton backButton; - /** - * Tab image (shared by other states). - */ - private static Image tab; - /** * Cursor image and trail. */ @@ -188,20 +183,6 @@ public class Utils { Log.error("Failed to load fonts.", e); } - // tab image - tab = new Image("selection-tab.png"); - float tabScale = (height * 0.033f) / tab.getHeight(); - tab = tab.getScaledCopy(tabScale); - - // back button - Image back = new Image("menu-back.png"); - float scale = (height * 0.1f) / back.getHeight(); - back = back.getScaledCopy(scale); - backButton = new MenuButton(back, - back.getWidth() / 2f, - height - (back.getHeight() / 2f)); - backButton.setHoverDir(MenuButton.Expand.UP_RIGHT); - // set default game images GameImage.init(width, height); for (GameImage img : GameImage.values()) { @@ -215,13 +196,15 @@ public class Utils { // initialize sorts for (SongSort sort : SongSort.values()) - sort.init(tab, width, height); - } + sort.init(width, height); - /** - * Returns the 'selection-tab' image. - */ - public static Image getTabImage() { return tab; } + // back button + Image back = GameImage.MENU_BACK.getImage(); + backButton = new MenuButton(back, + back.getWidth() / 2f, + height - (back.getHeight() / 2f)); + backButton.setHoverDir(MenuButton.Expand.UP_RIGHT); + } /** * Returns the 'menu-back' MenuButton. diff --git a/src/itdelatrisu/opsu/states/Game.java b/src/itdelatrisu/opsu/states/Game.java index e4817c6f..7ef94aa6 100644 --- a/src/itdelatrisu/opsu/states/Game.java +++ b/src/itdelatrisu/opsu/states/Game.java @@ -858,7 +858,7 @@ public class Game extends BasicGameState { // set images File parent = osu.getFile().getParentFile(); for (GameImage img : GameImage.values()) { - if (img.setSkinImage(parent)) + if (img.isGameImage() && img.setSkinImage(parent)) img.process(); } diff --git a/src/itdelatrisu/opsu/states/GameRanking.java b/src/itdelatrisu/opsu/states/GameRanking.java index 11fe35f3..18713c2f 100644 --- a/src/itdelatrisu/opsu/states/GameRanking.java +++ b/src/itdelatrisu/opsu/states/GameRanking.java @@ -18,6 +18,7 @@ package itdelatrisu.opsu.states; +import itdelatrisu.opsu.GameImage; import itdelatrisu.opsu.GameMod; import itdelatrisu.opsu.GameScore; import itdelatrisu.opsu.MenuButton; @@ -80,11 +81,8 @@ public class GameRanking extends BasicGameState { int height = container.getHeight(); // buttons - Image retry = new Image("ranking-retry.png"); - Image exit = new Image("ranking-back.png"); - float scale = (height * 0.15f) / retry.getHeight(); - retry = retry.getScaledCopy(scale); - exit = exit.getScaledCopy(scale); + Image retry = GameImage.RANKING_RETRY.getImage(); + Image exit = GameImage.RANKING_EXIT.getImage(); retryButton = new MenuButton(retry, width - (retry.getWidth() / 2f), (height * 0.97f) - (exit.getHeight() * 1.5f) diff --git a/src/itdelatrisu/opsu/states/MainMenu.java b/src/itdelatrisu/opsu/states/MainMenu.java index a6fb7851..0ea2aa95 100644 --- a/src/itdelatrisu/opsu/states/MainMenu.java +++ b/src/itdelatrisu/opsu/states/MainMenu.java @@ -18,6 +18,7 @@ package itdelatrisu.opsu.states; +import itdelatrisu.opsu.GameImage; import itdelatrisu.opsu.MenuButton; import itdelatrisu.opsu.Opsu; import itdelatrisu.opsu.OsuFile; @@ -125,14 +126,15 @@ public class MainMenu extends BasicGameState { int height = container.getHeight(); // initialize buttons + // TODO: clean this up, scale in GameImage.process_sub() Image logoImg = new Image("logo.png"); float buttonScale = (height / 1.2f) / logoImg.getHeight(); - Image logoImgScaled = logoImg.getScaledCopy(buttonScale); + Image logoImgScaled = GameImage.MENU_LOGO.getImage(); logo = new MenuButton(logoImgScaled, width / 2f, height / 2f); logo.setHoverScale(1.05f); - Image playImg = new Image("menu-play.png"); - Image exitImg = new Image("menu-exit.png"); + Image playImg = GameImage.MENU_PlAY.getImage(); + Image exitImg = GameImage.MENU_EXIT.getImage(); playImg = playImg.getScaledCopy((logoImg.getWidth() * 0.83f) / playImg.getWidth()); exitImg = exitImg.getScaledCopy((logoImg.getWidth() * 0.66f) / exitImg.getWidth()); float exitOffset = (playImg.getWidth() - exitImg.getWidth()) / 3f; @@ -148,10 +150,10 @@ public class MainMenu extends BasicGameState { // initialize music buttons int musicWidth = 48; int musicHeight = 30; - musicPlay = new MenuButton(new Image("music-play.png"), width - (2 * musicWidth), musicHeight); - musicPause = new MenuButton(new Image("music-pause.png"), width - (2 * musicWidth), musicHeight); - musicNext = new MenuButton(new Image("music-next.png"), width - musicWidth, musicHeight); - musicPrevious = new MenuButton(new Image("music-previous.png"), width - (3 * musicWidth), musicHeight); + musicPlay = new MenuButton(GameImage.MUSIC_PLAY.getImage(), width - (2 * musicWidth), musicHeight); + musicPause = new MenuButton(GameImage.MUSIC_PAUSE.getImage(), width - (2 * musicWidth), musicHeight); + musicNext = new MenuButton(GameImage.MUSIC_NEXT.getImage(), width - musicWidth, musicHeight); + musicPrevious = new MenuButton(GameImage.MUSIC_PREVIOUS.getImage(), width - (3 * musicWidth), musicHeight); musicPlay.setHoverScale(1.5f); musicPause.setHoverScale(1.5f); musicNext.setHoverScale(1.5f); diff --git a/src/itdelatrisu/opsu/states/MainMenuExit.java b/src/itdelatrisu/opsu/states/MainMenuExit.java index f9e73b66..6329de4a 100644 --- a/src/itdelatrisu/opsu/states/MainMenuExit.java +++ b/src/itdelatrisu/opsu/states/MainMenuExit.java @@ -18,6 +18,7 @@ package itdelatrisu.opsu.states; +import itdelatrisu.opsu.GameImage; import itdelatrisu.opsu.MenuButton; import itdelatrisu.opsu.Opsu; import itdelatrisu.opsu.Utils; @@ -72,10 +73,9 @@ public class MainMenuExit extends BasicGameState { centerOffset = width / 18f; // initialize buttons - Image button = new Image("button-middle.png"); - Image buttonL = new Image("button-left.png"); - Image buttonR = new Image("button-right.png"); - button = button.getScaledCopy(width / 2, button.getHeight()); + Image button = GameImage.MENU_BUTTON_MID.getImage(); + Image buttonL = GameImage.MENU_BUTTON_LEFT.getImage(); + Image buttonR = GameImage.MENU_BUTTON_RIGHT.getImage(); yesButton = new MenuButton(button, buttonL, buttonR, width / 2f + centerOffset, height * 0.2f ); diff --git a/src/itdelatrisu/opsu/states/Options.java b/src/itdelatrisu/opsu/states/Options.java index 3debb39f..7535add8 100644 --- a/src/itdelatrisu/opsu/states/Options.java +++ b/src/itdelatrisu/opsu/states/Options.java @@ -18,6 +18,7 @@ package itdelatrisu.opsu.states; +import itdelatrisu.opsu.GameImage; import itdelatrisu.opsu.GameMod; import itdelatrisu.opsu.MenuButton; import itdelatrisu.opsu.Opsu; @@ -434,7 +435,7 @@ public class Options extends BasicGameState { offsetY = (int) (((height * 0.8f) - textY) / maxOptionsScreen); // option tabs - Image tab = Utils.getTabImage(); + Image tab = GameImage.MENU_TAB.getImage(); int subtextWidth = Utils.FONT_DEFAULT.getWidth("Click or drag an option to change it."); float tabX = (width / 50) + (tab.getWidth() / 2f); float tabY = 15 + Utils.FONT_XLARGE.getLineHeight() + (tab.getHeight() / 2f); diff --git a/src/itdelatrisu/opsu/states/SongMenu.java b/src/itdelatrisu/opsu/states/SongMenu.java index 3094f582..f13a6228 100644 --- a/src/itdelatrisu/opsu/states/SongMenu.java +++ b/src/itdelatrisu/opsu/states/SongMenu.java @@ -18,6 +18,7 @@ package itdelatrisu.opsu.states; +import itdelatrisu.opsu.GameImage; import itdelatrisu.opsu.MenuButton; import itdelatrisu.opsu.Opsu; import itdelatrisu.opsu.OsuFile; @@ -112,16 +113,6 @@ public class SongMenu extends BasicGameState { */ private String searchResultString; - /** - * Search icon. - */ - private Image searchIcon; - - /** - * Music note icon. - */ - private Image musicNote; - /** * Loader animation. */ @@ -148,7 +139,7 @@ public class SongMenu extends BasicGameState { int height = container.getHeight(); // song button background & graphics context - Image menuBackground = new Image("menu-button-background.png").getScaledCopy(width / 2, height / 6); + Image menuBackground = GameImage.MENU_BUTTON_BG.getImage(); OsuGroupNode.setBackground(menuBackground); // song button coordinates @@ -161,12 +152,8 @@ public class SongMenu extends BasicGameState { // search searchTimer = 0; searchResultString = "Type to search!"; - - searchIcon = new Image("search.png"); - float iconScale = Utils.FONT_BOLD.getLineHeight() * 2f / searchIcon.getHeight(); - searchIcon = searchIcon.getScaledCopy(iconScale); - - Image tab = Utils.getTabImage(); + Image searchIcon = GameImage.MENU_SEARCH.getImage(); + Image tab = GameImage.MENU_TAB.getImage(); search = new TextField( container, Utils.FONT_DEFAULT, (int) buttonX + (tab.getWidth() / 2) + searchIcon.getWidth(), @@ -180,19 +167,13 @@ public class SongMenu extends BasicGameState { search.setMaxLength(60); // options button - Image optionsIcon = new Image("options.png").getScaledCopy(iconScale); + Image optionsIcon = GameImage.MENU_OPTIONS.getImage(); optionsButton = new MenuButton(optionsIcon, search.getX() - (optionsIcon.getWidth() * 1.5f), search.getY()); optionsButton.setHoverScale(1.75f); - // music note - int musicNoteDim = (int) (Utils.FONT_LARGE.getLineHeight() * 0.75f + Utils.FONT_DEFAULT.getLineHeight()); - musicNote = new Image("music-note.png").getScaledCopy(musicNoteDim, musicNoteDim); - // loader - SpriteSheet spr = new SpriteSheet( - new Image("loader.png").getScaledCopy(musicNoteDim / 48f), - musicNoteDim, musicNoteDim - ); + int loaderDim = GameImage.MENU_MUSICNOTE.getImage().getWidth(); + SpriteSheet spr = new SpriteSheet(GameImage.MENU_LOADER.getImage(), loaderDim, loaderDim); loader = new Animation(spr, 50); } @@ -219,6 +200,7 @@ public class SongMenu extends BasicGameState { // header if (focusNode != null) { + Image musicNote = GameImage.MENU_MUSICNOTE.getImage(); if (MusicController.isTrackLoading()) loader.draw(); else @@ -254,6 +236,7 @@ public class SongMenu extends BasicGameState { SongSort.drawAll(); // search + Image searchIcon = GameImage.MENU_SEARCH.getImage(); Utils.FONT_BOLD.drawString( search.getX(), search.getY() - Utils.FONT_BOLD.getLineHeight(), searchResultString, Color.white diff --git a/src/itdelatrisu/opsu/states/Splash.java b/src/itdelatrisu/opsu/states/Splash.java index 7f4ba318..d4db8506 100644 --- a/src/itdelatrisu/opsu/states/Splash.java +++ b/src/itdelatrisu/opsu/states/Splash.java @@ -18,6 +18,7 @@ package itdelatrisu.opsu.states; +import itdelatrisu.opsu.GameImage; import itdelatrisu.opsu.Opsu; import itdelatrisu.opsu.OsuParser; import itdelatrisu.opsu.OszUnpacker; @@ -42,11 +43,6 @@ import org.newdawn.slick.state.StateBasedGame; * Loads game resources and enters "Main Menu" state. */ public class Splash extends BasicGameState { - /** - * Logo image. - */ - private Image logo; - /** * Whether or not loading has completed. */ @@ -66,19 +62,17 @@ public class Splash extends BasicGameState { throws SlickException { this.container = container; - logo = new Image("logo.png"); - logo = logo.getScaledCopy((container.getHeight() / 1.2f) / logo.getHeight()); - logo.setAlpha(0f); - // load Utils class first (needed in other 'init' methods) Utils.init(container, game); + + GameImage.MENU_LOGO.getImage().setAlpha(0f); } @Override public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException { g.setBackground(Color.black); - logo.drawCentered(container.getWidth() / 2, container.getHeight() / 2); + GameImage.MENU_LOGO.getImage().drawCentered(container.getWidth() / 2, container.getHeight() / 2); // display progress String unpackedFile = OszUnpacker.getCurrentFileName(); @@ -131,9 +125,10 @@ public class Splash extends BasicGameState { } // fade in logo + Image logo = GameImage.MENU_LOGO.getImage(); float alpha = logo.getAlpha(); if (alpha < 1f) - logo.setAlpha(alpha + (delta / 400f)); + logo.setAlpha(alpha + (delta / 500f)); // change states when loading complete if (finished && alpha >= 1f) {