parent
3842285038
commit
56b61e5936
@ -0,0 +1,160 @@ |
|||||||
|
package mightypork.gamecore.gui.screens; |
||||||
|
|
||||||
|
|
||||||
|
import mightypork.gamecore.control.AppAccess; |
||||||
|
import mightypork.gamecore.control.AppSubModule; |
||||||
|
import mightypork.gamecore.control.events.LayoutChangeEvent; |
||||||
|
import mightypork.gamecore.control.events.ViewportChangeEvent; |
||||||
|
import mightypork.gamecore.input.KeyBinder; |
||||||
|
import mightypork.gamecore.input.KeyBindingPool; |
||||||
|
import mightypork.gamecore.input.KeyStroke; |
||||||
|
import mightypork.gamecore.render.Render; |
||||||
|
import mightypork.util.annotations.DefaultImpl; |
||||||
|
import mightypork.util.constraints.rect.Rect; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Screen class. |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public abstract class BaseScreen extends AppSubModule implements Screen, KeyBinder, ViewportChangeEvent.Listener { |
||||||
|
|
||||||
|
private final KeyBindingPool keybindings = new KeyBindingPool(); |
||||||
|
|
||||||
|
private volatile boolean active; |
||||||
|
private volatile boolean needSetupViewport = false; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @param app app access |
||||||
|
*/ |
||||||
|
public BaseScreen(AppAccess app) { |
||||||
|
super(app); |
||||||
|
|
||||||
|
// disable events initially
|
||||||
|
setListening(false); |
||||||
|
|
||||||
|
addChildClient(keybindings); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private void fireLayoutChangeEvent() |
||||||
|
{ |
||||||
|
getEventBus().sendDirectToChildren(this, new LayoutChangeEvent()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final void bindKeyStroke(KeyStroke stroke, Runnable task) |
||||||
|
{ |
||||||
|
keybindings.bindKeyStroke(stroke, task); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final void unbindKeyStroke(KeyStroke stroke) |
||||||
|
{ |
||||||
|
keybindings.unbindKeyStroke(stroke); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Prepare for being shown |
||||||
|
* |
||||||
|
* @param shown true to show, false to hide |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public final void setActive(boolean shown) |
||||||
|
{ |
||||||
|
if (shown) { |
||||||
|
active = true; |
||||||
|
needSetupViewport = true; |
||||||
|
|
||||||
|
fireLayoutChangeEvent(); |
||||||
|
onScreenEnter(); |
||||||
|
|
||||||
|
// enable events
|
||||||
|
setListening(true); |
||||||
|
|
||||||
|
} else { |
||||||
|
onScreenLeave(); |
||||||
|
|
||||||
|
active = false; |
||||||
|
|
||||||
|
// disable events
|
||||||
|
setListening(false); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return true if screen is the current screen |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public final boolean isActive() |
||||||
|
{ |
||||||
|
return active; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final void onViewportChanged(ViewportChangeEvent event) |
||||||
|
{ |
||||||
|
if (!isActive()) return; |
||||||
|
|
||||||
|
// fire event
|
||||||
|
fireLayoutChangeEvent(); |
||||||
|
|
||||||
|
needSetupViewport = true; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final Rect getRect() |
||||||
|
{ |
||||||
|
return getDisplay().getRect(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void render() |
||||||
|
{ |
||||||
|
if (!isActive()) return; |
||||||
|
|
||||||
|
if (needSetupViewport) { |
||||||
|
Render.setupOrtho(getDisplay().getSize()); |
||||||
|
} |
||||||
|
|
||||||
|
Render.pushState(); |
||||||
|
|
||||||
|
renderScreen(); |
||||||
|
|
||||||
|
Render.popState(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Called when the screen becomes active |
||||||
|
*/ |
||||||
|
@DefaultImpl |
||||||
|
protected void onScreenEnter() |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Called when the screen is no longer active |
||||||
|
*/ |
||||||
|
@DefaultImpl |
||||||
|
protected void onScreenLeave() |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Render screen contents (context is ready for 2D rendering) |
||||||
|
*/ |
||||||
|
protected abstract void renderScreen(); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,140 @@ |
|||||||
|
package mightypork.gamecore.gui.screens; |
||||||
|
|
||||||
|
|
||||||
|
import java.util.Collection; |
||||||
|
import java.util.LinkedHashSet; |
||||||
|
|
||||||
|
import mightypork.gamecore.control.AppAccess; |
||||||
|
import mightypork.gamecore.control.AppSubModule; |
||||||
|
import mightypork.gamecore.control.events.LayoutChangeEvent; |
||||||
|
import mightypork.gamecore.gui.Hideable; |
||||||
|
import mightypork.gamecore.gui.components.VisualComponent; |
||||||
|
import mightypork.gamecore.gui.components.layout.ConstraintLayout; |
||||||
|
import mightypork.gamecore.input.KeyBinder; |
||||||
|
import mightypork.gamecore.input.KeyBindingPool; |
||||||
|
import mightypork.gamecore.input.KeyStroke; |
||||||
|
import mightypork.gamecore.render.Renderable; |
||||||
|
import mightypork.util.annotations.DefaultImpl; |
||||||
|
import mightypork.util.constraints.vect.Vect; |
||||||
|
import mightypork.util.control.timing.Updateable; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Abstract overlay.<br> |
||||||
|
* Overlay is connected to event bus and is renderable. |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public abstract class Overlay extends AppSubModule implements Updateable, Comparable<Overlay>, Renderable, KeyBinder, Hideable, LayoutChangeEvent.Listener { |
||||||
|
|
||||||
|
private boolean visible = true; |
||||||
|
private final KeyBindingPool keybindings = new KeyBindingPool(); |
||||||
|
|
||||||
|
/** Root layout, rendered and attached to the event bus. */ |
||||||
|
protected final ConstraintLayout root; |
||||||
|
|
||||||
|
/** Constraint: Mouse position. */ |
||||||
|
protected final Vect mouse; |
||||||
|
|
||||||
|
/** Extra rendered items (outside root) */ |
||||||
|
protected final Collection<Renderable> rendered = new LinkedHashSet<>(); |
||||||
|
|
||||||
|
/** Extra updated items (outside root - those can just implement Updateable) */ |
||||||
|
protected final Collection<Updateable> updated = new LinkedHashSet<>(); |
||||||
|
|
||||||
|
|
||||||
|
public Overlay(AppAccess app) { |
||||||
|
super(app); |
||||||
|
|
||||||
|
this.mouse = getInput().getMousePos(); |
||||||
|
|
||||||
|
this.root = new ConstraintLayout(app, getDisplay()); |
||||||
|
addChildClient(root); |
||||||
|
addChildClient(keybindings); |
||||||
|
|
||||||
|
rendered.add(root); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final void bindKeyStroke(KeyStroke stroke, Runnable task) |
||||||
|
{ |
||||||
|
keybindings.bindKeyStroke(stroke, task); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final void unbindKeyStroke(KeyStroke stroke) |
||||||
|
{ |
||||||
|
keybindings.unbindKeyStroke(stroke); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final boolean isVisible() |
||||||
|
{ |
||||||
|
return visible; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void setVisible(boolean visible) |
||||||
|
{ |
||||||
|
this.visible = visible; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public final int compareTo(Overlay o) |
||||||
|
{ |
||||||
|
return getPriority() - o.getPriority(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get rendering priority |
||||||
|
* |
||||||
|
* @return higher = on top. |
||||||
|
*/ |
||||||
|
@DefaultImpl |
||||||
|
public abstract int getPriority(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Render the overlay. The caller MUST check for visibility himself. |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
public void render() |
||||||
|
{ |
||||||
|
for (Renderable r : rendered) { |
||||||
|
r.render(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public void update(double delta) |
||||||
|
{ |
||||||
|
for (Updateable u : updated) { |
||||||
|
u.update(delta); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* <p> |
||||||
|
* Screen size changed. |
||||||
|
* </p> |
||||||
|
* <p> |
||||||
|
* Layouts / components should listen for this event and update their cached |
||||||
|
* constraints; components added to root or directly to this overlay as |
||||||
|
* child clients will receive the event. |
||||||
|
* </p> |
||||||
|
*/ |
||||||
|
@Override |
||||||
|
@DefaultImpl |
||||||
|
public void onLayoutChanged() |
||||||
|
{ |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue