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