fix bottom bar in song select when button images are not sized as expected
also new images for default skin
BIN
res/selection-mode-over.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
res/selection-mode.png
Normal file
After Width: | Height: | Size: 484 B |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 1.7 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 767 B |
Before Width: | Height: | Size: 5.0 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 3.6 KiB After Width: | Height: | Size: 918 B |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 1.8 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 696 B |
|
@ -232,6 +232,8 @@ public enum GameImage {
|
||||||
MOD_AUTOPILOT ("selection-mod-relax2", "png", false, false),
|
MOD_AUTOPILOT ("selection-mod-relax2", "png", false, false),
|
||||||
|
|
||||||
// Selection Buttons
|
// Selection Buttons
|
||||||
|
SELECTION_MODE ("selection-mode", "png", false, false),
|
||||||
|
SELECTION_MODE_OVERLAY ("selection-mode-over", "png", false, false),
|
||||||
SELECTION_MODS ("selection-mods", "png", false, false),
|
SELECTION_MODS ("selection-mods", "png", false, false),
|
||||||
SELECTION_MODS_OVERLAY ("selection-mods-over", "png", false, false),
|
SELECTION_MODS_OVERLAY ("selection-mods-over", "png", false, false),
|
||||||
SELECTION_RANDOM ("selection-random", "png", false, false),
|
SELECTION_RANDOM ("selection-random", "png", false, false),
|
||||||
|
|
|
@ -48,6 +48,7 @@ import itdelatrisu.opsu.ui.UI;
|
||||||
import itdelatrisu.opsu.ui.animations.AnimatedValue;
|
import itdelatrisu.opsu.ui.animations.AnimatedValue;
|
||||||
import itdelatrisu.opsu.ui.animations.AnimationEquation;
|
import itdelatrisu.opsu.ui.animations.AnimationEquation;
|
||||||
|
|
||||||
|
import java.awt.Point;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.nio.file.StandardWatchEventKinds;
|
import java.nio.file.StandardWatchEventKinds;
|
||||||
|
@ -67,6 +68,7 @@ import org.newdawn.slick.gui.TextField;
|
||||||
import yugecin.opsudance.core.InstanceContainer;
|
import yugecin.opsudance.core.InstanceContainer;
|
||||||
import yugecin.opsudance.core.state.ComplexOpsuState;
|
import yugecin.opsudance.core.state.ComplexOpsuState;
|
||||||
|
|
||||||
|
import static itdelatrisu.opsu.GameImage.*;
|
||||||
import static org.lwjgl.input.Keyboard.*;
|
import static org.lwjgl.input.Keyboard.*;
|
||||||
import static yugecin.opsudance.core.InstanceContainer.*;
|
import static yugecin.opsudance.core.InstanceContainer.*;
|
||||||
import static yugecin.opsudance.options.Options.*;
|
import static yugecin.opsudance.options.Options.*;
|
||||||
|
@ -98,7 +100,7 @@ public class SongMenu extends ComplexOpsuState {
|
||||||
private static final int SEARCH_TRANSITION_TIME = 250;
|
private static final int SEARCH_TRANSITION_TIME = 250;
|
||||||
|
|
||||||
/** Line width of the header/footer divider. */
|
/** Line width of the header/footer divider. */
|
||||||
private static final int DIVIDER_LINE_WIDTH = 4;
|
private static final int DIVIDER_LINE_WIDTH = 3;
|
||||||
|
|
||||||
/** Song node class representing an BeatmapSetNode and file index. */
|
/** Song node class representing an BeatmapSetNode and file index. */
|
||||||
private static class SongNode {
|
private static class SongNode {
|
||||||
|
@ -160,7 +162,7 @@ public class SongMenu extends ComplexOpsuState {
|
||||||
private BeatmapSetNode hoverIndex = null;
|
private BeatmapSetNode hoverIndex = null;
|
||||||
|
|
||||||
/** The selection buttons. */
|
/** The selection buttons. */
|
||||||
private MenuButton selectModsButton, selectRandomButton, selectMapOptionsButton;
|
private MenuButton selectModeButton, selectModsButton, selectRandomButton, selectMapOptionsButton;
|
||||||
|
|
||||||
/** The search textfield. */
|
/** The search textfield. */
|
||||||
private TextField searchTextField;
|
private TextField searchTextField;
|
||||||
|
@ -320,14 +322,15 @@ public class SongMenu extends ComplexOpsuState {
|
||||||
|
|
||||||
components.clear();
|
components.clear();
|
||||||
|
|
||||||
|
final float footerHeight = height * 0.116666666666f;
|
||||||
|
|
||||||
// header/footer coordinates
|
// header/footer coordinates
|
||||||
headerY = height * 0.0075f + GameImage.MENU_MUSICNOTE.getHeight() +
|
headerY = height * 0.0075f + GameImage.MENU_MUSICNOTE.getHeight() +
|
||||||
Fonts.BOLD.getLineHeight() + Fonts.DEFAULT.getLineHeight() +
|
Fonts.BOLD.getLineHeight() + Fonts.DEFAULT.getLineHeight() +
|
||||||
Fonts.SMALL.getLineHeight();
|
Fonts.SMALL.getLineHeight();
|
||||||
footerY = height - GameImage.SELECTION_MODS.getHeight();
|
footerY = height - footerHeight;
|
||||||
|
|
||||||
// footer logo coordinates
|
// footer logo coordinates
|
||||||
float footerHeight = height - footerY;
|
|
||||||
footerLogoSize = footerHeight * 3.25f;
|
footerLogoSize = footerHeight * 3.25f;
|
||||||
Image logo = GameImage.MENU_LOGO.getImage();
|
Image logo = GameImage.MENU_LOGO.getImage();
|
||||||
logo = logo.getScaledCopy(footerLogoSize / logo.getWidth());
|
logo = logo.getScaledCopy(footerLogoSize / logo.getWidth());
|
||||||
|
@ -400,24 +403,17 @@ public class SongMenu extends ComplexOpsuState {
|
||||||
components.add(searchTextField);
|
components.add(searchTextField);
|
||||||
|
|
||||||
// selection buttons
|
// selection buttons
|
||||||
Image selectionMods = GameImage.SELECTION_MODS.getImage();
|
// TODO: the origin should be bottomleft or something
|
||||||
int selectButtonsWidth = selectionMods.getWidth();
|
float selectX = width * (displayContainer.isWidescreen() ? 0.164f : 0.1875f);
|
||||||
int selectButtonsHeight = selectionMods.getHeight();
|
final float footerButtonWidth = footerHeight * 0.84f;
|
||||||
if (selectButtonsHeight < 20) {
|
selectModeButton = new MenuButton(SELECTION_MODE_OVERLAY, selectX, footerY);
|
||||||
selectButtonsHeight = 100;
|
selectX += footerHeight + 2;
|
||||||
}
|
selectModsButton = new MenuButton(SELECTION_MODS_OVERLAY, selectX, footerY);
|
||||||
if (selectButtonsWidth < 20) {
|
selectX += footerButtonWidth;
|
||||||
selectButtonsWidth = 100;
|
selectRandomButton = new MenuButton(SELECTION_RANDOM_OVERLAY, selectX, footerY);
|
||||||
}
|
selectX += footerButtonWidth;
|
||||||
float selectX = width * 0.183f + selectButtonsWidth / 2f;
|
selectMapOptionsButton = new MenuButton(SELECTION_OPTIONS_OVERLAY, selectX, footerY);
|
||||||
float selectY = height - selectButtonsHeight / 2f;
|
selectModeButton.setHoverFade(0f);
|
||||||
float selectOffset = selectButtonsWidth * 1.05f;
|
|
||||||
selectModsButton = new MenuButton(GameImage.SELECTION_MODS_OVERLAY.getImage(),
|
|
||||||
selectX, selectY);
|
|
||||||
selectRandomButton = new MenuButton(GameImage.SELECTION_RANDOM_OVERLAY.getImage(),
|
|
||||||
selectX + selectOffset, selectY);
|
|
||||||
selectMapOptionsButton = new MenuButton(GameImage.SELECTION_OPTIONS_OVERLAY.getImage(),
|
|
||||||
selectX + selectOffset * 2f, selectY);
|
|
||||||
selectModsButton.setHoverFade(0f);
|
selectModsButton.setHoverFade(0f);
|
||||||
selectRandomButton.setHoverFade(0f);
|
selectRandomButton.setHoverFade(0f);
|
||||||
selectMapOptionsButton.setHoverFade(0f);
|
selectMapOptionsButton.setHoverFade(0f);
|
||||||
|
@ -528,14 +524,12 @@ public class SongMenu extends ComplexOpsuState {
|
||||||
}
|
}
|
||||||
|
|
||||||
// top/bottom bars
|
// top/bottom bars
|
||||||
g.setColor(Colors.BLACK_ALPHA);
|
g.setColor(Color.black);
|
||||||
g.fillRect(0, 0, width, headerY);
|
g.fillRect(0, 0, width, headerY);
|
||||||
g.fillRect(0, footerY, width, height - footerY);
|
g.fillRect(0, footerY, width, height - footerY);
|
||||||
g.setColor(Colors.BLUE_DIVIDER);
|
g.setColor(Colors.BLUE_DIVIDER);
|
||||||
g.setLineWidth(DIVIDER_LINE_WIDTH);
|
g.fillRect(0, headerY, width, DIVIDER_LINE_WIDTH);
|
||||||
g.drawLine(0, headerY, width, headerY);
|
g.fillRect(0, footerY, width, DIVIDER_LINE_WIDTH);
|
||||||
g.drawLine(0, footerY, width, footerY);
|
|
||||||
g.resetLineWidth();
|
|
||||||
|
|
||||||
// footer logo (pulsing)
|
// footer logo (pulsing)
|
||||||
Float position = MusicController.getBeatProgress();
|
Float position = MusicController.getBeatProgress();
|
||||||
|
@ -620,11 +614,18 @@ public class SongMenu extends ComplexOpsuState {
|
||||||
}
|
}
|
||||||
|
|
||||||
// selection buttons
|
// selection buttons
|
||||||
GameImage.SELECTION_MODS.getImage().drawCentered(selectModsButton.getX(), selectModsButton.getY());
|
Point c;
|
||||||
|
c = selectModeButton.bottomLeft();
|
||||||
|
SELECTION_MODE.getImage().draw(c.x, c.y - SELECTION_MODE.getHeight());
|
||||||
|
selectModeButton.draw();
|
||||||
|
c = selectModsButton.bottomLeft();
|
||||||
|
SELECTION_MODS.getImage().draw(c.x, c.y - SELECTION_MODS.getHeight());
|
||||||
selectModsButton.draw();
|
selectModsButton.draw();
|
||||||
GameImage.SELECTION_RANDOM.getImage().drawCentered(selectRandomButton.getX(), selectRandomButton.getY());
|
c = selectRandomButton.bottomLeft();
|
||||||
|
SELECTION_RANDOM.getImage().draw(c.x, c.y - SELECTION_RANDOM.getHeight());
|
||||||
selectRandomButton.draw();
|
selectRandomButton.draw();
|
||||||
GameImage.SELECTION_OPTIONS.getImage().drawCentered(selectMapOptionsButton.getX(), selectMapOptionsButton.getY());
|
c = selectMapOptionsButton.bottomLeft();
|
||||||
|
SELECTION_OPTIONS.getImage().draw(c.x, c.y - SELECTION_OPTIONS.getHeight());
|
||||||
selectMapOptionsButton.draw();
|
selectMapOptionsButton.draw();
|
||||||
|
|
||||||
// group tabs
|
// group tabs
|
||||||
|
@ -725,6 +726,7 @@ public class SongMenu extends ComplexOpsuState {
|
||||||
reloadThread = null;
|
reloadThread = null;
|
||||||
}
|
}
|
||||||
backButton.hoverUpdate();
|
backButton.hoverUpdate();
|
||||||
|
selectModeButton.hoverUpdate(delta, mouseX, mouseY);
|
||||||
selectModsButton.hoverUpdate(delta, mouseX, mouseY);
|
selectModsButton.hoverUpdate(delta, mouseX, mouseY);
|
||||||
selectRandomButton.hoverUpdate(delta, mouseX, mouseY);
|
selectRandomButton.hoverUpdate(delta, mouseX, mouseY);
|
||||||
selectMapOptionsButton.hoverUpdate(delta, mouseX, mouseY);
|
selectMapOptionsButton.hoverUpdate(delta, mouseX, mouseY);
|
||||||
|
@ -912,7 +914,10 @@ public class SongMenu extends ComplexOpsuState {
|
||||||
}
|
}
|
||||||
|
|
||||||
// selection buttons
|
// selection buttons
|
||||||
if (selectModsButton.contains(x, y)) {
|
if (selectModeButton.contains(x, y)) {
|
||||||
|
barNotifs.send("There are no other modes available.");
|
||||||
|
return true;
|
||||||
|
} else if (selectModsButton.contains(x, y)) {
|
||||||
this.keyPressed(KEY_F1, '\0');
|
this.keyPressed(KEY_F1, '\0');
|
||||||
return true;
|
return true;
|
||||||
} else if (selectRandomButton.contains(x, y)) {
|
} else if (selectRandomButton.contains(x, y)) {
|
||||||
|
@ -1262,6 +1267,7 @@ public class SongMenu extends ComplexOpsuState {
|
||||||
super.enter();
|
super.enter();
|
||||||
|
|
||||||
UI.enter();
|
UI.enter();
|
||||||
|
selectModeButton.resetHover();
|
||||||
selectModsButton.resetHover();
|
selectModsButton.resetHover();
|
||||||
selectRandomButton.resetHover();
|
selectRandomButton.resetHover();
|
||||||
selectMapOptionsButton.resetHover();
|
selectMapOptionsButton.resetHover();
|
||||||
|
|
|
@ -18,10 +18,13 @@
|
||||||
|
|
||||||
package itdelatrisu.opsu.ui;
|
package itdelatrisu.opsu.ui;
|
||||||
|
|
||||||
|
import itdelatrisu.opsu.GameImage;
|
||||||
import itdelatrisu.opsu.Utils;
|
import itdelatrisu.opsu.Utils;
|
||||||
import itdelatrisu.opsu.ui.animations.AnimatedValue;
|
import itdelatrisu.opsu.ui.animations.AnimatedValue;
|
||||||
import itdelatrisu.opsu.ui.animations.AnimationEquation;
|
import itdelatrisu.opsu.ui.animations.AnimationEquation;
|
||||||
|
|
||||||
|
import java.awt.Point;
|
||||||
|
|
||||||
import org.newdawn.slick.Animation;
|
import org.newdawn.slick.Animation;
|
||||||
import org.newdawn.slick.Color;
|
import org.newdawn.slick.Color;
|
||||||
import org.newdawn.slick.Font;
|
import org.newdawn.slick.Font;
|
||||||
|
@ -112,6 +115,14 @@ public class MenuButton {
|
||||||
this.yRadius = img.getHeight() / 2f;
|
this.yRadius = img.getHeight() / 2f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MenuButton(GameImage img, float topleftX, float topleftY) {
|
||||||
|
this.img = img.getImage();
|
||||||
|
this.xRadius = img.getWidth() / 2f;
|
||||||
|
this.yRadius = img.getHeight() / 2f;
|
||||||
|
this.x = topleftX + this.xRadius;
|
||||||
|
this.y = topleftY + this.yRadius;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new button from a 3-part Image.
|
* Creates a new button from a 3-part Image.
|
||||||
* @param imgCenter the center image
|
* @param imgCenter the center image
|
||||||
|
@ -165,6 +176,10 @@ public class MenuButton {
|
||||||
* Returns the center y coordinate.
|
* Returns the center y coordinate.
|
||||||
*/
|
*/
|
||||||
public float getY() { return y; }
|
public float getY() { return y; }
|
||||||
|
|
||||||
|
public Point bottomLeft() {
|
||||||
|
return new Point((int) (x - xRadius), (int) (y + yRadius));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the scale multiplier, from the hover effect, used to draw the button.
|
* Returns the scale multiplier, from the hover effect, used to draw the button.
|
||||||
|
|