World loading screen
This commit is contained in:
+1
-1
@@ -1,4 +1,4 @@
|
||||
package mightypork.rogue.screens.select_world;
|
||||
package mightypork.gamecore.gui.components.layout;
|
||||
|
||||
|
||||
import java.util.ArrayList;
|
||||
+2
-2
@@ -11,7 +11,7 @@ import mightypork.gamecore.eventbus.event_flags.SingleReceiverEvent;
|
||||
* @author MightyPork
|
||||
*/
|
||||
@SingleReceiverEvent
|
||||
public class ScreenRequestEvent extends BusEvent<ScreenRequestListener> {
|
||||
public class ScreenRequest extends BusEvent<ScreenRequestListener> {
|
||||
|
||||
private final String scrName;
|
||||
|
||||
@@ -19,7 +19,7 @@ public class ScreenRequestEvent extends BusEvent<ScreenRequestListener> {
|
||||
/**
|
||||
* @param screenKey screen name
|
||||
*/
|
||||
public ScreenRequestEvent(String screenKey)
|
||||
public ScreenRequest(String screenKey)
|
||||
{
|
||||
scrName = screenKey;
|
||||
}
|
||||
@@ -2,7 +2,7 @@ package mightypork.gamecore.gui.events;
|
||||
|
||||
|
||||
/**
|
||||
* {@link ScreenRequestEvent} listener
|
||||
* {@link ScreenRequest} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
|
||||
@@ -3,7 +3,7 @@ package mightypork.gamecore.gui.screens.impl;
|
||||
|
||||
import mightypork.gamecore.app.AppAccess;
|
||||
import mightypork.gamecore.gui.components.painters.QuadPainter;
|
||||
import mightypork.gamecore.gui.events.ScreenRequestEvent;
|
||||
import mightypork.gamecore.gui.events.ScreenRequest;
|
||||
import mightypork.gamecore.gui.screens.Overlay;
|
||||
import mightypork.gamecore.util.math.Easing;
|
||||
import mightypork.gamecore.util.math.color.Color;
|
||||
@@ -31,7 +31,7 @@ public class CrossfadeOverlay extends Overlay {
|
||||
if (requestedScreenName == null) {
|
||||
getEventBus().send(new ActionRequest(RequestType.SHUTDOWN));
|
||||
} else {
|
||||
getEventBus().send(new ScreenRequestEvent(requestedScreenName));
|
||||
getEventBus().send(new ScreenRequest(requestedScreenName));
|
||||
}
|
||||
blackLevel.setEasing(Easing.SINE_OUT);
|
||||
blackLevel.fadeOut(T_OUT);
|
||||
|
||||
@@ -3,6 +3,7 @@ package mightypork.gamecore.input;
|
||||
|
||||
import mightypork.gamecore.input.events.KeyEvent;
|
||||
import mightypork.gamecore.input.events.KeyListener;
|
||||
import mightypork.gamecore.logging.Log;
|
||||
|
||||
|
||||
/**
|
||||
@@ -54,8 +55,11 @@ public class KeyBinding implements KeyListener {
|
||||
@Override
|
||||
public void receive(KeyEvent event)
|
||||
{
|
||||
/*Log.f3("evt k="+event.getKey()+", c="+(int)event.getChar());
|
||||
|
||||
// ignore unrelated events
|
||||
if (!keystroke.getKeys().contains(event.getKey())) return;
|
||||
*/
|
||||
|
||||
// run handler when event was met
|
||||
if (keystroke.isActive() && !wasActive) {
|
||||
|
||||
@@ -307,7 +307,7 @@ public abstract class Num implements NumBound, Digestable<NumDigest> {
|
||||
|
||||
public Num perc(final double percent)
|
||||
{
|
||||
return mul(percent / 100);
|
||||
return mul(percent / 100D);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ import mightypork.rogue.events.ActionRequest;
|
||||
import mightypork.rogue.events.ActionRequest.RequestType;
|
||||
import mightypork.rogue.events.GameStateRequest;
|
||||
import mightypork.rogue.screens.FpsOverlay;
|
||||
import mightypork.rogue.screens.LoadingOverlay;
|
||||
import mightypork.rogue.screens.game.ScreenGame;
|
||||
import mightypork.rogue.screens.menu.ScreenMainMenu;
|
||||
import mightypork.rogue.screens.select_world.ScreenSelectWorld;
|
||||
@@ -120,6 +121,7 @@ public final class App extends BaseApp {
|
||||
screens.addScreen("game", new ScreenGame(this));
|
||||
|
||||
screens.addOverlay(new FpsOverlay(this));
|
||||
screens.addOverlay(new LoadingOverlay(this));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -33,11 +33,6 @@ public class GameStateManager extends AppModule {
|
||||
break;
|
||||
|
||||
case PLAY_WORLD:
|
||||
|
||||
if (WorldProvider.get().getWorld() == null) {
|
||||
Log.w("WorldProvider has no world.");
|
||||
}
|
||||
|
||||
getEventBus().send(new CrossfadeRequest("game"));
|
||||
break;
|
||||
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
package mightypork.rogue.screens;
|
||||
|
||||
import mightypork.gamecore.eventbus.BusEvent;
|
||||
|
||||
|
||||
public class LoaderRequest extends BusEvent<LoadingOverlay> {
|
||||
|
||||
private final boolean show;
|
||||
private final String msg;
|
||||
|
||||
|
||||
public LoaderRequest(boolean show, String msg) {
|
||||
this.show = show;
|
||||
this.msg = msg;
|
||||
}
|
||||
|
||||
public LoaderRequest(boolean show) {
|
||||
this.show = show;
|
||||
this.msg = null;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void handleBy(LoadingOverlay handler)
|
||||
{
|
||||
if(show) {
|
||||
handler.show(msg);
|
||||
}else {
|
||||
handler.hide();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,91 @@
|
||||
package mightypork.rogue.screens;
|
||||
|
||||
|
||||
import mightypork.gamecore.app.AppAccess;
|
||||
import mightypork.gamecore.gui.AlignX;
|
||||
import mightypork.gamecore.gui.components.painters.QuadPainter;
|
||||
import mightypork.gamecore.gui.components.painters.TextPainter;
|
||||
import mightypork.gamecore.gui.events.ScreenRequest;
|
||||
import mightypork.gamecore.gui.screens.Overlay;
|
||||
import mightypork.gamecore.util.math.Easing;
|
||||
import mightypork.gamecore.util.math.color.Color;
|
||||
import mightypork.gamecore.util.math.color.pal.PAL16;
|
||||
import mightypork.gamecore.util.math.color.pal.RGB;
|
||||
import mightypork.gamecore.util.math.constraints.num.Num;
|
||||
import mightypork.gamecore.util.math.constraints.num.mutable.NumAnimated;
|
||||
import mightypork.gamecore.util.math.constraints.rect.Rect;
|
||||
import mightypork.gamecore.util.math.timing.TimedTask;
|
||||
import mightypork.gamecore.util.strings.StringProvider;
|
||||
import mightypork.rogue.Res;
|
||||
import mightypork.rogue.events.ActionRequest;
|
||||
import mightypork.rogue.events.ActionRequest.RequestType;
|
||||
|
||||
|
||||
public class LoadingOverlay extends Overlay {
|
||||
|
||||
private static final double T_IN = 0.5;
|
||||
private static final double T_OUT = 1;
|
||||
|
||||
private final NumAnimated alpha = new NumAnimated(0);
|
||||
|
||||
private final StringProvider msgStrProv = new StringProvider() {
|
||||
|
||||
@Override
|
||||
public String getString()
|
||||
{
|
||||
return msg == null ? "" : msg;
|
||||
}
|
||||
};
|
||||
private String msg;
|
||||
|
||||
|
||||
public LoadingOverlay(AppAccess app) {
|
||||
super(app);
|
||||
|
||||
final QuadPainter qp = new QuadPainter(PAL16.SEABLUE);
|
||||
qp.setRect(root);
|
||||
root.add(qp);
|
||||
|
||||
updated.add(alpha);
|
||||
|
||||
Rect textRect = root.shrink(Num.ZERO, root.height().perc(48));
|
||||
textRect = textRect.moveY(root.height().perc(-10));
|
||||
|
||||
final TextPainter tp = new TextPainter(Res.getFont("thick"), AlignX.CENTER, RGB.WHITE, msgStrProv);
|
||||
|
||||
tp.setRect(textRect);
|
||||
tp.setShadow(RGB.BLACK_60, tp.height().mul(1/8D).toVectXY());
|
||||
root.add(tp);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public int getZIndex()
|
||||
{
|
||||
return 10001; // not too high, so app can put something on top
|
||||
}
|
||||
|
||||
|
||||
public void show(String message)
|
||||
{
|
||||
this.msg = message;
|
||||
alpha.setEasing(Easing.SINE_IN);
|
||||
alpha.fadeIn(T_IN);
|
||||
}
|
||||
|
||||
|
||||
public void hide()
|
||||
{
|
||||
|
||||
alpha.setEasing(Easing.SINE_OUT);
|
||||
alpha.fadeOut(T_OUT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void render()
|
||||
{
|
||||
Color.pushAlpha(alpha);
|
||||
super.render();
|
||||
Color.popAlpha();
|
||||
}
|
||||
}
|
||||
@@ -7,11 +7,15 @@ import java.io.IOException;
|
||||
import mightypork.gamecore.app.AppAccess;
|
||||
import mightypork.gamecore.gui.Action;
|
||||
import mightypork.gamecore.gui.AlignX;
|
||||
import mightypork.gamecore.gui.components.layout.ClickableWrapper;
|
||||
import mightypork.gamecore.gui.components.layout.ConstraintLayout;
|
||||
import mightypork.gamecore.gui.components.layout.GridLayout;
|
||||
import mightypork.gamecore.gui.components.painters.QuadPainter;
|
||||
import mightypork.gamecore.gui.components.painters.TextPainter;
|
||||
import mightypork.gamecore.gui.events.CrossfadeRequest;
|
||||
import mightypork.gamecore.gui.events.ScreenRequest;
|
||||
import mightypork.gamecore.resources.fonts.GLFont;
|
||||
import mightypork.gamecore.util.Utils;
|
||||
import mightypork.gamecore.util.ion.Ion;
|
||||
import mightypork.gamecore.util.ion.IonBundle;
|
||||
import mightypork.gamecore.util.math.color.pal.RGB;
|
||||
@@ -21,6 +25,7 @@ import mightypork.gamecore.util.strings.StringProvider;
|
||||
import mightypork.rogue.GameStateManager.GameState;
|
||||
import mightypork.rogue.Res;
|
||||
import mightypork.rogue.events.GameStateRequest;
|
||||
import mightypork.rogue.screens.LoaderRequest;
|
||||
import mightypork.rogue.world.World;
|
||||
import mightypork.rogue.world.WorldProvider;
|
||||
|
||||
@@ -42,8 +47,7 @@ public class WorldSlot extends ConstraintLayout {
|
||||
private IonBundle worldBundle;
|
||||
|
||||
|
||||
public WorldSlot(AppAccess app, File worldFile)
|
||||
{
|
||||
public WorldSlot(AppAccess app, File worldFile) {
|
||||
super(app);
|
||||
|
||||
this.file = worldFile;
|
||||
@@ -59,11 +63,9 @@ public class WorldSlot extends ConstraintLayout {
|
||||
}
|
||||
}));
|
||||
|
||||
|
||||
qp.setRect(innerRect);
|
||||
add(qp);
|
||||
|
||||
|
||||
final GridLayout gridl = new GridLayout(app, 1, 8);
|
||||
gridl.setRect(innerRect.shrink(width().perc(10), Num.ZERO));
|
||||
add(gridl);
|
||||
@@ -81,16 +83,37 @@ public class WorldSlot extends ConstraintLayout {
|
||||
@Override
|
||||
protected void execute()
|
||||
{
|
||||
try {
|
||||
final World w = new World();
|
||||
w.setSaveFile(file);
|
||||
w.load(worldBundle);
|
||||
WorldProvider.get().setWorld(w);
|
||||
} catch (final Exception e) {
|
||||
WorldProvider.get().createWorld(Double.doubleToLongBits(Math.random()));
|
||||
String msg;
|
||||
|
||||
if (worldBundle != null) {
|
||||
msg = "Loading world...";
|
||||
} else {
|
||||
msg = "Creating world...";
|
||||
}
|
||||
|
||||
getEventBus().send(new GameStateRequest(GameState.PLAY_WORLD));
|
||||
getEventBus().send(new LoaderRequest(true, msg));
|
||||
|
||||
Utils.runAsThread(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
{
|
||||
try {
|
||||
final World w = new World();
|
||||
w.setSaveFile(file);
|
||||
w.load(worldBundle);
|
||||
WorldProvider.get().setWorld(w);
|
||||
} catch (final Exception e) {
|
||||
WorldProvider.get().createWorld(Double.doubleToLongBits(Math.random()));
|
||||
}
|
||||
|
||||
getEventBus().send(new LoaderRequest(false));
|
||||
//getEventBus().send(new GameStateRequest(GameState.PLAY_WORLD));
|
||||
|
||||
getEventBus().send(new ScreenRequest("game"));
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
@@ -121,7 +144,7 @@ public class WorldSlot extends ConstraintLayout {
|
||||
final int lvl = worldBundle.get("meta.last_level", -1);
|
||||
|
||||
if (lvl == -1) throw new RuntimeException(); // let the catch block handle it
|
||||
|
||||
|
||||
label = "Floor " + (lvl + 1);
|
||||
} catch (final IOException e) {
|
||||
label = "<corrupt>";
|
||||
|
||||
Reference in New Issue
Block a user