Reduced unnecessary reloading of default images. (follow-up 16afcaf
)
- GameImage now stores both a default image and skin image, returning the skin image whenever available. - Default images are loaded once on startup, instead of before every game. Signed-off-by: Jeffrey Han <itdelatrisu@gmail.com>
This commit is contained in:
parent
16afcaf3e6
commit
06f8dae037
|
@ -134,9 +134,19 @@ public enum GameImage {
|
||||||
private String filename;
|
private String filename;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The associated image.
|
* The default image.
|
||||||
*/
|
*/
|
||||||
private Image img;
|
private Image defaultImage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The beatmap skin image (optional, temporary).
|
||||||
|
*/
|
||||||
|
private Image skinImage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether or not the default image has been scaled.
|
||||||
|
*/
|
||||||
|
private boolean scaled;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructor.
|
* Constructor.
|
||||||
|
@ -146,33 +156,67 @@ public enum GameImage {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the associated image.
|
* Returns the image associated with this resource.
|
||||||
|
* The skin image takes priority over the default image.
|
||||||
*/
|
*/
|
||||||
public Image getImage() { return img; }
|
public Image getImage() {
|
||||||
|
return (skinImage != null) ? skinImage : defaultImage;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets an image.
|
* Sets the image associated with this resource to another image.
|
||||||
|
* The skin image takes priority over the default image.
|
||||||
*/
|
*/
|
||||||
public void setImage(Image img) { this.img = img; }
|
public void setImage(Image img) {
|
||||||
|
if (skinImage != null)
|
||||||
|
this.skinImage = img;
|
||||||
|
else
|
||||||
|
this.defaultImage = img;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets an image.
|
* Sets the default image for this resource.
|
||||||
* Scans the path for the image first, then uses the default image.
|
|
||||||
*/
|
*/
|
||||||
public void setImage(File dir) {
|
public void setDefaultImage() {
|
||||||
|
try {
|
||||||
|
if (defaultImage != null && !defaultImage.isDestroyed())
|
||||||
|
defaultImage.destroy();
|
||||||
|
|
||||||
|
defaultImage = new Image(filename);
|
||||||
|
scaled = false;
|
||||||
|
} catch (SlickException e) {
|
||||||
|
Log.error(String.format("Failed to set default image '%s'.", filename), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the associated skin image.
|
||||||
|
* If the path does not contain the image, the default image is used.
|
||||||
|
*/
|
||||||
|
public void setSkinImage(File dir) {
|
||||||
try {
|
try {
|
||||||
// destroy the existing image, if any
|
// destroy the existing image, if any
|
||||||
if (img != null && !img.isDestroyed())
|
if (skinImage != null && !skinImage.isDestroyed())
|
||||||
img.destroy();
|
skinImage.destroy();
|
||||||
|
|
||||||
// set a new image
|
// set a new image
|
||||||
File file = new File(dir, filename);
|
File file = new File(dir, filename);
|
||||||
if (file.isFile() && !Options.isBeatmapSkinIgnored())
|
if (file.isFile() && !Options.isBeatmapSkinIgnored())
|
||||||
img = new Image(file.getAbsolutePath());
|
skinImage = new Image(file.getAbsolutePath());
|
||||||
else
|
else
|
||||||
img = new Image(filename);
|
skinImage = null;
|
||||||
} catch (SlickException e) {
|
} catch (SlickException e) {
|
||||||
Log.error(String.format("Failed to set image '%s'.", filename), e);
|
Log.error(String.format("Failed to set skin image '%s'.", filename), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns whether or not the image has been scaled.
|
||||||
|
*/
|
||||||
|
public boolean isScaled() { return (skinImage != null) ? false : scaled; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the scaled status of the image.
|
||||||
|
*/
|
||||||
|
public void setScaled() { if (skinImage == null) this.scaled = true; }
|
||||||
}
|
}
|
|
@ -299,11 +299,17 @@ public class GameScore {
|
||||||
}
|
}
|
||||||
|
|
||||||
// scorebar
|
// scorebar
|
||||||
Image bg = GameImage.SCOREBAR_BG.getImage();
|
|
||||||
Image colour = GameImage.SCOREBAR_COLOUR.getImage();
|
|
||||||
int bgWidth = width / 2;
|
int bgWidth = width / 2;
|
||||||
GameImage.SCOREBAR_BG.setImage(bg.getScaledCopy(bgWidth, bg.getHeight()));
|
if (!GameImage.SCOREBAR_BG.isScaled()) {
|
||||||
GameImage.SCOREBAR_COLOUR.setImage(colour.getScaledCopy(bgWidth, colour.getHeight()));
|
Image bg = GameImage.SCOREBAR_BG.getImage();
|
||||||
|
GameImage.SCOREBAR_BG.setImage(bg.getScaledCopy(bgWidth, bg.getHeight()));
|
||||||
|
GameImage.SCOREBAR_BG.setScaled();
|
||||||
|
}
|
||||||
|
if (!GameImage.SCOREBAR_COLOUR.isScaled()) {
|
||||||
|
Image colour = GameImage.SCOREBAR_COLOUR.getImage();
|
||||||
|
GameImage.SCOREBAR_COLOUR.setImage(colour.getScaledCopy(bgWidth, colour.getHeight()));
|
||||||
|
GameImage.SCOREBAR_COLOUR.setScaled();
|
||||||
|
}
|
||||||
|
|
||||||
// default symbol images
|
// default symbol images
|
||||||
defaultSymbols = new Image[10];
|
defaultSymbols = new Image[10];
|
||||||
|
@ -368,16 +374,31 @@ public class GameScore {
|
||||||
gradesSmall[GRADE_D] = GameImage.RANKING_D_SMALL.getImage();
|
gradesSmall[GRADE_D] = GameImage.RANKING_D_SMALL.getImage();
|
||||||
|
|
||||||
// ranking screen elements
|
// ranking screen elements
|
||||||
Image rankingPanel = GameImage.RANKING_PANEL.getImage();
|
if (!GameImage.RANKING_PANEL.isScaled()) {
|
||||||
Image rankingPerfect = GameImage.RANKING_PERFECT.getImage();
|
Image rankingPanel = GameImage.RANKING_PANEL.getImage();
|
||||||
Image rankingTitle = GameImage.RANKING_TITLE.getImage();
|
GameImage.RANKING_PANEL.setImage(rankingPanel.getScaledCopy((height * 0.63f) / rankingPanel.getHeight()));
|
||||||
Image rankingMaxCombo = GameImage.RANKING_MAXCOMBO.getImage();
|
GameImage.RANKING_PANEL.setScaled();
|
||||||
Image rankingAccuracy = GameImage.RANKING_ACCURACY.getImage();
|
}
|
||||||
GameImage.RANKING_PANEL.setImage(rankingPanel.getScaledCopy((height * 0.63f) / rankingPanel.getHeight()));
|
if (!GameImage.RANKING_PERFECT.isScaled()) {
|
||||||
GameImage.RANKING_PERFECT.setImage(rankingPerfect.getScaledCopy((height * 0.16f) / rankingPerfect.getHeight()));
|
Image rankingPerfect = GameImage.RANKING_PERFECT.getImage();
|
||||||
GameImage.RANKING_TITLE.setImage(rankingTitle.getScaledCopy((height * 0.15f) / rankingTitle.getHeight()));
|
GameImage.RANKING_PERFECT.setImage(rankingPerfect.getScaledCopy((height * 0.16f) / rankingPerfect.getHeight()));
|
||||||
GameImage.RANKING_MAXCOMBO.setImage(rankingMaxCombo.getScaledCopy((height * 0.05f) / rankingMaxCombo.getHeight()));
|
GameImage.RANKING_PERFECT.setScaled();
|
||||||
GameImage.RANKING_ACCURACY.setImage(rankingAccuracy.getScaledCopy((height * 0.05f) / rankingAccuracy.getHeight()));
|
}
|
||||||
|
if (!GameImage.RANKING_TITLE.isScaled()) {
|
||||||
|
Image rankingTitle = GameImage.RANKING_TITLE.getImage();
|
||||||
|
GameImage.RANKING_TITLE.setImage(rankingTitle.getScaledCopy((height * 0.15f) / rankingTitle.getHeight()));
|
||||||
|
GameImage.RANKING_TITLE.setScaled();
|
||||||
|
}
|
||||||
|
if (!GameImage.RANKING_MAXCOMBO.isScaled()) {
|
||||||
|
Image rankingMaxCombo = GameImage.RANKING_MAXCOMBO.getImage();
|
||||||
|
GameImage.RANKING_MAXCOMBO.setImage(rankingMaxCombo.getScaledCopy((height * 0.05f) / rankingMaxCombo.getHeight()));
|
||||||
|
GameImage.RANKING_MAXCOMBO.setScaled();
|
||||||
|
}
|
||||||
|
if (!GameImage.RANKING_ACCURACY.isScaled()) {
|
||||||
|
Image rankingAccuracy = GameImage.RANKING_ACCURACY.getImage();
|
||||||
|
GameImage.RANKING_ACCURACY.setImage(rankingAccuracy.getScaledCopy((height * 0.05f) / rankingAccuracy.getHeight()));
|
||||||
|
GameImage.RANKING_ACCURACY.setScaled();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -127,14 +127,14 @@ public class Utils {
|
||||||
container.getInput().enableKeyRepeat();
|
container.getInput().enableKeyRepeat();
|
||||||
container.setAlwaysRender(true);
|
container.setAlwaysRender(true);
|
||||||
|
|
||||||
// hide the cursor
|
// set the cursor
|
||||||
try {
|
try {
|
||||||
|
// hide the native cursor
|
||||||
Cursor emptyCursor = new Cursor(1, 1, 0, 0, 1, BufferUtils.createIntBuffer(1), null);
|
Cursor emptyCursor = new Cursor(1, 1, 0, 0, 1, BufferUtils.createIntBuffer(1), null);
|
||||||
container.setMouseCursor(emptyCursor, 0, 0);
|
container.setMouseCursor(emptyCursor, 0, 0);
|
||||||
} catch (LWJGLException e) {
|
} catch (LWJGLException e) {
|
||||||
Log.error("Failed to set the cursor.", e);
|
Log.error("Failed to set the cursor.", e);
|
||||||
}
|
}
|
||||||
|
|
||||||
loadCursor();
|
loadCursor();
|
||||||
|
|
||||||
// create fonts
|
// create fonts
|
||||||
|
@ -157,6 +157,10 @@ public class Utils {
|
||||||
FONT_MEDIUM = new TrueTypeFont(font.deriveFont(fontBase * 3 / 2), false);
|
FONT_MEDIUM = new TrueTypeFont(font.deriveFont(fontBase * 3 / 2), false);
|
||||||
FONT_SMALL = new TrueTypeFont(font.deriveFont(fontBase), false);
|
FONT_SMALL = new TrueTypeFont(font.deriveFont(fontBase), false);
|
||||||
|
|
||||||
|
// set default game images
|
||||||
|
for (GameImage o : GameImage.values())
|
||||||
|
o.setDefaultImage();
|
||||||
|
|
||||||
// tab image
|
// tab image
|
||||||
tab = new Image("selection-tab.png");
|
tab = new Image("selection-tab.png");
|
||||||
float tabScale = (height * 0.033f) / tab.getHeight();
|
float tabScale = (height * 0.033f) / tab.getHeight();
|
||||||
|
|
|
@ -754,34 +754,53 @@ public class Game extends BasicGameState {
|
||||||
// set images
|
// set images
|
||||||
File parent = osu.getFile().getParentFile();
|
File parent = osu.getFile().getParentFile();
|
||||||
for (GameImage o : GameImage.values())
|
for (GameImage o : GameImage.values())
|
||||||
o.setImage(parent);
|
o.setSkinImage(parent);
|
||||||
|
|
||||||
// skip button
|
// skip button
|
||||||
Image skip = GameImage.SKIP.getImage();
|
Image skip = GameImage.SKIP.getImage();
|
||||||
float skipScale = (height * 0.1f) / skip.getHeight();
|
if (!GameImage.SKIP.isScaled()) {
|
||||||
skip = skip.getScaledCopy(skipScale);
|
float skipScale = (height * 0.1f) / skip.getHeight();
|
||||||
|
skip = skip.getScaledCopy(skipScale);
|
||||||
|
GameImage.SKIP.setScaled();
|
||||||
|
}
|
||||||
skipButton = new GUIMenuButton(skip,
|
skipButton = new GUIMenuButton(skip,
|
||||||
width - (skip.getWidth() / 2f),
|
width - (skip.getWidth() / 2f),
|
||||||
height - (skip.getHeight() / 2f));
|
height - (skip.getHeight() / 2f));
|
||||||
|
|
||||||
// countdown
|
// countdown
|
||||||
Image countdownReady = GameImage.COUNTDOWN_READY.getImage();
|
|
||||||
Image countdown3 = GameImage.COUNTDOWN_3.getImage();
|
|
||||||
Image countdown2 = GameImage.COUNTDOWN_2.getImage();
|
|
||||||
Image countdown1 = GameImage.COUNTDOWN_1.getImage();
|
|
||||||
Image countdownGo = GameImage.COUNTDOWN_GO.getImage();
|
|
||||||
float countdownHeight = height / 3f;
|
float countdownHeight = height / 3f;
|
||||||
GameImage.COUNTDOWN_READY.setImage(
|
if (!GameImage.COUNTDOWN_READY.isScaled()) {
|
||||||
countdownReady.getScaledCopy(countdownHeight / countdownReady.getHeight()));
|
Image countdownReady = GameImage.COUNTDOWN_READY.getImage();
|
||||||
GameImage.COUNTDOWN_3.setImage(
|
GameImage.COUNTDOWN_READY.setImage(
|
||||||
countdown3.getScaledCopy(countdownHeight / countdown3.getHeight()));
|
countdownReady.getScaledCopy(countdownHeight / countdownReady.getHeight()));
|
||||||
GameImage.COUNTDOWN_2.setImage(
|
GameImage.COUNTDOWN_READY.setScaled();
|
||||||
countdown2.getScaledCopy(countdownHeight / countdown2.getHeight()));
|
}
|
||||||
GameImage.COUNTDOWN_1.setImage(
|
if (!GameImage.COUNTDOWN_3.isScaled()) {
|
||||||
countdown1.getScaledCopy(countdownHeight / countdown1.getHeight()));
|
Image countdown3 = GameImage.COUNTDOWN_3.getImage();
|
||||||
GameImage.COUNTDOWN_GO.setImage(
|
GameImage.COUNTDOWN_3.setImage(
|
||||||
countdownGo.getScaledCopy(countdownHeight / countdownGo.getHeight()));
|
countdown3.getScaledCopy(countdownHeight / countdown3.getHeight()));
|
||||||
|
GameImage.COUNTDOWN_3.setScaled();
|
||||||
|
}
|
||||||
|
if (!GameImage.COUNTDOWN_2.isScaled()) {
|
||||||
|
Image countdown2 = GameImage.COUNTDOWN_2.getImage();
|
||||||
|
GameImage.COUNTDOWN_2.setImage(
|
||||||
|
countdown2.getScaledCopy(countdownHeight / countdown2.getHeight()));
|
||||||
|
GameImage.COUNTDOWN_2.setScaled();
|
||||||
|
}
|
||||||
|
if (!GameImage.COUNTDOWN_1.isScaled()) {
|
||||||
|
Image countdown1 = GameImage.COUNTDOWN_1.getImage();
|
||||||
|
GameImage.COUNTDOWN_1.setImage(
|
||||||
|
countdown1.getScaledCopy(countdownHeight / countdown1.getHeight()));
|
||||||
|
GameImage.COUNTDOWN_1.setScaled();
|
||||||
|
}
|
||||||
|
if (!GameImage.COUNTDOWN_GO.isScaled()) {
|
||||||
|
Image countdownGo = GameImage.COUNTDOWN_GO.getImage();
|
||||||
|
GameImage.COUNTDOWN_GO.setImage(
|
||||||
|
countdownGo.getScaledCopy(countdownHeight / countdownGo.getHeight()));
|
||||||
|
GameImage.COUNTDOWN_GO.setScaled();
|
||||||
|
}
|
||||||
|
|
||||||
|
// load other images...
|
||||||
((GamePauseMenu) game.getState(Opsu.STATE_GAMEPAUSEMENU)).loadImages();
|
((GamePauseMenu) game.getState(Opsu.STATE_GAMEPAUSEMENU)).loadImages();
|
||||||
score.loadImages();
|
score.loadImages();
|
||||||
}
|
}
|
||||||
|
|
|
@ -182,11 +182,17 @@ public class GamePauseMenu extends BasicGameState {
|
||||||
backButton = new GUIMenuButton(GameImage.PAUSE_BACK.getImage(), width / 2f, height * 0.75f);
|
backButton = new GUIMenuButton(GameImage.PAUSE_BACK.getImage(), width / 2f, height * 0.75f);
|
||||||
|
|
||||||
// pause background image
|
// pause background image
|
||||||
GameImage.PAUSE_OVERLAY.setImage(GameImage.PAUSE_OVERLAY.getImage().getScaledCopy(width, height));
|
if (!GameImage.PAUSE_OVERLAY.isScaled()) {
|
||||||
GameImage.PAUSE_OVERLAY.getImage().setAlpha(0.7f);
|
GameImage.PAUSE_OVERLAY.setImage(GameImage.PAUSE_OVERLAY.getImage().getScaledCopy(width, height));
|
||||||
|
GameImage.PAUSE_OVERLAY.getImage().setAlpha(0.7f);
|
||||||
|
GameImage.PAUSE_OVERLAY.setScaled();
|
||||||
|
}
|
||||||
|
|
||||||
// fail image
|
// fail image
|
||||||
GameImage.FAIL_BACKGROUND.setImage(GameImage.FAIL_BACKGROUND.getImage().getScaledCopy(width, height));
|
if (!GameImage.FAIL_BACKGROUND.isScaled()) {
|
||||||
GameImage.FAIL_BACKGROUND.getImage().setAlpha(0.7f);
|
GameImage.FAIL_BACKGROUND.setImage(GameImage.FAIL_BACKGROUND.getImage().getScaledCopy(width, height));
|
||||||
|
GameImage.FAIL_BACKGROUND.getImage().setAlpha(0.7f);
|
||||||
|
GameImage.FAIL_BACKGROUND.setScaled();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user