Rogue: Savage Rats, a retro-themed dungeon crawler
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
rogue-savage-rats/src/mightypork/gamecore/gui/screens/ScreenLayer.java

173 lines
3.2 KiB

package mightypork.gamecore.gui.screens;
import java.util.Collection;
import java.util.LinkedHashSet;
import mightypork.gamecore.control.AppSubModule;
import mightypork.gamecore.control.timing.Updateable;
import mightypork.gamecore.gui.Hideable;
import mightypork.gamecore.gui.components.Renderable;
import mightypork.gamecore.gui.components.layout.ConstraintLayout;
import mightypork.gamecore.input.KeyBinder;
import mightypork.gamecore.input.KeyBindingPool;
import mightypork.gamecore.input.KeyStroke;
import mightypork.utils.annotations.DefaultImpl;
import mightypork.utils.math.constraints.vect.Vect;
/**
* Screen display layer
*
* @author MightyPork
*/
public abstract class ScreenLayer extends AppSubModule implements Updateable, Comparable<ScreenLayer>, Renderable, KeyBinder, Hideable {
private boolean visible = true;
private final KeyBindingPool keybindings = new KeyBindingPool();
/** Root layout, rendered and attached to the event bus */
protected final ConstraintLayout root;
protected final Vect mouse;
private final Screen screen;
/** 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<>();
/**
* @param screen parent screen
*/
public ScreenLayer(Screen screen) {
super(screen); // screen as AppAccess
this.screen = screen;
this.mouse = getInput().getMousePos();
this.root = new ConstraintLayout(screen, screen);
addChildClient(root);
addChildClient(keybindings);
rendered.add(root);
// root is on the bus, all attached components
// will receive events (such as update)
}
@Override
public final void bindKeyStroke(KeyStroke stroke, Runnable task)
{
keybindings.bindKeyStroke(stroke, task);
}
@Override
public final void unbindKeyStroke(KeyStroke stroke)
{
keybindings.unbindKeyStroke(stroke);
}
/**
* @return parent screen instance
*/
protected final Screen getScreen()
{
return screen;
}
@Override
public final boolean isVisible()
{
return visible;
}
@Override
public void setVisible(boolean visible)
{
this.visible = visible;
}
@Override
public final int compareTo(ScreenLayer o)
{
return getPriority() - o.getPriority();
}
/**
* Called when the screen becomes active
*/
@DefaultImpl
protected void onScreenEnter()
{
}
/**
* Called when the screen is no longer active
*/
@DefaultImpl
protected void onScreenLeave()
{
}
/**
* Update GUI for new screen size
*
* @param size screen size
*/
@DefaultImpl
protected void onSizeChanged(Vect size)
{
}
/**
* @return higher = on top.
*/
@DefaultImpl
public abstract int getPriority();
@Override
public final void render()
{
if (!visible) return;
renderLayer();
}
/**
* Render layer contents.
*/
protected void renderLayer()
{
// render renderables (including root layout)
for (Renderable r : rendered)
r.render();
}
@Override
public void update(double delta)
{
// update updateables
for (Updateable u : updated)
u.update(delta);
}
}