From 3cad5ad2025a961e2a9c464930cb184f054deb5a Mon Sep 17 00:00:00 2001 From: ondra Date: Tue, 15 Apr 2014 17:45:57 +0200 Subject: [PATCH] fixed components and painters, some tweaks to layer system --- src/mightypork/gamecore/gui/Action.java | 5 +- .../components/AbstractLayoutComponent.java | 160 ------------------ .../gui/components/ClickableComponent.java | 30 ++++ .../gui/components/InputComponent.java | 36 +++- .../gui/components/LayoutComponent.java | 147 +++++++++++++++- ...ualComponent.java => VisualComponent.java} | 10 +- .../gui/components/layout/ColumnHolder.java | 5 +- .../components/layout/ConstraintLayout.java | 38 +++++ .../gui/components/layout/RowHolder.java | 5 +- .../gui/components/painters/ImagePainter.java | 14 +- .../gui/components/painters/QuadPainter.java | 4 +- .../gui/components/painters/TextPainter.java | 4 +- .../gamecore/gui/screens/Screen.java | 21 +-- .../gamecore/gui/screens/ScreenLayer.java | 72 +++++--- .../gamecore/input/InputSystem.java | 2 +- .../gamecore/render/DisplaySystem.java | 12 +- .../render/fonts/impl/CachedFont.java | 11 +- .../gamecore/render/fonts/impl/NullFont.java | 2 +- src/mightypork/rogue/App.java | 4 +- src/mightypork/rogue/Res.java | 6 +- src/mightypork/rogue/screens/LayerFps.java | 14 +- .../screens/test_bouncyboxes/BouncyBox.java | 6 +- .../test_bouncyboxes/LayerBouncyBoxes.java | 20 +-- .../test_cat_sound/LayerFlyingCat.java | 81 +++++---- .../screens/test_font/ScreenTestFont.java | 45 ----- .../test_render/LayerTestGradient.java | 10 +- .../screens/test_render/ScreenTestRender.java | 2 + .../utils/math/constraints/vect/Vect.java | 21 +++ 28 files changed, 428 insertions(+), 359 deletions(-) delete mode 100644 src/mightypork/gamecore/gui/components/AbstractLayoutComponent.java create mode 100644 src/mightypork/gamecore/gui/components/ClickableComponent.java rename src/mightypork/gamecore/gui/components/{AbstractVisualComponent.java => VisualComponent.java} (81%) create mode 100644 src/mightypork/gamecore/gui/components/layout/ConstraintLayout.java delete mode 100644 src/mightypork/rogue/screens/test_font/ScreenTestFont.java diff --git a/src/mightypork/gamecore/gui/Action.java b/src/mightypork/gamecore/gui/Action.java index de36762..4445525 100644 --- a/src/mightypork/gamecore/gui/Action.java +++ b/src/mightypork/gamecore/gui/Action.java @@ -36,6 +36,9 @@ public abstract class Action implements Runnable, Enableable { } + /** + * Run the action, if it's enabled. + */ @Override public final void run() { @@ -46,6 +49,6 @@ public abstract class Action implements Runnable, Enableable { /** * Do the work. */ - public abstract void execute(); + protected abstract void execute(); } diff --git a/src/mightypork/gamecore/gui/components/AbstractLayoutComponent.java b/src/mightypork/gamecore/gui/components/AbstractLayoutComponent.java deleted file mode 100644 index 183df62..0000000 --- a/src/mightypork/gamecore/gui/components/AbstractLayoutComponent.java +++ /dev/null @@ -1,160 +0,0 @@ -package mightypork.gamecore.gui.components; - - -import java.util.Collection; -import java.util.LinkedList; - -import mightypork.gamecore.audio.SoundSystem; -import mightypork.gamecore.control.AppAccess; -import mightypork.gamecore.control.AppSubModule; -import mightypork.gamecore.control.bus.EventBus; -import mightypork.gamecore.input.InputSystem; -import mightypork.gamecore.render.DisplaySystem; -import mightypork.utils.math.constraints.rect.proxy.RectBound; - - -public abstract class AbstractLayoutComponent extends AbstractVisualComponent implements LayoutComponent, AppAccess { - - private boolean enabled; - - private final AppSubModule subModule; - final LinkedList elements = new LinkedList<>(); - - - public AbstractLayoutComponent(AppAccess app, RectBound context) { - this.subModule = new AppSubModule(app); - setRect(context); - } - - - public AbstractLayoutComponent(AppAccess app) { - this(app, null); - } - - - @Override - public EventBus getEventBus() - { - return subModule.getEventBus(); - } - - - @Override - public Collection getChildClients() - { - return subModule.getChildClients(); - } - - - @Override - public boolean doesDelegate() - { - return subModule.doesDelegate(); - } - - - @Override - public boolean isListening() - { - return subModule.isListening(); - } - - - @Override - public SoundSystem getSoundSystem() - { - return subModule.getSoundSystem(); - } - - - @Override - public InputSystem getInput() - { - return subModule.getInput(); - } - - - @Override - public DisplaySystem getDisplay() - { - return subModule.getDisplay(); - } - - - @Override - public void shutdown() - { - subModule.shutdown(); - } - - - @Override - public void addChildClient(Object client) - { - subModule.addChildClient(client); - } - - - @Override - public void removeChildClient(Object client) - { - subModule.removeChildClient(client); - } - - - @Override - public void enable(boolean yes) - { - subModule.setDelegating(yes); - subModule.setListening(yes); - enabled = yes; - } - - - @Override - public boolean isEnabled() - { - return enabled; - } - - - /** - * Add element to the holder, setting it's context.
- * Element must then be then attached using the attach method. - * - * @param elem element - */ - public abstract void add(Component elem); - - - /** - * Connect to bus and add to element list - * - * @param elem element; it's context will be set to the constraint. - */ - public final void attach(Component elem) - { - if (elem == null) return; - - elements.add(elem); - addChildClient(elem); - } - - @Override - public void renderComponent() - { - for (final Component element : elements) { - element.render(); - } - } - - - @Override - public void updateLayout() - { - for (final Component element : elements) { - element.render(); - } - } - -} diff --git a/src/mightypork/gamecore/gui/components/ClickableComponent.java b/src/mightypork/gamecore/gui/components/ClickableComponent.java new file mode 100644 index 0000000..a649ad7 --- /dev/null +++ b/src/mightypork/gamecore/gui/components/ClickableComponent.java @@ -0,0 +1,30 @@ +package mightypork.gamecore.gui.components; + + +import mightypork.gamecore.control.bus.events.MouseButtonEvent; + + +public abstract class ClickableComponent extends InputComponent { + + private boolean btnDownOver; + + + @Override + public void receive(MouseButtonEvent event) + { + if (!event.isButtonEvent()) return; + + if (event.isDown()) { + btnDownOver = event.isOver(this); + } + + if (event.isUp()) { + + if (btnDownOver && event.isOver(this)) { + triggerAction(); + } + + btnDownOver = false; + } + } +} diff --git a/src/mightypork/gamecore/gui/components/InputComponent.java b/src/mightypork/gamecore/gui/components/InputComponent.java index 09be031..85f9bf8 100644 --- a/src/mightypork/gamecore/gui/components/InputComponent.java +++ b/src/mightypork/gamecore/gui/components/InputComponent.java @@ -1,11 +1,43 @@ package mightypork.gamecore.gui.components; -import mightypork.gamecore.control.bus.clients.ToggleableClient; +import mightypork.gamecore.control.bus.events.MouseButtonEvent; import mightypork.gamecore.control.interf.Enableable; +import mightypork.gamecore.gui.Action; import mightypork.gamecore.gui.ActionTrigger; -public interface InputComponent extends Component, Enableable, ActionTrigger, ToggleableClient { +public abstract class InputComponent extends VisualComponent implements Component, Enableable, ActionTrigger, MouseButtonEvent.Listener { + private boolean enabled; + private Action action; + + + @Override + public void setAction(Action action) + { + this.action = action; + } + + + @Override + public void enable(boolean yes) + { + this.enabled = yes; + } + + + @Override + public boolean isEnabled() + { + return enabled; + } + + + @Override + public abstract void renderComponent(); + + protected void triggerAction() { + action.run(); + } } diff --git a/src/mightypork/gamecore/gui/components/LayoutComponent.java b/src/mightypork/gamecore/gui/components/LayoutComponent.java index 6e94258..9d1cf34 100644 --- a/src/mightypork/gamecore/gui/components/LayoutComponent.java +++ b/src/mightypork/gamecore/gui/components/LayoutComponent.java @@ -1,9 +1,154 @@ package mightypork.gamecore.gui.components; + +import java.util.Collection; +import java.util.LinkedList; + +import mightypork.gamecore.audio.SoundSystem; +import mightypork.gamecore.control.AppAccess; +import mightypork.gamecore.control.AppSubModule; +import mightypork.gamecore.control.bus.EventBus; import mightypork.gamecore.control.bus.clients.ClientHub; import mightypork.gamecore.control.interf.Enableable; +import mightypork.gamecore.input.InputSystem; +import mightypork.gamecore.render.DisplaySystem; +import mightypork.utils.math.constraints.rect.proxy.RectBound; -public interface LayoutComponent extends Component, Enableable, ClientHub { +public abstract class LayoutComponent extends VisualComponent implements Component, Enableable, ClientHub, AppAccess { + + private boolean enabled; + + private final AppSubModule subModule; + final LinkedList components = new LinkedList<>(); + + + public LayoutComponent(AppAccess app, RectBound context) { + this.subModule = new AppSubModule(app); + setRect(context); + } + + + public LayoutComponent(AppAccess app) { + this(app, null); + } + + + @Override + public EventBus getEventBus() + { + return subModule.getEventBus(); + } + + + @Override + public Collection getChildClients() + { + return subModule.getChildClients(); + } + + + @Override + public boolean doesDelegate() + { + return subModule.doesDelegate(); + } + + + @Override + public boolean isListening() + { + return subModule.isListening(); + } + + + @Override + public SoundSystem getSoundSystem() + { + return subModule.getSoundSystem(); + } + + + @Override + public InputSystem getInput() + { + return subModule.getInput(); + } + + + @Override + public DisplaySystem getDisplay() + { + return subModule.getDisplay(); + } + + + @Override + public void shutdown() + { + subModule.shutdown(); + } + + + @Override + public void addChildClient(Object client) + { + subModule.addChildClient(client); + } + + + @Override + public void removeChildClient(Object client) + { + subModule.removeChildClient(client); + } + + + @Override + public void enable(boolean yes) + { + subModule.setDelegating(yes); + subModule.setListening(yes); + enabled = yes; + } + + + @Override + public boolean isEnabled() + { + return enabled; + } + + + /** + * Connect to bus and add to element list + * + * @param component added component, whose context has already been set. + */ + public final void attach(Component component) + { + if (component == null) return; + + components.add(component); + addChildClient(component); + } + + + @Override + public void renderComponent() + { + for (final Component cmp : components) { + cmp.render(); + } + } + + + @Override + public void updateLayout() + { + for (final Component cmp : components) { + cmp.updateLayout(); + } + } } diff --git a/src/mightypork/gamecore/gui/components/AbstractVisualComponent.java b/src/mightypork/gamecore/gui/components/VisualComponent.java similarity index 81% rename from src/mightypork/gamecore/gui/components/AbstractVisualComponent.java rename to src/mightypork/gamecore/gui/components/VisualComponent.java index 85b449b..6249d9b 100644 --- a/src/mightypork/gamecore/gui/components/AbstractVisualComponent.java +++ b/src/mightypork/gamecore/gui/components/VisualComponent.java @@ -10,16 +10,22 @@ import mightypork.utils.math.constraints.rect.proxy.RectBoundAdapter; /** - * {@link Renderable} with pluggable context + * {@link Renderable} with pluggable context. When caching is enabled, the + * layout update can be triggered by firing the {@link LayoutChangeEvent}. * * @author MightyPork */ -public abstract class AbstractVisualComponent extends AbstractRectCache implements Component, LayoutChangeEvent.Listener { +public abstract class VisualComponent extends AbstractRectCache implements Component, LayoutChangeEvent.Listener { private Rect source; private boolean visible = true; + public VisualComponent() { + super(); + } + + @Override public final Rect getRect() { diff --git a/src/mightypork/gamecore/gui/components/layout/ColumnHolder.java b/src/mightypork/gamecore/gui/components/layout/ColumnHolder.java index bebd17c..bb3a8ee 100644 --- a/src/mightypork/gamecore/gui/components/layout/ColumnHolder.java +++ b/src/mightypork/gamecore/gui/components/layout/ColumnHolder.java @@ -2,7 +2,7 @@ package mightypork.gamecore.gui.components.layout; import mightypork.gamecore.control.AppAccess; -import mightypork.gamecore.gui.components.AbstractLayoutComponent; +import mightypork.gamecore.gui.components.LayoutComponent; import mightypork.gamecore.gui.components.Component; import mightypork.utils.math.constraints.rect.builders.TiledRect; import mightypork.utils.math.constraints.rect.proxy.RectBound; @@ -13,7 +13,7 @@ import mightypork.utils.math.constraints.rect.proxy.RectBound; * * @author MightyPork */ -public class ColumnHolder extends AbstractLayoutComponent { +public class ColumnHolder extends LayoutComponent { private final TiledRect tiler; private int col = 0; @@ -47,7 +47,6 @@ public class ColumnHolder extends AbstractLayoutComponent { * * @param elem */ - @Override public void add(final Component elem) { if (elem == null) return; diff --git a/src/mightypork/gamecore/gui/components/layout/ConstraintLayout.java b/src/mightypork/gamecore/gui/components/layout/ConstraintLayout.java new file mode 100644 index 0000000..5591f11 --- /dev/null +++ b/src/mightypork/gamecore/gui/components/layout/ConstraintLayout.java @@ -0,0 +1,38 @@ +package mightypork.gamecore.gui.components.layout; + + +import mightypork.gamecore.control.AppAccess; +import mightypork.gamecore.gui.components.LayoutComponent; +import mightypork.gamecore.gui.components.Component; +import mightypork.utils.math.constraints.rect.proxy.RectBound; + + +/** + * Layout for components with arbitrary constraints. + * + * @author MightyPork + */ +public class ConstraintLayout extends LayoutComponent { + + public ConstraintLayout(AppAccess app) { + super(app); + } + + + public ConstraintLayout(AppAccess app, RectBound context) { + super(app, context); + } + + + /** + * Add a component to the layout.
+ * The component's rect must be set up manually. + * + * @param component + */ + public void add(Component component) + { + attach(component); + } + +} diff --git a/src/mightypork/gamecore/gui/components/layout/RowHolder.java b/src/mightypork/gamecore/gui/components/layout/RowHolder.java index ddcdb8e..5ef0238 100644 --- a/src/mightypork/gamecore/gui/components/layout/RowHolder.java +++ b/src/mightypork/gamecore/gui/components/layout/RowHolder.java @@ -2,7 +2,7 @@ package mightypork.gamecore.gui.components.layout; import mightypork.gamecore.control.AppAccess; -import mightypork.gamecore.gui.components.AbstractLayoutComponent; +import mightypork.gamecore.gui.components.LayoutComponent; import mightypork.gamecore.gui.components.Component; import mightypork.utils.math.constraints.rect.builders.TiledRect; import mightypork.utils.math.constraints.rect.proxy.RectBound; @@ -13,7 +13,7 @@ import mightypork.utils.math.constraints.rect.proxy.RectBound; * * @author MightyPork */ -public class RowHolder extends AbstractLayoutComponent { +public class RowHolder extends LayoutComponent { private final TiledRect tiler; private int row = 0; @@ -47,7 +47,6 @@ public class RowHolder extends AbstractLayoutComponent { * * @param elem */ - @Override public void add(final Component elem) { if (elem == null) return; diff --git a/src/mightypork/gamecore/gui/components/painters/ImagePainter.java b/src/mightypork/gamecore/gui/components/painters/ImagePainter.java index 438b379..704765b 100644 --- a/src/mightypork/gamecore/gui/components/painters/ImagePainter.java +++ b/src/mightypork/gamecore/gui/components/painters/ImagePainter.java @@ -1,7 +1,7 @@ package mightypork.gamecore.gui.components.painters; -import mightypork.gamecore.gui.components.AbstractVisualComponent; +import mightypork.gamecore.gui.components.VisualComponent; import mightypork.gamecore.render.Render; import mightypork.gamecore.render.textures.TxQuad; @@ -11,7 +11,7 @@ import mightypork.gamecore.render.textures.TxQuad; * * @author MightyPork */ -public class ImagePainter extends AbstractVisualComponent { +public class ImagePainter extends VisualComponent { private TxQuad texture; @@ -33,18 +33,10 @@ public class ImagePainter extends AbstractVisualComponent { } - @Override - public void updateLayout() - { - Render.quadTextured(getRect(), texture); - } - - @Override public void renderComponent() { - // TODO Auto-generated method stub - + Render.quadTextured(getRect(), texture); } } diff --git a/src/mightypork/gamecore/gui/components/painters/QuadPainter.java b/src/mightypork/gamecore/gui/components/painters/QuadPainter.java index 200d5e6..7ad8578 100644 --- a/src/mightypork/gamecore/gui/components/painters/QuadPainter.java +++ b/src/mightypork/gamecore/gui/components/painters/QuadPainter.java @@ -1,7 +1,7 @@ package mightypork.gamecore.gui.components.painters; -import mightypork.gamecore.gui.components.AbstractVisualComponent; +import mightypork.gamecore.gui.components.VisualComponent; import mightypork.gamecore.render.Render; import mightypork.utils.annotations.FactoryMethod; import mightypork.utils.math.color.RGB; @@ -12,7 +12,7 @@ import mightypork.utils.math.color.RGB; * * @author MightyPork */ -public class QuadPainter extends AbstractVisualComponent { +public class QuadPainter extends VisualComponent { @FactoryMethod public static QuadPainter gradH(RGB colorLeft, RGB colorRight) diff --git a/src/mightypork/gamecore/gui/components/painters/TextPainter.java b/src/mightypork/gamecore/gui/components/painters/TextPainter.java index 4b5d270..1166bf8 100644 --- a/src/mightypork/gamecore/gui/components/painters/TextPainter.java +++ b/src/mightypork/gamecore/gui/components/painters/TextPainter.java @@ -1,7 +1,7 @@ package mightypork.gamecore.gui.components.painters; -import mightypork.gamecore.gui.components.AbstractVisualComponent; +import mightypork.gamecore.gui.components.VisualComponent; import mightypork.gamecore.render.fonts.FontRenderer; import mightypork.gamecore.render.fonts.FontRenderer.Align; import mightypork.gamecore.render.fonts.GLFont; @@ -19,7 +19,7 @@ import mightypork.utils.string.StringProvider.StringWrapper; * * @author MightyPork */ -public class TextPainter extends AbstractVisualComponent { +public class TextPainter extends VisualComponent { private final FontRenderer font; private RGB color; diff --git a/src/mightypork/gamecore/gui/screens/Screen.java b/src/mightypork/gamecore/gui/screens/Screen.java index 0cb2ad9..ea27ef9 100644 --- a/src/mightypork/gamecore/gui/screens/Screen.java +++ b/src/mightypork/gamecore/gui/screens/Screen.java @@ -94,13 +94,13 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind @Override - public void receive(ScreenChangeEvent event) + public final void receive(ScreenChangeEvent event) { if (!isActive()) return; onSizeChanged(event.getScreenSize()); - // poll constraints + // fire event getEventBus().sendDirectToChildren(this, new LayoutChangeEvent()); needSetupViewport = true; @@ -108,7 +108,7 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind @Override - public Rect getRect() + public final Rect getRect() { return getDisplay().getRect(); } @@ -137,7 +137,6 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind @DefaultImpl protected void onScreenEnter() { - // } @@ -147,7 +146,6 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind @DefaultImpl protected void onScreenLeave() { - // } @@ -159,7 +157,6 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind @DefaultImpl protected void onSizeChanged(Vect size) { - // } @@ -174,16 +171,4 @@ public abstract class Screen extends AppSubModule implements Renderable, KeyBind */ public abstract String getName(); - - protected final Rect bounds() - { - return getRect(); - } - - - protected final Vect mouse() - { - return getInput().getMousePos(); - } - } diff --git a/src/mightypork/gamecore/gui/screens/ScreenLayer.java b/src/mightypork/gamecore/gui/screens/ScreenLayer.java index 98f58ee..b041d14 100644 --- a/src/mightypork/gamecore/gui/screens/ScreenLayer.java +++ b/src/mightypork/gamecore/gui/screens/ScreenLayer.java @@ -1,15 +1,18 @@ 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.rect.Rect; -import mightypork.utils.math.constraints.rect.proxy.RectBound; import mightypork.utils.math.constraints.vect.Vect; @@ -18,14 +21,25 @@ import mightypork.utils.math.constraints.vect.Vect; * * @author MightyPork */ -public abstract class ScreenLayer extends AppSubModule implements Comparable, Renderable, RectBound, KeyBinder, Hideable { - - private final Screen screen; +public abstract class ScreenLayer extends AppSubModule implements Updateable, Comparable, 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 rendered = new LinkedHashSet<>(); + + /** Extra updated items (outside root - those can just implement Updateable) */ + protected final Collection updated = new LinkedHashSet<>(); + /** * @param screen parent screen @@ -34,7 +48,17 @@ public abstract class ScreenLayer extends AppSubModule implements Comparable { public static final VectConst ONE = new VectConst(1, 1, 1); + @FactoryMethod + public static Vect make(Num xy) + { + return make(xy, xy); + } + + @FactoryMethod public static Vect make(Num xc, Num yc) { @@ -48,6 +55,13 @@ public abstract class Vect implements VectBound, Digestable { } + @FactoryMethod + public static VectConst make(NumConst xy) + { + return make(xy, xy); + } + + @FactoryMethod public static VectConst make(NumConst xc, NumConst yc) { @@ -62,6 +76,13 @@ public abstract class Vect implements VectBound, Digestable { } + @FactoryMethod + public static VectConst make(double xy) + { + return make(xy, xy); + } + + @FactoryMethod public static VectConst make(double x, double y) {