weirdly broken world renderer while triny to optimize
This commit is contained in:
@@ -8,7 +8,7 @@ import java.util.Set;
|
||||
import mightypork.gamecore.audio.players.EffectPlayer;
|
||||
import mightypork.gamecore.audio.players.LoopPlayer;
|
||||
import mightypork.gamecore.control.AppAccess;
|
||||
import mightypork.gamecore.control.events.ResourceLoadRequest;
|
||||
import mightypork.gamecore.control.events.requests.ResourceLoadRequest;
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
import mightypork.util.constraints.vect.mutable.VectVar;
|
||||
import mightypork.util.control.eventbus.clients.RootBusNode;
|
||||
|
||||
@@ -8,7 +8,7 @@ import java.util.logging.Level;
|
||||
import javax.swing.JOptionPane;
|
||||
|
||||
import mightypork.gamecore.audio.SoundSystem;
|
||||
import mightypork.gamecore.control.events.DestroyEvent;
|
||||
import mightypork.gamecore.control.events.core.DestroyEvent;
|
||||
import mightypork.gamecore.gui.screens.ScreenRegistry;
|
||||
import mightypork.gamecore.input.InputSystem;
|
||||
import mightypork.gamecore.render.DisplaySystem;
|
||||
|
||||
@@ -4,8 +4,8 @@ package mightypork.gamecore.control;
|
||||
import java.util.Queue;
|
||||
import java.util.concurrent.ConcurrentLinkedQueue;
|
||||
|
||||
import mightypork.gamecore.control.events.MainLoopTaskRequest;
|
||||
import mightypork.gamecore.control.events.UpdateEvent;
|
||||
import mightypork.gamecore.control.events.core.UpdateEvent;
|
||||
import mightypork.gamecore.control.events.requests.MainLoopRequestListener;
|
||||
import mightypork.gamecore.gui.screens.ScreenRegistry;
|
||||
import mightypork.gamecore.render.Renderable;
|
||||
import mightypork.util.annotations.DefaultImpl;
|
||||
@@ -17,7 +17,7 @@ import mightypork.util.control.timing.TimerDelta;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public abstract class GameLoop extends AppModule implements MainLoopTaskRequest.Listener {
|
||||
public abstract class GameLoop extends AppModule implements MainLoopRequestListener {
|
||||
|
||||
private final Queue<Runnable> taskQueue = new ConcurrentLinkedQueue<>();
|
||||
private TimerDelta timer;
|
||||
|
||||
@@ -1,32 +0,0 @@
|
||||
package mightypork.gamecore.control.events;
|
||||
|
||||
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.events.flags.ImmediateEvent;
|
||||
|
||||
|
||||
/**
|
||||
* Intended use is to notify UI component sub-clients that they should poll
|
||||
* their cached constraints.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
@ImmediateEvent
|
||||
public class LayoutChangeEvent implements Event<LayoutChangeEvent.Listener> {
|
||||
|
||||
public LayoutChangeEvent()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void handleBy(Listener handler)
|
||||
{
|
||||
handler.onLayoutChanged();
|
||||
}
|
||||
|
||||
public interface Listener {
|
||||
|
||||
public void onLayoutChanged();
|
||||
}
|
||||
}
|
||||
@@ -1,48 +0,0 @@
|
||||
package mightypork.gamecore.control.events;
|
||||
|
||||
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.events.flags.SingleReceiverEvent;
|
||||
|
||||
|
||||
/**
|
||||
* Request to execute given {@link Runnable} in main loop.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
@SingleReceiverEvent
|
||||
public class MainLoopTaskRequest implements Event<MainLoopTaskRequest.Listener> {
|
||||
|
||||
private final Runnable task;
|
||||
|
||||
|
||||
/**
|
||||
* @param task task to run on main thread in rendering context
|
||||
*/
|
||||
public MainLoopTaskRequest(Runnable task)
|
||||
{
|
||||
this.task = task;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void handleBy(Listener handler)
|
||||
{
|
||||
handler.queueTask(task);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link MainLoopTaskRequest} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface Listener {
|
||||
|
||||
/**
|
||||
* Perform the requested action
|
||||
*
|
||||
* @param request
|
||||
*/
|
||||
void queueTask(Runnable request);
|
||||
}
|
||||
}
|
||||
@@ -1,49 +0,0 @@
|
||||
package mightypork.gamecore.control.events;
|
||||
|
||||
|
||||
import mightypork.gamecore.loading.Deferred;
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.events.flags.SingleReceiverEvent;
|
||||
|
||||
|
||||
/**
|
||||
* Request to load a deferred resource.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
@SingleReceiverEvent
|
||||
public class ResourceLoadRequest implements Event<ResourceLoadRequest.Listener> {
|
||||
|
||||
private final Deferred resource;
|
||||
|
||||
|
||||
/**
|
||||
* @param resource resource to load
|
||||
*/
|
||||
public ResourceLoadRequest(Deferred resource)
|
||||
{
|
||||
this.resource = resource;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void handleBy(Listener handler)
|
||||
{
|
||||
handler.loadResource(resource);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link ResourceLoadRequest} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface Listener {
|
||||
|
||||
/**
|
||||
* Load a resource
|
||||
*
|
||||
* @param resource
|
||||
*/
|
||||
void loadResource(Deferred resource);
|
||||
}
|
||||
}
|
||||
@@ -1,47 +0,0 @@
|
||||
package mightypork.gamecore.control.events;
|
||||
|
||||
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.events.flags.SingleReceiverEvent;
|
||||
|
||||
|
||||
/**
|
||||
* Request to change screen
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
@SingleReceiverEvent
|
||||
public class ScreenRequestEvent implements Event<ScreenRequestEvent.Listener> {
|
||||
|
||||
private final String scrName;
|
||||
|
||||
|
||||
/**
|
||||
* @param screenKey screen name
|
||||
*/
|
||||
public ScreenRequestEvent(String screenKey)
|
||||
{
|
||||
scrName = screenKey;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void handleBy(Listener handler)
|
||||
{
|
||||
handler.showScreen(scrName);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link ScreenRequestEvent} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface Listener {
|
||||
|
||||
/**
|
||||
* @param key screen to show
|
||||
*/
|
||||
void showScreen(String key);
|
||||
}
|
||||
|
||||
}
|
||||
+5
-3
@@ -1,9 +1,10 @@
|
||||
package mightypork.gamecore.control.events;
|
||||
package mightypork.gamecore.control.events.core;
|
||||
|
||||
|
||||
import mightypork.util.control.Destroyable;
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.ImmediateEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.NonConsumableEvent;
|
||||
|
||||
|
||||
/**
|
||||
@@ -12,7 +13,8 @@ import mightypork.util.control.eventbus.events.flags.ImmediateEvent;
|
||||
* @author MightyPork
|
||||
*/
|
||||
@ImmediateEvent
|
||||
public class DestroyEvent implements Event<Destroyable> {
|
||||
@NonConsumableEvent
|
||||
public class DestroyEvent extends BusEvent<Destroyable> {
|
||||
|
||||
@Override
|
||||
public void handleBy(Destroyable handler)
|
||||
+6
-5
@@ -1,8 +1,9 @@
|
||||
package mightypork.gamecore.control.events;
|
||||
package mightypork.gamecore.control.events.core;
|
||||
|
||||
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.ImmediateEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.NonConsumableEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.UnloggedEvent;
|
||||
import mightypork.util.control.timing.Updateable;
|
||||
|
||||
@@ -14,7 +15,8 @@ import mightypork.util.control.timing.Updateable;
|
||||
*/
|
||||
@UnloggedEvent
|
||||
@ImmediateEvent
|
||||
public class UpdateEvent implements Event<Updateable> {
|
||||
@NonConsumableEvent
|
||||
public class UpdateEvent extends BusEvent<Updateable> {
|
||||
|
||||
private final double deltaTime;
|
||||
|
||||
@@ -22,8 +24,7 @@ public class UpdateEvent implements Event<Updateable> {
|
||||
/**
|
||||
* @param deltaTime time since last update (sec)
|
||||
*/
|
||||
public UpdateEvent(double deltaTime)
|
||||
{
|
||||
public UpdateEvent(double deltaTime) {
|
||||
this.deltaTime = deltaTime;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package mightypork.gamecore.control.events.gui;
|
||||
|
||||
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.ImmediateEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.NonConsumableEvent;
|
||||
|
||||
|
||||
/**
|
||||
* Intended use is to notify UI component sub-clients that they should poll
|
||||
* their cached constraints.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
@ImmediateEvent
|
||||
@NonConsumableEvent
|
||||
public class LayoutChangeEvent extends BusEvent<LayoutChangeListener> {
|
||||
|
||||
public LayoutChangeEvent() {
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void handleBy(LayoutChangeListener handler)
|
||||
{
|
||||
handler.onLayoutChanged();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
package mightypork.gamecore.control.events.gui;
|
||||
|
||||
public interface LayoutChangeListener {
|
||||
|
||||
public void onLayoutChanged();
|
||||
}
|
||||
+7
-21
@@ -1,8 +1,9 @@
|
||||
package mightypork.gamecore.control.events;
|
||||
package mightypork.gamecore.control.events.gui;
|
||||
|
||||
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.NonConsumableEvent;
|
||||
|
||||
|
||||
/**
|
||||
@@ -10,7 +11,8 @@ import mightypork.util.control.eventbus.events.Event;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class ViewportChangeEvent implements Event<ViewportChangeEvent.Listener> {
|
||||
@NonConsumableEvent
|
||||
public class ViewportChangeEvent extends BusEvent<ViewportChangeListener> {
|
||||
|
||||
private final boolean fullscreen;
|
||||
private final Vect screenSize;
|
||||
@@ -22,8 +24,7 @@ public class ViewportChangeEvent implements Event<ViewportChangeEvent.Listener>
|
||||
* @param fullscreen is now fullscreen
|
||||
* @param size new screen size
|
||||
*/
|
||||
public ViewportChangeEvent(boolean fsChanged, boolean fullscreen, Vect size)
|
||||
{
|
||||
public ViewportChangeEvent(boolean fsChanged, boolean fullscreen, Vect size) {
|
||||
this.fullscreen = fullscreen;
|
||||
this.screenSize = size;
|
||||
this.fsChanged = fsChanged;
|
||||
@@ -58,23 +59,8 @@ public class ViewportChangeEvent implements Event<ViewportChangeEvent.Listener>
|
||||
|
||||
|
||||
@Override
|
||||
public void handleBy(Listener handler)
|
||||
public void handleBy(ViewportChangeListener handler)
|
||||
{
|
||||
handler.onViewportChanged(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link ViewportChangeEvent} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface Listener {
|
||||
|
||||
/**
|
||||
* Handle event
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
void onViewportChanged(ViewportChangeEvent event);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package mightypork.gamecore.control.events.gui;
|
||||
|
||||
/**
|
||||
* {@link ViewportChangeEvent} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface ViewportChangeListener {
|
||||
|
||||
/**
|
||||
* Handle event
|
||||
*
|
||||
* @param event
|
||||
*/
|
||||
void onViewportChanged(ViewportChangeEvent event);
|
||||
}
|
||||
+5
-22
@@ -1,7 +1,7 @@
|
||||
package mightypork.gamecore.control.events;
|
||||
package mightypork.gamecore.control.events.input;
|
||||
|
||||
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
|
||||
import org.lwjgl.input.Keyboard;
|
||||
|
||||
@@ -11,7 +11,7 @@ import org.lwjgl.input.Keyboard;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class KeyEvent implements Event<KeyEvent.Listener> {
|
||||
public class KeyEvent extends BusEvent<KeyListener> {
|
||||
|
||||
private final int key;
|
||||
private final boolean down;
|
||||
@@ -23,8 +23,7 @@ public class KeyEvent implements Event<KeyEvent.Listener> {
|
||||
* @param c typed char (can be zero char)
|
||||
* @param down true = pressed, false = released.
|
||||
*/
|
||||
public KeyEvent(int key, char c, boolean down)
|
||||
{
|
||||
public KeyEvent(int key, char c, boolean down) {
|
||||
this.key = key;
|
||||
this.c = c;
|
||||
this.down = down;
|
||||
@@ -68,27 +67,11 @@ public class KeyEvent implements Event<KeyEvent.Listener> {
|
||||
|
||||
|
||||
@Override
|
||||
public void handleBy(Listener keh)
|
||||
public void handleBy(KeyListener keh)
|
||||
{
|
||||
keh.receive(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link KeyEvent} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface Listener {
|
||||
|
||||
/**
|
||||
* Handle an event
|
||||
*
|
||||
* @param event event
|
||||
*/
|
||||
void receive(KeyEvent event);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
@@ -0,0 +1,16 @@
|
||||
package mightypork.gamecore.control.events.input;
|
||||
|
||||
/**
|
||||
* {@link KeyEvent} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface KeyListener {
|
||||
|
||||
/**
|
||||
* Handle an event
|
||||
*
|
||||
* @param event event
|
||||
*/
|
||||
void receive(KeyEvent event);
|
||||
}
|
||||
+5
-21
@@ -1,10 +1,10 @@
|
||||
package mightypork.gamecore.control.events;
|
||||
package mightypork.gamecore.control.events.input;
|
||||
|
||||
|
||||
import mightypork.util.constraints.rect.proxy.RectBound;
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
import mightypork.util.constraints.vect.VectConst;
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
|
||||
|
||||
/**
|
||||
@@ -12,7 +12,7 @@ import mightypork.util.control.eventbus.events.Event;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class MouseButtonEvent implements Event<MouseButtonEvent.Listener> {
|
||||
public class MouseButtonEvent extends BusEvent<MouseButtonListener> {
|
||||
|
||||
public static final int BUTTON_LEFT = 0;
|
||||
public static final int BUTTON_MIDDLE = 1;
|
||||
@@ -32,8 +32,7 @@ public class MouseButtonEvent implements Event<MouseButtonEvent.Listener> {
|
||||
* @param down button pressed
|
||||
* @param wheeld wheel change
|
||||
*/
|
||||
public MouseButtonEvent(Vect pos, int button, boolean down, int wheeld)
|
||||
{
|
||||
public MouseButtonEvent(Vect pos, int button, boolean down, int wheeld) {
|
||||
this.button = button;
|
||||
this.down = down;
|
||||
this.pos = pos.freeze();
|
||||
@@ -117,23 +116,8 @@ public class MouseButtonEvent implements Event<MouseButtonEvent.Listener> {
|
||||
|
||||
|
||||
@Override
|
||||
public void handleBy(Listener handler)
|
||||
public void handleBy(MouseButtonListener handler)
|
||||
{
|
||||
handler.receive(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link MouseButtonEvent} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface Listener {
|
||||
|
||||
/**
|
||||
* Handle an event
|
||||
*
|
||||
* @param event event
|
||||
*/
|
||||
void receive(MouseButtonEvent event);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package mightypork.gamecore.control.events.input;
|
||||
|
||||
/**
|
||||
* {@link MouseButtonEvent} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface MouseButtonListener {
|
||||
|
||||
/**
|
||||
* Handle an event
|
||||
*
|
||||
* @param event event
|
||||
*/
|
||||
void receive(MouseButtonEvent event);
|
||||
}
|
||||
+5
-21
@@ -1,9 +1,9 @@
|
||||
package mightypork.gamecore.control.events;
|
||||
package mightypork.gamecore.control.events.input;
|
||||
|
||||
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
import mightypork.util.constraints.vect.VectConst;
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.UnloggedEvent;
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ import mightypork.util.control.eventbus.events.flags.UnloggedEvent;
|
||||
* @author MightyPork
|
||||
*/
|
||||
@UnloggedEvent
|
||||
public class MouseMotionEvent implements Event<MouseMotionEvent.Listener> {
|
||||
public class MouseMotionEvent extends BusEvent<MouseMotionListener> {
|
||||
|
||||
private final VectConst move;
|
||||
private final VectConst pos;
|
||||
@@ -23,8 +23,7 @@ public class MouseMotionEvent implements Event<MouseMotionEvent.Listener> {
|
||||
* @param pos end pos
|
||||
* @param move move vector
|
||||
*/
|
||||
public MouseMotionEvent(Vect pos, Vect move)
|
||||
{
|
||||
public MouseMotionEvent(Vect pos, Vect move) {
|
||||
this.move = move.freeze();
|
||||
this.pos = pos.freeze();
|
||||
}
|
||||
@@ -49,24 +48,9 @@ public class MouseMotionEvent implements Event<MouseMotionEvent.Listener> {
|
||||
|
||||
|
||||
@Override
|
||||
public void handleBy(Listener keh)
|
||||
public void handleBy(MouseMotionListener keh)
|
||||
{
|
||||
keh.receive(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link MouseMotionEvent} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface Listener {
|
||||
|
||||
/**
|
||||
* Handle an event
|
||||
*
|
||||
* @param event event
|
||||
*/
|
||||
void receive(MouseMotionEvent event);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package mightypork.gamecore.control.events.input;
|
||||
|
||||
/**
|
||||
* {@link MouseMotionEvent} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface MouseMotionListener {
|
||||
|
||||
/**
|
||||
* Handle an event
|
||||
*
|
||||
* @param event event
|
||||
*/
|
||||
void receive(MouseMotionEvent event);
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
package mightypork.gamecore.control.events.requests;
|
||||
|
||||
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.SingleReceiverEvent;
|
||||
|
||||
|
||||
/**
|
||||
* Request to execute given {@link Runnable} in main loop.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
@SingleReceiverEvent
|
||||
public class MainLoopRequest extends BusEvent<MainLoopRequestListener> {
|
||||
|
||||
private final Runnable task;
|
||||
|
||||
|
||||
/**
|
||||
* @param task task to run on main thread in rendering context
|
||||
*/
|
||||
public MainLoopRequest(Runnable task) {
|
||||
this.task = task;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void handleBy(MainLoopRequestListener handler)
|
||||
{
|
||||
handler.queueTask(task);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package mightypork.gamecore.control.events.requests;
|
||||
|
||||
/**
|
||||
* {@link MainLoopRequest} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface MainLoopRequestListener {
|
||||
|
||||
/**
|
||||
* Perform the requested action
|
||||
*
|
||||
* @param request
|
||||
*/
|
||||
void queueTask(Runnable request);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package mightypork.gamecore.control.events.requests;
|
||||
|
||||
|
||||
import mightypork.gamecore.loading.Deferred;
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.SingleReceiverEvent;
|
||||
|
||||
|
||||
/**
|
||||
* Request to load a deferred resource.
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
@SingleReceiverEvent
|
||||
public class ResourceLoadRequest extends BusEvent<ResourceLoadRequestListener> {
|
||||
|
||||
private final Deferred resource;
|
||||
|
||||
|
||||
/**
|
||||
* @param resource resource to load
|
||||
*/
|
||||
public ResourceLoadRequest(Deferred resource) {
|
||||
this.resource = resource;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void handleBy(ResourceLoadRequestListener handler)
|
||||
{
|
||||
handler.loadResource(resource);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package mightypork.gamecore.control.events.requests;
|
||||
|
||||
import mightypork.gamecore.loading.Deferred;
|
||||
|
||||
/**
|
||||
* {@link ResourceLoadRequest} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface ResourceLoadRequestListener {
|
||||
|
||||
/**
|
||||
* Load a resource
|
||||
*
|
||||
* @param resource
|
||||
*/
|
||||
void loadResource(Deferred resource);
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
package mightypork.gamecore.control.events.requests;
|
||||
|
||||
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.SingleReceiverEvent;
|
||||
|
||||
|
||||
/**
|
||||
* Request to change screen
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
@SingleReceiverEvent
|
||||
public class ScreenRequestEvent extends BusEvent<ScreenRequestListener> {
|
||||
|
||||
private final String scrName;
|
||||
|
||||
|
||||
/**
|
||||
* @param screenKey screen name
|
||||
*/
|
||||
public ScreenRequestEvent(String screenKey) {
|
||||
scrName = screenKey;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void handleBy(ScreenRequestListener handler)
|
||||
{
|
||||
handler.showScreen(scrName);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
package mightypork.gamecore.control.events.requests;
|
||||
|
||||
/**
|
||||
* {@link ScreenRequestEvent} listener
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public interface ScreenRequestListener {
|
||||
|
||||
/**
|
||||
* @param key screen to show
|
||||
*/
|
||||
void showScreen(String key);
|
||||
}
|
||||
@@ -1,12 +1,13 @@
|
||||
package mightypork.gamecore.gui.components;
|
||||
|
||||
|
||||
import mightypork.gamecore.control.events.MouseButtonEvent;
|
||||
import mightypork.gamecore.control.events.input.MouseButtonEvent;
|
||||
import mightypork.gamecore.control.events.input.MouseButtonListener;
|
||||
import mightypork.util.control.Action;
|
||||
import mightypork.util.control.ActionTrigger;
|
||||
|
||||
|
||||
public abstract class ClickableComponent extends InputComponent implements ActionTrigger, MouseButtonEvent.Listener {
|
||||
public abstract class ClickableComponent extends InputComponent implements ActionTrigger, MouseButtonListener {
|
||||
|
||||
private boolean btnDownOver;
|
||||
private Action action;
|
||||
@@ -38,6 +39,7 @@ public abstract class ClickableComponent extends InputComponent implements Actio
|
||||
|
||||
if (btnDownOver && event.isOver(this)) {
|
||||
triggerAction();
|
||||
event.consume();
|
||||
}
|
||||
|
||||
btnDownOver = false;
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
package mightypork.gamecore.gui.components;
|
||||
|
||||
|
||||
import mightypork.gamecore.control.events.LayoutChangeEvent;
|
||||
import mightypork.gamecore.control.events.gui.LayoutChangeEvent;
|
||||
import mightypork.gamecore.control.events.gui.LayoutChangeListener;
|
||||
import mightypork.gamecore.input.InputSystem;
|
||||
import mightypork.gamecore.render.Renderable;
|
||||
import mightypork.util.annotations.DefaultImpl;
|
||||
@@ -17,7 +18,7 @@ import mightypork.util.constraints.rect.proxy.RectBoundAdapter;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public abstract class VisualComponent extends AbstractRectCache implements Component, LayoutChangeEvent.Listener {
|
||||
public abstract class VisualComponent extends AbstractRectCache implements Component, LayoutChangeListener {
|
||||
|
||||
private Rect source;
|
||||
private boolean visible = true;
|
||||
|
||||
@@ -3,7 +3,8 @@ 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.gui.LayoutChangeEvent;
|
||||
import mightypork.gamecore.control.events.gui.LayoutChangeListener;
|
||||
import mightypork.gamecore.input.KeyBinder;
|
||||
import mightypork.gamecore.input.KeyBindingPool;
|
||||
import mightypork.gamecore.input.KeyStroke;
|
||||
@@ -17,7 +18,7 @@ import mightypork.util.constraints.rect.Rect;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public abstract class BaseScreen extends AppSubModule implements Screen, KeyBinder, LayoutChangeEvent.Listener {
|
||||
public abstract class BaseScreen extends AppSubModule implements Screen, KeyBinder, LayoutChangeListener {
|
||||
|
||||
private final KeyBindingPool keybindings = new KeyBindingPool();
|
||||
|
||||
|
||||
@@ -2,9 +2,12 @@ package mightypork.gamecore.gui.screens;
|
||||
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.Comparator;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import mightypork.gamecore.control.AppAccess;
|
||||
import mightypork.util.control.eventbus.clients.DelegatingClient;
|
||||
import mightypork.util.control.eventbus.clients.RootBusNode;
|
||||
|
||||
|
||||
/**
|
||||
@@ -14,22 +17,59 @@ import mightypork.gamecore.control.AppAccess;
|
||||
*/
|
||||
public abstract class LayeredScreen extends BaseScreen {
|
||||
|
||||
private final Collection<ScreenLayer> layers = new TreeSet<>();
|
||||
private class LayersClient implements DelegatingClient {
|
||||
|
||||
@SuppressWarnings({ "unchecked", "rawtypes" })
|
||||
@Override
|
||||
public Collection getChildClients()
|
||||
{
|
||||
return layersByEventPriority;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean doesDelegate()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private final Collection<ScreenLayer> layersByZIndex = new TreeSet<>(new Comparator<Overlay>() {
|
||||
|
||||
@Override
|
||||
public int compare(Overlay o1, Overlay o2)
|
||||
{
|
||||
return o1.getZIndex() - o2.getZIndex();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
private final Collection<ScreenLayer> layersByEventPriority = new TreeSet<>(new Comparator<Overlay>() {
|
||||
|
||||
@Override
|
||||
public int compare(Overlay o1, Overlay o2)
|
||||
{
|
||||
return o2.getEventPriority() - o1.getEventPriority();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
private final LayersClient layersClient = new LayersClient();
|
||||
|
||||
|
||||
/**
|
||||
* @param app app access
|
||||
*/
|
||||
public LayeredScreen(AppAccess app)
|
||||
{
|
||||
public LayeredScreen(AppAccess app) {
|
||||
super(app);
|
||||
addChildClient(layersClient);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void renderScreen()
|
||||
{
|
||||
for (final ScreenLayer layer : layers) {
|
||||
for (final ScreenLayer layer : layersByZIndex) {
|
||||
if (layer.isVisible()) layer.render();
|
||||
}
|
||||
}
|
||||
@@ -42,15 +82,15 @@ public abstract class LayeredScreen extends BaseScreen {
|
||||
*/
|
||||
protected void addLayer(ScreenLayer layer)
|
||||
{
|
||||
this.layers.add(layer);
|
||||
addChildClient(layer);
|
||||
this.layersByZIndex.add(layer);
|
||||
this.layersByEventPriority.add(layer);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void onScreenEnter()
|
||||
{
|
||||
for (final ScreenLayer layer : layers) {
|
||||
for (final ScreenLayer layer : layersByEventPriority) {
|
||||
layer.onScreenEnter();
|
||||
}
|
||||
}
|
||||
@@ -59,7 +99,7 @@ public abstract class LayeredScreen extends BaseScreen {
|
||||
@Override
|
||||
protected void onScreenLeave()
|
||||
{
|
||||
for (final ScreenLayer layer : layers) {
|
||||
for (final ScreenLayer layer : layersByEventPriority) {
|
||||
layer.onScreenLeave();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@ import java.util.LinkedHashSet;
|
||||
|
||||
import mightypork.gamecore.control.AppAccess;
|
||||
import mightypork.gamecore.control.AppSubModule;
|
||||
import mightypork.gamecore.control.events.LayoutChangeEvent;
|
||||
import mightypork.gamecore.control.events.gui.LayoutChangeListener;
|
||||
import mightypork.gamecore.gui.Hideable;
|
||||
import mightypork.gamecore.gui.components.layout.ConstraintLayout;
|
||||
import mightypork.gamecore.input.KeyBinder;
|
||||
@@ -24,7 +24,7 @@ import mightypork.util.control.timing.Updateable;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public abstract class Overlay extends AppSubModule implements Updateable, Comparable<Overlay>, Renderable, KeyBinder, Hideable, LayoutChangeEvent.Listener {
|
||||
public abstract class Overlay extends AppSubModule implements Comparable<Overlay>, Updateable, Renderable, KeyBinder, Hideable, LayoutChangeListener {
|
||||
|
||||
private boolean visible = true;
|
||||
private final KeyBindingPool keybindings = new KeyBindingPool();
|
||||
@@ -42,8 +42,7 @@ public abstract class Overlay extends AppSubModule implements Updateable, Compar
|
||||
protected final Collection<Updateable> updated = new LinkedHashSet<>();
|
||||
|
||||
|
||||
public Overlay(AppAccess app)
|
||||
{
|
||||
public Overlay(AppAccess app) {
|
||||
super(app);
|
||||
|
||||
this.mouse = getInput().getMousePos();
|
||||
@@ -84,20 +83,24 @@ public abstract class Overlay extends AppSubModule implements Updateable, Compar
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public final int compareTo(Overlay o)
|
||||
{
|
||||
return getPriority() - o.getPriority();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get rendering priority
|
||||
* Get rendering layer
|
||||
*
|
||||
* @return higher = on top.
|
||||
*/
|
||||
@DefaultImpl
|
||||
public abstract int getPriority();
|
||||
public abstract int getZIndex();
|
||||
|
||||
|
||||
/**
|
||||
* Get event bus listening priority - useful to block incoming events.
|
||||
*
|
||||
* @return higher = first.
|
||||
*/
|
||||
public int getEventPriority()
|
||||
{
|
||||
return getZIndex();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
@@ -120,6 +123,12 @@ public abstract class Overlay extends AppSubModule implements Updateable, Compar
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int compareTo(Overlay o)
|
||||
{
|
||||
return o.getEventPriority() - getEventPriority();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* <p>
|
||||
|
||||
@@ -8,9 +8,10 @@ import java.util.TreeSet;
|
||||
|
||||
import mightypork.gamecore.control.AppAccess;
|
||||
import mightypork.gamecore.control.AppModule;
|
||||
import mightypork.gamecore.control.events.LayoutChangeEvent;
|
||||
import mightypork.gamecore.control.events.ScreenRequestEvent;
|
||||
import mightypork.gamecore.control.events.ViewportChangeEvent;
|
||||
import mightypork.gamecore.control.events.gui.LayoutChangeEvent;
|
||||
import mightypork.gamecore.control.events.gui.ViewportChangeEvent;
|
||||
import mightypork.gamecore.control.events.gui.ViewportChangeListener;
|
||||
import mightypork.gamecore.control.events.requests.ScreenRequestListener;
|
||||
import mightypork.gamecore.render.Renderable;
|
||||
import mightypork.util.annotations.DefaultImpl;
|
||||
import mightypork.util.logging.Log;
|
||||
@@ -21,7 +22,7 @@ import mightypork.util.logging.Log;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class ScreenRegistry extends AppModule implements ScreenRequestEvent.Listener, ViewportChangeEvent.Listener, Renderable {
|
||||
public class ScreenRegistry extends AppModule implements ScreenRequestListener, ViewportChangeListener, Renderable {
|
||||
|
||||
private final Map<String, Screen> screens = new HashMap<>();
|
||||
private final Collection<Overlay> overlays = new TreeSet<>();
|
||||
|
||||
@@ -2,9 +2,9 @@ package mightypork.gamecore.input;
|
||||
|
||||
|
||||
import mightypork.gamecore.control.AppAccess;
|
||||
import mightypork.gamecore.control.events.KeyEvent;
|
||||
import mightypork.gamecore.control.events.MouseButtonEvent;
|
||||
import mightypork.gamecore.control.events.MouseMotionEvent;
|
||||
import mightypork.gamecore.control.events.input.KeyEvent;
|
||||
import mightypork.gamecore.control.events.input.MouseButtonEvent;
|
||||
import mightypork.gamecore.control.events.input.MouseMotionEvent;
|
||||
import mightypork.rogue.events.ActionRequest;
|
||||
import mightypork.rogue.events.ActionRequest.RequestType;
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
package mightypork.gamecore.input;
|
||||
|
||||
|
||||
import mightypork.gamecore.control.events.KeyEvent;
|
||||
import mightypork.gamecore.control.events.input.KeyEvent;
|
||||
import mightypork.gamecore.control.events.input.KeyListener;
|
||||
|
||||
|
||||
/**
|
||||
@@ -9,7 +10,7 @@ import mightypork.gamecore.control.events.KeyEvent;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class KeyBinding implements KeyEvent.Listener {
|
||||
public class KeyBinding implements KeyListener {
|
||||
|
||||
private final KeyStroke keystroke;
|
||||
private Runnable handler;
|
||||
|
||||
@@ -5,7 +5,8 @@ import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.Set;
|
||||
|
||||
import mightypork.gamecore.control.events.KeyEvent;
|
||||
import mightypork.gamecore.control.events.input.KeyEvent;
|
||||
import mightypork.gamecore.control.events.input.KeyListener;
|
||||
import mightypork.util.logging.Log;
|
||||
|
||||
|
||||
@@ -14,7 +15,7 @@ import mightypork.util.logging.Log;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class KeyBindingPool implements KeyBinder, KeyEvent.Listener {
|
||||
public class KeyBindingPool implements KeyBinder, KeyListener {
|
||||
|
||||
private final Set<KeyBinding> bindings = new HashSet<>();
|
||||
|
||||
|
||||
@@ -5,8 +5,8 @@ import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.LinkedBlockingQueue;
|
||||
|
||||
import mightypork.gamecore.control.events.MainLoopTaskRequest;
|
||||
import mightypork.gamecore.control.events.ResourceLoadRequest;
|
||||
import mightypork.gamecore.control.events.requests.MainLoopRequest;
|
||||
import mightypork.gamecore.control.events.requests.ResourceLoadRequestListener;
|
||||
import mightypork.util.annotations.FactoryMethod;
|
||||
import mightypork.util.control.Destroyable;
|
||||
import mightypork.util.control.eventbus.BusAccess;
|
||||
@@ -18,7 +18,7 @@ import mightypork.util.logging.Log;
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class AsyncResourceLoader extends Thread implements ResourceLoadRequest.Listener, Destroyable {
|
||||
public class AsyncResourceLoader extends Thread implements ResourceLoadRequestListener, Destroyable {
|
||||
|
||||
/**
|
||||
* Start a new loader thread.
|
||||
@@ -73,7 +73,7 @@ public class AsyncResourceLoader extends Thread implements ResourceLoadRequest.L
|
||||
} else {
|
||||
Log.f3("<LOADER> Delegating to main thread:\n " + Log.str(resource));
|
||||
|
||||
app.getEventBus().send(new MainLoopTaskRequest(new Runnable() {
|
||||
app.getEventBus().send(new MainLoopRequest(new Runnable() {
|
||||
|
||||
@Override
|
||||
public void run()
|
||||
|
||||
@@ -7,7 +7,7 @@ import java.nio.ByteBuffer;
|
||||
|
||||
import mightypork.gamecore.control.AppAccess;
|
||||
import mightypork.gamecore.control.AppModule;
|
||||
import mightypork.gamecore.control.events.ViewportChangeEvent;
|
||||
import mightypork.gamecore.control.events.gui.ViewportChangeEvent;
|
||||
import mightypork.util.constraints.rect.Rect;
|
||||
import mightypork.util.constraints.rect.proxy.RectBound;
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
|
||||
@@ -5,7 +5,7 @@ import java.util.HashMap;
|
||||
|
||||
import mightypork.gamecore.control.AppAccess;
|
||||
import mightypork.gamecore.control.AppAdapter;
|
||||
import mightypork.gamecore.control.events.ResourceLoadRequest;
|
||||
import mightypork.gamecore.control.events.requests.ResourceLoadRequest;
|
||||
import mightypork.gamecore.render.fonts.impl.DeferredFont;
|
||||
|
||||
import org.newdawn.slick.opengl.Texture;
|
||||
|
||||
@@ -6,7 +6,7 @@ import java.util.Map;
|
||||
|
||||
import mightypork.gamecore.control.AppAccess;
|
||||
import mightypork.gamecore.control.AppAdapter;
|
||||
import mightypork.gamecore.control.events.ResourceLoadRequest;
|
||||
import mightypork.gamecore.control.events.requests.ResourceLoadRequest;
|
||||
import mightypork.util.constraints.rect.Rect;
|
||||
import mightypork.util.error.KeyAlreadyExistsException;
|
||||
|
||||
|
||||
@@ -26,8 +26,8 @@ import mightypork.rogue.world.entity.Entity;
|
||||
import mightypork.rogue.world.item.Item;
|
||||
import mightypork.rogue.world.level.Level;
|
||||
import mightypork.rogue.world.tile.Tile;
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
import mightypork.util.control.eventbus.EventBus;
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.ion.Ion;
|
||||
import mightypork.util.logging.Log;
|
||||
import mightypork.util.logging.writers.LogWriter;
|
||||
@@ -139,7 +139,7 @@ public final class App extends BaseApp {
|
||||
}
|
||||
|
||||
|
||||
private void bindToKey(final Event<?> event, int... keys)
|
||||
private void bindToKey(final BusEvent<?> event, int... keys)
|
||||
{
|
||||
getInput().bindKey(new KeyStroke(keys), new Runnable() {
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package mightypork.rogue.events;
|
||||
|
||||
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.SingleReceiverEvent;
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@ import mightypork.util.control.eventbus.events.flags.SingleReceiverEvent;
|
||||
* @author MightyPork
|
||||
*/
|
||||
@SingleReceiverEvent
|
||||
public class ActionRequest implements Event<ActionRequest.Listener> {
|
||||
public class ActionRequest extends BusEvent<ActionRequest.Listener> {
|
||||
|
||||
private final RequestType type;
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ package mightypork.rogue.screens;
|
||||
|
||||
|
||||
import mightypork.gamecore.control.AppAccess;
|
||||
import mightypork.gamecore.control.events.ScreenRequestEvent;
|
||||
import mightypork.gamecore.control.events.requests.ScreenRequestEvent;
|
||||
import mightypork.gamecore.gui.components.painters.QuadPainter;
|
||||
import mightypork.gamecore.gui.screens.Overlay;
|
||||
import mightypork.rogue.events.ActionRequest;
|
||||
@@ -62,7 +62,7 @@ public class CrossfadeOverlay extends Overlay implements CrossfadeRequest.Listen
|
||||
|
||||
|
||||
@Override
|
||||
public int getPriority()
|
||||
public int getZIndex()
|
||||
{
|
||||
return Integer.MAX_VALUE - 1; // let FPS go on top
|
||||
}
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
package mightypork.rogue.screens;
|
||||
|
||||
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.BusEvent;
|
||||
|
||||
|
||||
/**
|
||||
* @author MightyPork
|
||||
*/
|
||||
public class CrossfadeRequest implements Event<CrossfadeRequest.Listener> {
|
||||
public class CrossfadeRequest extends BusEvent<CrossfadeRequest.Listener> {
|
||||
|
||||
private final String screen;
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ public class FpsOverlay extends Overlay {
|
||||
|
||||
|
||||
@Override
|
||||
public int getPriority()
|
||||
public int getZIndex()
|
||||
{
|
||||
return Integer.MAX_VALUE;
|
||||
}
|
||||
|
||||
+5
-3
@@ -7,13 +7,15 @@ import mightypork.gamecore.gui.components.painters.ImagePainter;
|
||||
import mightypork.gamecore.gui.screens.Screen;
|
||||
import mightypork.gamecore.gui.screens.ScreenLayer;
|
||||
import mightypork.rogue.Res;
|
||||
import mightypork.rogue.screens.gamescreen.gui.HeartBar;
|
||||
import mightypork.rogue.screens.gamescreen.gui.NavItemSlot;
|
||||
import mightypork.util.constraints.num.Num;
|
||||
import mightypork.util.constraints.rect.Rect;
|
||||
|
||||
|
||||
public class GameGui extends ScreenLayer {
|
||||
public class HudLayer extends ScreenLayer {
|
||||
|
||||
public GameGui(Screen screen)
|
||||
public HudLayer(Screen screen)
|
||||
{
|
||||
super(screen);
|
||||
|
||||
@@ -48,7 +50,7 @@ public class GameGui extends ScreenLayer {
|
||||
|
||||
|
||||
@Override
|
||||
public int getPriority()
|
||||
public int getZIndex()
|
||||
{
|
||||
return 100;
|
||||
}
|
||||
@@ -1,18 +1,60 @@
|
||||
package mightypork.rogue.screens.gamescreen;
|
||||
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Random;
|
||||
|
||||
import mightypork.gamecore.control.AppAccess;
|
||||
import mightypork.gamecore.gui.screens.LayeredScreen;
|
||||
import mightypork.rogue.Paths;
|
||||
import mightypork.rogue.world.MapGenerator;
|
||||
import mightypork.rogue.world.World;
|
||||
import mightypork.util.ion.Ion;
|
||||
|
||||
|
||||
public class ScreenGame extends LayeredScreen {
|
||||
|
||||
public ScreenGame(AppAccess app)
|
||||
{
|
||||
public ScreenGame(AppAccess app) {
|
||||
super(app);
|
||||
|
||||
addLayer(new WorldLayer(this)); //TODO with provided world
|
||||
addLayer(new GameGui(this));
|
||||
addLayer(new WorldLayer(this, obtainWorld())); //TODO with provided world
|
||||
addLayer(new HudLayer(this));
|
||||
}
|
||||
|
||||
|
||||
private World obtainWorld()
|
||||
{
|
||||
|
||||
// FIXME just temporary test here
|
||||
|
||||
final Random rand = new Random();
|
||||
final File f = new File(Paths.WORKDIR, "test-world.ion");
|
||||
|
||||
// SAVE
|
||||
|
||||
World world = MapGenerator.createWorld(rand.nextLong());
|
||||
addChildClient(world);
|
||||
|
||||
try {
|
||||
Ion.toFile(f, world);
|
||||
} catch (final IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
// LOAD
|
||||
|
||||
// final World w;
|
||||
//
|
||||
// try {
|
||||
// world = Ion.fromFile(f, World.class);
|
||||
// } catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
// System.exit(1);
|
||||
// return;
|
||||
// }
|
||||
|
||||
return world;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,115 +0,0 @@
|
||||
package mightypork.rogue.screens.gamescreen;
|
||||
|
||||
|
||||
import mightypork.rogue.world.PlayerControl;
|
||||
import mightypork.rogue.world.World;
|
||||
import mightypork.rogue.world.WorldPos;
|
||||
import mightypork.rogue.world.entity.Entity;
|
||||
import mightypork.rogue.world.entity.models.EntityMoveListener;
|
||||
import mightypork.rogue.world.level.Level;
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
import mightypork.util.math.Polar;
|
||||
import mightypork.util.math.Calc.Deg;
|
||||
import mightypork.gamecore.control.events.KeyEvent;
|
||||
import mightypork.gamecore.control.events.MouseButtonEvent;
|
||||
import mightypork.gamecore.input.InputSystem;
|
||||
import mightypork.gamecore.input.Keys;
|
||||
|
||||
|
||||
public class WRBasicControls extends WorldRenderComponent implements KeyEvent.Listener, MouseButtonEvent.Listener, EntityMoveListener {
|
||||
|
||||
private final PlayerControl pc;
|
||||
|
||||
|
||||
public WRBasicControls(World world) {
|
||||
super(world);
|
||||
pc = world.getPlayerControl();
|
||||
pc.addMoveListener(this);
|
||||
}
|
||||
|
||||
|
||||
private void handleHeldKey()
|
||||
{
|
||||
if (InputSystem.isKeyDown(Keys.LEFT)) {
|
||||
pc.walkWest();
|
||||
} else if (InputSystem.isKeyDown(Keys.RIGHT)) {
|
||||
pc.walkEast();
|
||||
} else if (InputSystem.isKeyDown(Keys.UP)) {
|
||||
pc.walkNorth();
|
||||
} else if (InputSystem.isKeyDown(Keys.DOWN)) {
|
||||
pc.walkSouth();
|
||||
}
|
||||
|
||||
if(InputSystem.isMouseButtonDown(0)) {
|
||||
walkByMouse(InputSystem.getMousePos());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onStepFinished(Entity entity, World world, Level level)
|
||||
{
|
||||
handleHeldKey();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onPathFinished(Entity entity, World world, Level level)
|
||||
{
|
||||
handleHeldKey();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onPathInterrupted(Entity entity, World world, Level level)
|
||||
{
|
||||
handleHeldKey();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void receive(MouseButtonEvent event)
|
||||
{
|
||||
if (!event.isDown()) return;
|
||||
|
||||
walkByMouse(event.getPos());
|
||||
}
|
||||
|
||||
|
||||
private void walkByMouse(Vect mouse)
|
||||
{
|
||||
|
||||
WorldPos clicked = toWorldPos(mouse);
|
||||
WorldPos plpos = pc.getPos();
|
||||
|
||||
Polar p = Polar.fromCoord(clicked.x - plpos.x, clicked.y - plpos.y);
|
||||
|
||||
int dir = Deg.round90(p.getAngleDeg()) / 90;
|
||||
|
||||
switch (dir) {
|
||||
case 0:
|
||||
pc.walkEast();
|
||||
return;
|
||||
|
||||
case 1:
|
||||
pc.walkSouth();
|
||||
return;
|
||||
|
||||
case 2:
|
||||
pc.walkWest();
|
||||
return;
|
||||
|
||||
case 3:
|
||||
pc.walkNorth();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void receive(KeyEvent event)
|
||||
{
|
||||
handleHeldKey();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,64 +1,31 @@
|
||||
package mightypork.rogue.screens.gamescreen;
|
||||
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.Random;
|
||||
|
||||
import mightypork.gamecore.gui.components.InputComponent;
|
||||
import mightypork.gamecore.gui.screens.Screen;
|
||||
import mightypork.gamecore.gui.screens.ScreenLayer;
|
||||
import mightypork.rogue.Paths;
|
||||
import mightypork.rogue.world.MapGenerator;
|
||||
import mightypork.rogue.screens.gamescreen.world.MIPKeyWalk;
|
||||
import mightypork.rogue.screens.gamescreen.world.MIPMouseWalk;
|
||||
import mightypork.rogue.screens.gamescreen.world.MapView;
|
||||
import mightypork.rogue.world.World;
|
||||
import mightypork.util.constraints.num.Num;
|
||||
import mightypork.util.ion.Ion;
|
||||
|
||||
|
||||
public class WorldLayer extends ScreenLayer {
|
||||
|
||||
private World world;
|
||||
private InputComponent worldView;
|
||||
private MapView worldView;
|
||||
|
||||
|
||||
public WorldLayer(Screen screen) {
|
||||
super(screen);
|
||||
|
||||
// FIXME just temporary test here
|
||||
|
||||
final Random rand = new Random();
|
||||
final File f = new File(Paths.WORKDIR, "test-world.ion");
|
||||
|
||||
// SAVE
|
||||
|
||||
world = MapGenerator.createWorld(rand.nextLong());
|
||||
updated.add(world);
|
||||
|
||||
try {
|
||||
Ion.toFile(f, world);
|
||||
} catch (final IOException e) {
|
||||
e.printStackTrace();
|
||||
System.exit(1); // fail
|
||||
return;
|
||||
}
|
||||
|
||||
// LOAD
|
||||
|
||||
// final World w;
|
||||
//
|
||||
// try {
|
||||
// world = Ion.fromFile(f, World.class);
|
||||
// } catch (IOException e) {
|
||||
// e.printStackTrace();
|
||||
// System.exit(1);
|
||||
// return;
|
||||
// }
|
||||
|
||||
|
||||
public WorldLayer(Screen screen, World world) {
|
||||
super(screen);
|
||||
|
||||
// render component
|
||||
|
||||
worldView = new WRBasicControls(world);
|
||||
worldView = new MapView(world);
|
||||
|
||||
// map input plugins
|
||||
worldView.addPlugin(new MIPKeyWalk());
|
||||
worldView.addPlugin(new MIPMouseWalk());
|
||||
|
||||
|
||||
// size of lower navbar
|
||||
final Num lownav = root.width().min(root.height()).max(700).perc(7);
|
||||
@@ -69,7 +36,7 @@ public class WorldLayer extends ScreenLayer {
|
||||
|
||||
|
||||
@Override
|
||||
public int getPriority()
|
||||
public int getZIndex()
|
||||
{
|
||||
return -1; // stay down
|
||||
}
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
package mightypork.rogue.screens.gamescreen;
|
||||
|
||||
|
||||
import mightypork.gamecore.gui.components.InputComponent;
|
||||
import mightypork.rogue.world.World;
|
||||
import mightypork.rogue.world.WorldPos;
|
||||
import mightypork.rogue.world.WorldRenderer;
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
|
||||
|
||||
public class WorldRenderComponent extends InputComponent {
|
||||
|
||||
protected final WorldRenderer worldRenderer;
|
||||
protected final World world;
|
||||
|
||||
|
||||
public WorldRenderComponent(World world) {
|
||||
this.world = world;
|
||||
this.worldRenderer = new WorldRenderer(world, this, 8, 6, 72);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void renderComponent()
|
||||
{
|
||||
worldRenderer.render();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void updateLayout()
|
||||
{
|
||||
worldRenderer.poll(); // update sizing
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get tile coord at a screen position
|
||||
*/
|
||||
public WorldPos toWorldPos(Vect pos)
|
||||
{
|
||||
return worldRenderer.getClickedTile(pos);
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package mightypork.rogue.screens.gamescreen;
|
||||
package mightypork.rogue.screens.gamescreen.gui;
|
||||
|
||||
|
||||
import mightypork.gamecore.gui.AlignX;
|
||||
+4
-3
@@ -1,7 +1,8 @@
|
||||
package mightypork.rogue.screens.gamescreen;
|
||||
package mightypork.rogue.screens.gamescreen.gui;
|
||||
|
||||
|
||||
import mightypork.gamecore.control.events.MouseMotionEvent;
|
||||
import mightypork.gamecore.control.events.input.MouseMotionEvent;
|
||||
import mightypork.gamecore.control.events.input.MouseMotionListener;
|
||||
import mightypork.gamecore.gui.components.ClickableComponent;
|
||||
import mightypork.gamecore.render.Render;
|
||||
import mightypork.gamecore.render.textures.TxQuad;
|
||||
@@ -15,7 +16,7 @@ import mightypork.util.control.timing.Updateable;
|
||||
import mightypork.util.math.Easing;
|
||||
|
||||
|
||||
public class NavItemSlot extends ClickableComponent implements MouseMotionEvent.Listener, Updateable {
|
||||
public class NavItemSlot extends ClickableComponent implements MouseMotionListener, Updateable {
|
||||
|
||||
private final TxQuad image;
|
||||
private final TxQuad frame;
|
||||
@@ -0,0 +1,45 @@
|
||||
package mightypork.rogue.screens.gamescreen.world;
|
||||
|
||||
|
||||
import mightypork.gamecore.input.InputSystem;
|
||||
import mightypork.gamecore.input.Keys;
|
||||
import mightypork.rogue.world.PlayerControl;
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
|
||||
|
||||
public class MIPKeyWalk implements MapInteractionPlugin {
|
||||
|
||||
@Override
|
||||
public void onStepEnd(MapView wv, PlayerControl player)
|
||||
{
|
||||
walkByKey(player);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onClick(MapView wv, PlayerControl player, Vect mouse)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onKey(MapView wv, PlayerControl player, int key)
|
||||
{
|
||||
walkByKey(player);
|
||||
}
|
||||
|
||||
|
||||
private void walkByKey(PlayerControl player)
|
||||
{
|
||||
if (InputSystem.isKeyDown(Keys.LEFT)) {
|
||||
player.goWest();
|
||||
} else if (InputSystem.isKeyDown(Keys.RIGHT)) {
|
||||
player.goEast();
|
||||
} else if (InputSystem.isKeyDown(Keys.UP)) {
|
||||
player.goNorth();
|
||||
} else if (InputSystem.isKeyDown(Keys.DOWN)) {
|
||||
player.goSouth();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,59 @@
|
||||
package mightypork.rogue.screens.gamescreen.world;
|
||||
|
||||
|
||||
import mightypork.gamecore.input.InputSystem;
|
||||
import mightypork.rogue.world.PlayerControl;
|
||||
import mightypork.rogue.world.WorldPos;
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
import mightypork.util.math.Polar;
|
||||
import mightypork.util.math.Calc.Deg;
|
||||
|
||||
|
||||
public class MIPMouseWalk implements MapInteractionPlugin {
|
||||
|
||||
@Override
|
||||
public void onStepEnd(MapView wv, PlayerControl player)
|
||||
{
|
||||
if (InputSystem.isMouseButtonDown(0)) {
|
||||
// walk by holding btn
|
||||
onClick(wv, player, InputSystem.getMousePos());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onClick(MapView wv, PlayerControl player, Vect mouse)
|
||||
{
|
||||
WorldPos plpos = player.getPos();
|
||||
WorldPos clicked = wv.toWorldPos(mouse);
|
||||
|
||||
Polar p = Polar.fromCoord(clicked.x - plpos.x, clicked.y - plpos.y);
|
||||
|
||||
int dir = Deg.round90(p.getAngleDeg()) / 90;
|
||||
|
||||
switch (dir) {
|
||||
case 0:
|
||||
player.goEast();
|
||||
return;
|
||||
|
||||
case 1:
|
||||
player.goSouth();
|
||||
return;
|
||||
|
||||
case 2:
|
||||
player.goWest();
|
||||
return;
|
||||
|
||||
case 3:
|
||||
player.goNorth();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onKey(MapView wv, PlayerControl player, int key)
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package mightypork.rogue.screens.gamescreen.world;
|
||||
|
||||
|
||||
import mightypork.rogue.world.PlayerControl;
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
|
||||
|
||||
public interface MapInteractionPlugin {
|
||||
|
||||
void onStepEnd(MapView wv, PlayerControl player);
|
||||
|
||||
|
||||
void onClick(MapView wv, PlayerControl player, Vect mouse);
|
||||
|
||||
|
||||
void onKey(MapView wv, PlayerControl player, int key);
|
||||
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
package mightypork.rogue.screens.gamescreen.world;
|
||||
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import mightypork.gamecore.control.events.input.KeyEvent;
|
||||
import mightypork.gamecore.control.events.input.KeyListener;
|
||||
import mightypork.gamecore.control.events.input.MouseButtonEvent;
|
||||
import mightypork.gamecore.control.events.input.MouseButtonListener;
|
||||
import mightypork.gamecore.gui.components.InputComponent;
|
||||
import mightypork.rogue.world.PlayerControl;
|
||||
import mightypork.rogue.world.World;
|
||||
import mightypork.rogue.world.WorldPos;
|
||||
import mightypork.rogue.world.WorldRenderer;
|
||||
import mightypork.rogue.world.entity.Entity;
|
||||
import mightypork.rogue.world.entity.models.EntityMoveListener;
|
||||
import mightypork.rogue.world.level.Level;
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
|
||||
|
||||
public class MapView extends InputComponent implements KeyListener, MouseButtonListener, EntityMoveListener {
|
||||
|
||||
protected final WorldRenderer worldRenderer;
|
||||
protected final World world;
|
||||
private final PlayerControl pc;
|
||||
|
||||
private final Set<MapInteractionPlugin> plugins = new HashSet<>();
|
||||
|
||||
|
||||
public MapView(World world) {
|
||||
this.world = world;
|
||||
this.worldRenderer = new WorldRenderer(world, this, 8, 6, 72);
|
||||
pc = world.getPlayerControl();
|
||||
pc.addMoveListener(this);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
protected void renderComponent()
|
||||
{
|
||||
worldRenderer.render();
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void updateLayout()
|
||||
{
|
||||
worldRenderer.poll(); // update sizing
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get tile coord at a screen position
|
||||
*
|
||||
* @param pos position on screen (px)
|
||||
* @return position on map (tiles)
|
||||
*/
|
||||
public WorldPos toWorldPos(Vect pos)
|
||||
{
|
||||
return worldRenderer.getClickedTile(pos);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onStepFinished(Entity entity, World world, Level level)
|
||||
{
|
||||
for (MapInteractionPlugin p : plugins) {
|
||||
p.onStepEnd(this, pc);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onPathFinished(Entity entity, World world, Level level)
|
||||
{
|
||||
for (MapInteractionPlugin p : plugins) {
|
||||
p.onStepEnd(this, pc);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void onPathInterrupted(Entity entity, World world, Level level)
|
||||
{
|
||||
for (MapInteractionPlugin p : plugins) {
|
||||
p.onStepEnd(this, pc);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void receive(MouseButtonEvent event)
|
||||
{
|
||||
if (!event.isOver(this)) return;
|
||||
|
||||
if (!event.isUp()) return; // only btn-release evt
|
||||
|
||||
for (MapInteractionPlugin p : plugins) {
|
||||
p.onClick(this, pc, event.getPos());
|
||||
}
|
||||
|
||||
event.consume(); // only our clicks.
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void receive(KeyEvent event)
|
||||
{
|
||||
if (!event.isDown()) return;
|
||||
|
||||
for (MapInteractionPlugin p : plugins) {
|
||||
p.onKey(this, pc, event.getKey());
|
||||
}
|
||||
|
||||
// don't consume key events, can be useful for others.
|
||||
}
|
||||
|
||||
|
||||
public void addPlugin(MapInteractionPlugin plugin)
|
||||
{
|
||||
plugins.add(plugin);
|
||||
}
|
||||
}
|
||||
@@ -112,7 +112,7 @@ class MenuLayer extends ScreenLayer {
|
||||
|
||||
|
||||
@Override
|
||||
public int getPriority()
|
||||
public int getZIndex()
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ public class LayerBouncyBoxes extends ScreenLayer {
|
||||
|
||||
|
||||
@Override
|
||||
public int getPriority()
|
||||
public int getZIndex()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ public class LayerColor extends ScreenLayer {
|
||||
|
||||
|
||||
@Override
|
||||
public int getPriority()
|
||||
public int getZIndex()
|
||||
{
|
||||
return Integer.MIN_VALUE;
|
||||
}
|
||||
|
||||
@@ -3,7 +3,8 @@ package mightypork.rogue.screens.test_cat_sound;
|
||||
|
||||
import java.util.Random;
|
||||
|
||||
import mightypork.gamecore.control.events.MouseButtonEvent;
|
||||
import mightypork.gamecore.control.events.input.MouseButtonEvent;
|
||||
import mightypork.gamecore.control.events.input.MouseButtonListener;
|
||||
import mightypork.gamecore.gui.AlignX;
|
||||
import mightypork.gamecore.gui.components.painters.ImagePainter;
|
||||
import mightypork.gamecore.gui.components.painters.QuadPainter;
|
||||
@@ -21,7 +22,7 @@ import mightypork.util.math.Easing;
|
||||
import mightypork.util.math.color.Color;
|
||||
|
||||
|
||||
public class LayerFlyingCat extends ScreenLayer implements MouseButtonEvent.Listener {
|
||||
public class LayerFlyingCat extends ScreenLayer implements MouseButtonListener {
|
||||
|
||||
private final NumAnimated size = new NumAnimated(300, Easing.SINE_BOTH);
|
||||
private final VectAnimated cat_position = VectAnimated.makeVar(Easing.ELASTIC_OUT);
|
||||
@@ -99,7 +100,7 @@ public class LayerFlyingCat extends ScreenLayer implements MouseButtonEvent.List
|
||||
|
||||
|
||||
@Override
|
||||
public int getPriority()
|
||||
public int getZIndex()
|
||||
{
|
||||
return 10;
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ public class LayerTestGradient extends ScreenLayer {
|
||||
|
||||
|
||||
@Override
|
||||
public int getPriority()
|
||||
public int getZIndex()
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@ package mightypork.rogue.world;
|
||||
|
||||
|
||||
import mightypork.rogue.world.entity.models.EntityMoveListener;
|
||||
import mightypork.rogue.world.level.Level;
|
||||
|
||||
|
||||
public class PlayerControl {
|
||||
@@ -9,50 +10,55 @@ public class PlayerControl {
|
||||
private final World world;
|
||||
|
||||
|
||||
public PlayerControl(World w)
|
||||
{
|
||||
public PlayerControl(World w) {
|
||||
this.world = w;
|
||||
}
|
||||
|
||||
|
||||
public void walkNorth()
|
||||
public void goNorth()
|
||||
{
|
||||
world.playerEntity.addStep(PathStep.NORTH);
|
||||
world.getPlayerEntity().addStep(PathStep.NORTH);
|
||||
}
|
||||
|
||||
|
||||
public void walkSouth()
|
||||
public void goSouth()
|
||||
{
|
||||
world.playerEntity.addStep(PathStep.SOUTH);
|
||||
world.getPlayerEntity().addStep(PathStep.SOUTH);
|
||||
}
|
||||
|
||||
|
||||
public void walkEast()
|
||||
public void goEast()
|
||||
{
|
||||
world.playerEntity.addStep(PathStep.EAST);
|
||||
world.getPlayerEntity().addStep(PathStep.EAST);
|
||||
}
|
||||
|
||||
|
||||
public void walkWest()
|
||||
public void goWest()
|
||||
{
|
||||
world.playerEntity.addStep(PathStep.WEST);
|
||||
world.getPlayerEntity().addStep(PathStep.WEST);
|
||||
}
|
||||
|
||||
|
||||
public void addMoveListener(EntityMoveListener eml)
|
||||
{
|
||||
world.playerEntity.addMoveListener(eml);
|
||||
world.getPlayerEntity().addMoveListener(eml);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public WorldPos getPos()
|
||||
{
|
||||
return world.playerEntity.getPosition();
|
||||
return world.getPlayerEntity().getPosition();
|
||||
}
|
||||
|
||||
|
||||
public void walk(PathStep step)
|
||||
|
||||
|
||||
public World getWorld()
|
||||
{
|
||||
world.playerEntity.addStep(step);
|
||||
return world;
|
||||
}
|
||||
|
||||
|
||||
public Level getLevel()
|
||||
{
|
||||
return world.getCurrentLevel();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,8 +21,8 @@ public class World implements IonBundled, Updateable {
|
||||
|
||||
private final ArrayList<Level> levels = new ArrayList<>();
|
||||
|
||||
final PlayerInfo player = new PlayerInfo();
|
||||
Entity playerEntity;
|
||||
private final PlayerInfo playerInfo = new PlayerInfo();
|
||||
private Entity playerEntity;
|
||||
|
||||
private final PlayerControl control = new PlayerControl(this);
|
||||
|
||||
@@ -36,9 +36,9 @@ public class World implements IonBundled, Updateable {
|
||||
seed = in.get("seed", 0L);
|
||||
eid = in.get("next_eid", 0);
|
||||
in.loadSequence("levels", levels);
|
||||
in.loadBundled("player", player);
|
||||
in.loadBundled("player", playerInfo);
|
||||
|
||||
playerEntity = levels.get(player.getLevel()).getEntity(player.getEID());
|
||||
playerEntity = levels.get(playerInfo.getLevel()).getEntity(playerInfo.getEID());
|
||||
}
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ public class World implements IonBundled, Updateable {
|
||||
out.put("seed", seed);
|
||||
out.put("next_eid", eid);
|
||||
out.putSequence("levels", levels);
|
||||
out.putBundled("player", player);
|
||||
out.putBundled("player", playerInfo);
|
||||
}
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ public class World implements IonBundled, Updateable {
|
||||
|
||||
public void createPlayer(int x, int y, int level)
|
||||
{
|
||||
if (player.isInitialized()) {
|
||||
if (playerInfo.isInitialized()) {
|
||||
throw new RuntimeException("Player already created.");
|
||||
}
|
||||
|
||||
@@ -97,8 +97,8 @@ public class World implements IonBundled, Updateable {
|
||||
|
||||
playerEntity = Entities.PLAYER.createEntity(playerEid, new WorldPos(x, y));
|
||||
|
||||
player.setLevel(level);
|
||||
player.setEID(playerEid);
|
||||
playerInfo.setLevel(level);
|
||||
playerInfo.setEID(playerEid);
|
||||
|
||||
levels.get(level).addEntity(playerEntity);
|
||||
}
|
||||
@@ -106,7 +106,7 @@ public class World implements IonBundled, Updateable {
|
||||
|
||||
public Level getCurrentLevel()
|
||||
{
|
||||
return levels.get(player.getLevel());
|
||||
return levels.get(playerInfo.getLevel());
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@ import mightypork.util.constraints.rect.RectConst;
|
||||
import mightypork.util.constraints.rect.caching.RectCache;
|
||||
import mightypork.util.constraints.rect.proxy.RectProxy;
|
||||
import mightypork.util.constraints.vect.Vect;
|
||||
import mightypork.util.constraints.vect.VectConst;
|
||||
import mightypork.util.constraints.vect.caching.VectCache;
|
||||
import mightypork.util.math.color.RGB;
|
||||
|
||||
@@ -42,12 +43,14 @@ public class WorldRenderer extends RectProxy implements Pollable {
|
||||
private final Rect topShadow;
|
||||
private final Rect bottomShadow;
|
||||
|
||||
private TileRenderContext trc;
|
||||
|
||||
|
||||
public WorldRenderer(World world, Rect viewport, int xTiles, int yTiles, int minTileSize) {
|
||||
super(viewport);
|
||||
|
||||
this.world = world;
|
||||
this.player = world.playerEntity;
|
||||
this.player = world.getPlayerEntity();
|
||||
|
||||
tileSize = width().div(xTiles).min(height().div(yTiles)).max(minTileSize).cached();
|
||||
|
||||
@@ -62,11 +65,11 @@ public class WorldRenderer extends RectProxy implements Pollable {
|
||||
topShadow = topEdge().growDown(grY);
|
||||
bottomShadow = bottomEdge().growUp(grY);
|
||||
|
||||
setupMapRect();
|
||||
rebuildTiles();
|
||||
}
|
||||
|
||||
|
||||
private void setupMapRect()
|
||||
private void rebuildTiles()
|
||||
{
|
||||
Level level = world.getCurrentLevel();
|
||||
|
||||
@@ -74,29 +77,30 @@ public class WorldRenderer extends RectProxy implements Pollable {
|
||||
activeLevel = level;
|
||||
|
||||
mapRect = Rect.make(vpCenter, tileSize.mul(level.getWidth()), tileSize.mul(level.getHeight())).cached();
|
||||
|
||||
trc = new TileRenderContext(activeLevel, mapRect);
|
||||
}
|
||||
|
||||
|
||||
private RectConst getCurrentDrawRect()
|
||||
private int[] getOffset()
|
||||
{
|
||||
|
||||
WorldPos pos = player.getPosition();
|
||||
final double playerX = pos.getVisualX();
|
||||
final double playerY = pos.getVisualY();
|
||||
|
||||
double ts = tileSize.value();
|
||||
|
||||
final RectConst drawRect = mapRect.move(-ts * playerX, -ts * playerY).freeze();
|
||||
|
||||
return drawRect;
|
||||
return new int[]{(int) (-ts * playerX), (int) (-ts * playerY)};
|
||||
}
|
||||
|
||||
|
||||
public void render()
|
||||
{
|
||||
setupMapRect();
|
||||
int[] off = getOffset();
|
||||
System.out.println(trc.getRectForTile(10, 10));
|
||||
|
||||
final TileRenderContext rc = new TileRenderContext(activeLevel, getCurrentDrawRect());
|
||||
Render.pushMatrix();
|
||||
Render.translate(off[0], off[1]);
|
||||
|
||||
// tiles to render
|
||||
final WorldPos pos = player.getPosition();
|
||||
@@ -117,9 +121,9 @@ public class WorldRenderer extends RectProxy implements Pollable {
|
||||
Render.enterBatchTexturedQuadMode(Res.getTexture("tiles16"));
|
||||
}
|
||||
|
||||
for (rc.y = y1; rc.y <= y2; rc.y++) {
|
||||
for (rc.x = x1; rc.x <= x2; rc.x++) {
|
||||
rc.renderTile();
|
||||
for (trc.y = y1; trc.y <= y2; trc.y++) {
|
||||
for (trc.x = x1; trc.x <= x2; trc.x++) {
|
||||
trc.renderTile();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,9 +133,9 @@ public class WorldRenderer extends RectProxy implements Pollable {
|
||||
|
||||
// === ITEMS ON TILES ===
|
||||
|
||||
for (rc.y = y1; rc.y <= y2; rc.y++) {
|
||||
for (rc.x = x1; rc.x <= x2; rc.x++) {
|
||||
rc.renderItems();
|
||||
for (trc.y = y1; trc.y <= y2; trc.y++) {
|
||||
for (trc.x = x1; trc.x <= x2; trc.x++) {
|
||||
trc.renderItems();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -146,9 +150,11 @@ public class WorldRenderer extends RectProxy implements Pollable {
|
||||
if (x < x1 - ts || x > x2 + ts) continue;
|
||||
if (y < y1 - ts || y > y2 + ts) continue;
|
||||
|
||||
e.render(rc);
|
||||
e.render(trc);
|
||||
}
|
||||
|
||||
Render.popMatrix();
|
||||
|
||||
// === OVERLAY SHADOW ===
|
||||
|
||||
Render.quadGradH(leftShadow, RGB.BLACK, RGB.NONE);
|
||||
@@ -161,9 +167,9 @@ public class WorldRenderer extends RectProxy implements Pollable {
|
||||
|
||||
public WorldPos getClickedTile(Vect clickPos)
|
||||
{
|
||||
RectConst drawRect = getCurrentDrawRect();
|
||||
Vect v = clickPos.sub(drawRect.origin());
|
||||
int ts = (int)tileSize.value();
|
||||
int[] off = getOffset();
|
||||
Vect v = clickPos.sub(mapRect.origin().add(off[0], off[1]));
|
||||
int ts = (int) tileSize.value();
|
||||
return new WorldPos(v.xi() / ts, v.yi() / ts);
|
||||
}
|
||||
|
||||
@@ -176,6 +182,8 @@ public class WorldRenderer extends RectProxy implements Pollable {
|
||||
tileSize.poll();
|
||||
|
||||
mapRect.poll();
|
||||
|
||||
rebuildTiles();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package mightypork.rogue.world.level.render;
|
||||
|
||||
import mightypork.rogue.world.level.MapAccess;
|
||||
import mightypork.util.constraints.rect.Rect;
|
||||
import mightypork.util.constraints.rect.RectConst;
|
||||
import mightypork.util.constraints.rect.builders.TiledRect;
|
||||
|
||||
|
||||
@@ -12,18 +13,33 @@ public abstract class MapRenderContext {
|
||||
protected final TiledRect tiler;
|
||||
private final Rect mapRect;
|
||||
|
||||
private RectConst tileRects[][];
|
||||
|
||||
public MapRenderContext(MapAccess map, Rect drawArea)
|
||||
{
|
||||
|
||||
public MapRenderContext(MapAccess map, Rect drawArea) {
|
||||
this.map = map;
|
||||
this.tiler = drawArea.tiles(map.getWidth(), map.getHeight());
|
||||
this.mapRect = drawArea;
|
||||
|
||||
tileRects = new RectConst[map.getHeight()][map.getWidth()];
|
||||
|
||||
rebuildTileRects();
|
||||
}
|
||||
|
||||
|
||||
public void rebuildTileRects()
|
||||
{
|
||||
for(int y=0;y<map.getHeight();y++) {
|
||||
for(int x=0;x<map.getWidth();x++) {
|
||||
tileRects[y][x] = tiler.tile(x, y).freeze();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Rect getRectForTile(int x, int y)
|
||||
{
|
||||
return tiler.tile(x, y);
|
||||
return tileRects[y][x];
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ package mightypork.util.constraints;
|
||||
public abstract class DigestCache<D> implements Digestable<D> {
|
||||
|
||||
private D last_digest;
|
||||
private boolean caching_enabled;
|
||||
private boolean caching_enabled = false;
|
||||
private boolean dirty = true;
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
package mightypork.util.control.eventbus;
|
||||
|
||||
|
||||
import mightypork.util.control.eventbus.events.flags.DelayedEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.ImmediateEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.NonConsumableEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.SingleReceiverEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.UnloggedEvent;
|
||||
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Event that can be handled by HANDLER, subscribing to the event bus.
|
||||
* </p>
|
||||
* <p>
|
||||
* Can be annotated as {@link SingleReceiverEvent} to be delivered once only,
|
||||
* and {@link DelayedEvent} or {@link ImmediateEvent} to specify default sending
|
||||
* mode. When marked as {@link UnloggedEvent}, it will not appear in detailed
|
||||
* bus logging (useful for very frequent events, such as UpdateEvent).
|
||||
* </p>
|
||||
* <p>
|
||||
* Events annotated as {@link NonConsumableEvent} will throw an exception upon
|
||||
* an attempt to consume them.
|
||||
* </p>
|
||||
* <p>
|
||||
* Default sending mode (if not changed by annotations) is <i>queued</i> with
|
||||
* zero delay.
|
||||
* </p>
|
||||
*
|
||||
* @author MightyPork
|
||||
* @param <HANDLER> handler type
|
||||
*/
|
||||
public abstract class BusEvent<HANDLER> {
|
||||
|
||||
private boolean consumed;
|
||||
private boolean served;
|
||||
|
||||
|
||||
/**
|
||||
* Ask handler to handle this message.
|
||||
*
|
||||
* @param handler handler instance
|
||||
*/
|
||||
protected abstract void handleBy(HANDLER handler);
|
||||
|
||||
|
||||
/**
|
||||
* Consume the event, so no other clients will receive it.
|
||||
*
|
||||
* @throws UnsupportedOperationException if the {@link NonConsumableEvent}
|
||||
* annotation is present.
|
||||
*/
|
||||
public final void consume()
|
||||
{
|
||||
System.out.println("consume "+getClass());
|
||||
if (consumed) throw new IllegalStateException("Already consumed.");
|
||||
|
||||
if (getClass().isAnnotationPresent(NonConsumableEvent.class)) {
|
||||
throw new UnsupportedOperationException("Not consumable.");
|
||||
}
|
||||
|
||||
consumed = true;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Deliver to a handler using the handleBy method.
|
||||
*
|
||||
* @param handler handler instance
|
||||
*/
|
||||
final void deliverTo(HANDLER handler)
|
||||
{
|
||||
handleBy(handler);
|
||||
|
||||
if (!served) {
|
||||
if (getClass().isAnnotationPresent(SingleReceiverEvent.class)) {
|
||||
consumed = true;
|
||||
}
|
||||
|
||||
served = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if the event is consumed. Consumed event is not served to other
|
||||
* clients.
|
||||
*
|
||||
* @return true if consumed
|
||||
*/
|
||||
final boolean isConsumed()
|
||||
{
|
||||
return consumed;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return true if the event was served to at least 1 client
|
||||
*/
|
||||
final boolean wasServed()
|
||||
{
|
||||
return served;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Clear "served" and "consumed" flags before dispatching.
|
||||
*/
|
||||
final void clearFlags()
|
||||
{
|
||||
served = false;
|
||||
consumed = false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -10,7 +10,6 @@ import java.util.concurrent.TimeUnit;
|
||||
|
||||
import mightypork.util.control.Destroyable;
|
||||
import mightypork.util.control.eventbus.clients.DelegatingClient;
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.events.flags.DelayedEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.ImmediateEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.SingleReceiverEvent;
|
||||
@@ -32,10 +31,10 @@ final public class EventBus implements Destroyable {
|
||||
private class DelayQueueEntry implements Delayed {
|
||||
|
||||
private final long due;
|
||||
private final Event<?> evt;
|
||||
private final BusEvent<?> evt;
|
||||
|
||||
|
||||
public DelayQueueEntry(double seconds, Event<?> event)
|
||||
public DelayQueueEntry(double seconds, BusEvent<?> event)
|
||||
{
|
||||
super();
|
||||
this.due = System.currentTimeMillis() + (long) (seconds * 1000);
|
||||
@@ -57,7 +56,7 @@ final public class EventBus implements Destroyable {
|
||||
}
|
||||
|
||||
|
||||
public Event<?> getEvent()
|
||||
public BusEvent<?> getEvent()
|
||||
{
|
||||
return evt;
|
||||
}
|
||||
@@ -103,17 +102,17 @@ final public class EventBus implements Destroyable {
|
||||
static final String logMark = "<BUS> ";
|
||||
|
||||
|
||||
private static Class<?> getEventListenerClass(Event<?> event)
|
||||
private static Class<?> getEventListenerClass(BusEvent<?> event)
|
||||
{
|
||||
// BEHOLD, MAGIC!
|
||||
final Type[] interfaces = event.getClass().getGenericInterfaces();
|
||||
for (final Type interf : interfaces) {
|
||||
if (interf instanceof ParameterizedType) {
|
||||
if (((ParameterizedType) interf).getRawType() == Event.class) {
|
||||
final Type[] types = ((ParameterizedType) interf).getActualTypeArguments();
|
||||
for (final Type genericType : types) {
|
||||
return (Class<?>) genericType;
|
||||
}
|
||||
|
||||
final Type evtc = event.getClass().getGenericSuperclass();
|
||||
|
||||
if (evtc instanceof ParameterizedType) {
|
||||
if (((ParameterizedType) evtc).getRawType() == BusEvent.class) {
|
||||
final Type[] types = ((ParameterizedType) evtc).getActualTypeArguments();
|
||||
for (final Type genericType : types) {
|
||||
return (Class<?>) genericType;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -169,7 +168,7 @@ final public class EventBus implements Destroyable {
|
||||
*
|
||||
* @param event event
|
||||
*/
|
||||
public void send(Event<?> event)
|
||||
public void send(BusEvent<?> event)
|
||||
{
|
||||
assertLive();
|
||||
|
||||
@@ -193,7 +192,7 @@ final public class EventBus implements Destroyable {
|
||||
*
|
||||
* @param event event
|
||||
*/
|
||||
public void sendQueued(Event<?> event)
|
||||
public void sendQueued(BusEvent<?> event)
|
||||
{
|
||||
assertLive();
|
||||
|
||||
@@ -207,7 +206,7 @@ final public class EventBus implements Destroyable {
|
||||
* @param event event
|
||||
* @param delay delay before event is dispatched
|
||||
*/
|
||||
public void sendDelayed(Event<?> event, double delay)
|
||||
public void sendDelayed(BusEvent<?> event, double delay)
|
||||
{
|
||||
assertLive();
|
||||
|
||||
@@ -228,7 +227,7 @@ final public class EventBus implements Destroyable {
|
||||
*
|
||||
* @param event event
|
||||
*/
|
||||
public void sendDirect(Event<?> event)
|
||||
public void sendDirect(BusEvent<?> event)
|
||||
{
|
||||
assertLive();
|
||||
|
||||
@@ -238,7 +237,7 @@ final public class EventBus implements Destroyable {
|
||||
}
|
||||
|
||||
|
||||
public void sendDirectToChildren(DelegatingClient delegatingClient, Event<?> event)
|
||||
public void sendDirectToChildren(DelegatingClient delegatingClient, BusEvent<?> event)
|
||||
{
|
||||
assertLive();
|
||||
|
||||
@@ -282,7 +281,7 @@ final public class EventBus implements Destroyable {
|
||||
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private boolean addChannelForEvent(Event<?> event)
|
||||
private boolean addChannelForEvent(BusEvent<?> event)
|
||||
{
|
||||
try {
|
||||
if (detailedLogging) {
|
||||
@@ -298,7 +297,7 @@ final public class EventBus implements Destroyable {
|
||||
//channels.flush();
|
||||
|
||||
if (detailedLogging) {
|
||||
Log.f2("<bus> Created new channel: " + Log.str(event.getClass()) + " -> " + Log.str(listener));
|
||||
Log.f2(logMark + "Created new channel: " + Log.str(event.getClass()) + " -> " + Log.str(listener));
|
||||
}
|
||||
|
||||
return true;
|
||||
@@ -333,7 +332,7 @@ final public class EventBus implements Destroyable {
|
||||
*
|
||||
* @param event event
|
||||
*/
|
||||
private synchronized void dispatch(Event<?> event)
|
||||
private synchronized void dispatch(BusEvent<?> event)
|
||||
{
|
||||
assertLive();
|
||||
|
||||
@@ -349,12 +348,11 @@ final public class EventBus implements Destroyable {
|
||||
* @param clients clients
|
||||
* @param event event
|
||||
*/
|
||||
private synchronized void doDispatch(Collection<Object> clients, Event<?> event)
|
||||
private synchronized void doDispatch(Collection<Object> clients, BusEvent<?> event)
|
||||
{
|
||||
boolean sent = false;
|
||||
boolean accepted = false;
|
||||
|
||||
final boolean singular = event.getClass().isAnnotationPresent(SingleReceiverEvent.class);
|
||||
event.clearFlags();
|
||||
|
||||
for (int i = 0; i < 2; i++) { // two tries.
|
||||
|
||||
@@ -362,10 +360,10 @@ final public class EventBus implements Destroyable {
|
||||
for (final EventChannel<?, ?> b : channels) {
|
||||
if (b.canBroadcast(event)) {
|
||||
accepted = true;
|
||||
sent |= b.broadcast(event, clients);
|
||||
b.broadcast(event, clients);
|
||||
}
|
||||
|
||||
if (sent && singular) break;
|
||||
if (event.isConsumed()) break;
|
||||
}
|
||||
channels.setBuffering(false);
|
||||
|
||||
@@ -375,11 +373,11 @@ final public class EventBus implements Destroyable {
|
||||
}
|
||||
|
||||
if (!accepted) Log.e(logMark + "Not accepted by any channel: " + Log.str(event));
|
||||
if (!sent && shallLog(event)) Log.w(logMark + "Not delivered: " + Log.str(event));
|
||||
if (!event.wasServed() && shallLog(event)) Log.w(logMark + "Not delivered: " + Log.str(event));
|
||||
}
|
||||
|
||||
|
||||
private boolean shallLog(Event<?> event)
|
||||
private boolean shallLog(BusEvent<?> event)
|
||||
{
|
||||
if (!detailedLogging) return false;
|
||||
if (event.getClass().isAnnotationPresent(UnloggedEvent.class)) return false;
|
||||
|
||||
@@ -6,7 +6,6 @@ import java.util.HashSet;
|
||||
|
||||
import mightypork.util.control.eventbus.clients.DelegatingClient;
|
||||
import mightypork.util.control.eventbus.clients.ToggleableClient;
|
||||
import mightypork.util.control.eventbus.events.Event;
|
||||
import mightypork.util.control.eventbus.events.flags.SingleReceiverEvent;
|
||||
import mightypork.util.logging.Log;
|
||||
|
||||
@@ -18,7 +17,7 @@ import mightypork.util.logging.Log;
|
||||
* @param <EVENT> event type
|
||||
* @param <CLIENT> client (subscriber) type
|
||||
*/
|
||||
class EventChannel<EVENT extends Event<CLIENT>, CLIENT> {
|
||||
class EventChannel<EVENT extends BusEvent<CLIENT>, CLIENT> {
|
||||
|
||||
private final Class<CLIENT> clientClass;
|
||||
private final Class<EVENT> eventClass;
|
||||
@@ -48,13 +47,12 @@ class EventChannel<EVENT extends Event<CLIENT>, CLIENT> {
|
||||
*
|
||||
* @param event a event to be sent
|
||||
* @param clients collection of clients
|
||||
* @return true if event was sent
|
||||
*/
|
||||
public boolean broadcast(Event<?> event, Collection<Object> clients)
|
||||
public void broadcast(BusEvent<?> event, Collection<Object> clients)
|
||||
{
|
||||
if (!canBroadcast(event)) return false;
|
||||
if (!canBroadcast(event)) return;
|
||||
|
||||
return doBroadcast(eventClass.cast(event), clients, new HashSet<>());
|
||||
doBroadcast(eventClass.cast(event), clients, new HashSet<>());
|
||||
}
|
||||
|
||||
|
||||
@@ -64,13 +62,9 @@ class EventChannel<EVENT extends Event<CLIENT>, CLIENT> {
|
||||
* @param event sent event
|
||||
* @param clients subscribing clients
|
||||
* @param processed clients already processed
|
||||
* @return success
|
||||
*/
|
||||
private boolean doBroadcast(final EVENT event, final Collection<Object> clients, final Collection<Object> processed)
|
||||
private void doBroadcast(final EVENT event, final Collection<Object> clients, final Collection<Object> processed)
|
||||
{
|
||||
boolean sent = false;
|
||||
final boolean singular = event.getClass().isAnnotationPresent(SingleReceiverEvent.class);
|
||||
|
||||
for (final Object client : clients) {
|
||||
|
||||
// exclude obvious non-clients
|
||||
@@ -90,10 +84,9 @@ class EventChannel<EVENT extends Event<CLIENT>, CLIENT> {
|
||||
if (!((ToggleableClient) client).isListening()) continue;
|
||||
}
|
||||
|
||||
sent |= sendTo(client, event);
|
||||
sendTo(client, event);
|
||||
|
||||
// singular event ain't no whore, handled once only.
|
||||
if (sent && singular) return true;
|
||||
if (event.isConsumed()) return;
|
||||
|
||||
// pass on to delegated clients
|
||||
if (client instanceof DelegatingClient) {
|
||||
@@ -102,14 +95,12 @@ class EventChannel<EVENT extends Event<CLIENT>, CLIENT> {
|
||||
final Collection<Object> children = ((DelegatingClient) client).getChildClients();
|
||||
|
||||
if (children != null && children.size() > 0) {
|
||||
sent |= doBroadcast(event, children, processed);
|
||||
doBroadcast(event, children, processed);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return sent;
|
||||
}
|
||||
|
||||
|
||||
@@ -118,16 +109,13 @@ class EventChannel<EVENT extends Event<CLIENT>, CLIENT> {
|
||||
*
|
||||
* @param client target client
|
||||
* @param event event to send
|
||||
* @return success
|
||||
*/
|
||||
@SuppressWarnings("unchecked")
|
||||
private boolean sendTo(Object client, EVENT event)
|
||||
private void sendTo(Object client, EVENT event)
|
||||
{
|
||||
if (isClientOfType(client)) {
|
||||
((Event<CLIENT>) event).handleBy((CLIENT) client);
|
||||
return true;
|
||||
if (isClientOfChannelType(client)) {
|
||||
((BusEvent<CLIENT>) event).deliverTo((CLIENT) client);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -137,7 +125,7 @@ class EventChannel<EVENT extends Event<CLIENT>, CLIENT> {
|
||||
* @param event event object
|
||||
* @return can be broadcasted
|
||||
*/
|
||||
public boolean canBroadcast(Event<?> event)
|
||||
public boolean canBroadcast(BusEvent<?> event)
|
||||
{
|
||||
return event != null && eventClass.isInstance(event);
|
||||
}
|
||||
@@ -150,7 +138,7 @@ class EventChannel<EVENT extends Event<CLIENT>, CLIENT> {
|
||||
* @param clientClass client class
|
||||
* @return the broadcaster
|
||||
*/
|
||||
public static <F_EVENT extends Event<F_CLIENT>, F_CLIENT> EventChannel<F_EVENT, F_CLIENT> create(Class<F_EVENT> eventClass, Class<F_CLIENT> clientClass)
|
||||
public static <F_EVENT extends BusEvent<F_CLIENT>, F_CLIENT> EventChannel<F_EVENT, F_CLIENT> create(Class<F_EVENT> eventClass, Class<F_CLIENT> clientClass)
|
||||
{
|
||||
return new EventChannel<>(eventClass, clientClass);
|
||||
}
|
||||
@@ -162,7 +150,7 @@ class EventChannel<EVENT extends Event<CLIENT>, CLIENT> {
|
||||
* @param client client
|
||||
* @return is of type
|
||||
*/
|
||||
private boolean isClientOfType(Object client)
|
||||
private boolean isClientOfChannelType(Object client)
|
||||
{
|
||||
return clientClass.isInstance(client);
|
||||
}
|
||||
@@ -176,7 +164,7 @@ class EventChannel<EVENT extends Event<CLIENT>, CLIENT> {
|
||||
*/
|
||||
public boolean isClientValid(Object client)
|
||||
{
|
||||
return isClientOfType(client) || (client instanceof DelegatingClient);
|
||||
return isClientOfChannelType(client) || (client instanceof DelegatingClient);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -34,21 +34,21 @@ public abstract class BusNode implements BusAccess, ClientHub {
|
||||
|
||||
|
||||
@Override
|
||||
public final Collection<Object> getChildClients()
|
||||
public Collection<Object> getChildClients()
|
||||
{
|
||||
return clients;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public final boolean doesDelegate()
|
||||
public boolean doesDelegate()
|
||||
{
|
||||
return delegating;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public final boolean isListening()
|
||||
public boolean isListening()
|
||||
{
|
||||
return listening;
|
||||
}
|
||||
@@ -60,7 +60,7 @@ public abstract class BusNode implements BusAccess, ClientHub {
|
||||
* @param client
|
||||
*/
|
||||
@Override
|
||||
public final void addChildClient(Object client)
|
||||
public void addChildClient(Object client)
|
||||
{
|
||||
if (client instanceof RootBusNode) {
|
||||
throw new IllegalArgumentException("Cannot nest RootBusNode.");
|
||||
@@ -76,7 +76,7 @@ public abstract class BusNode implements BusAccess, ClientHub {
|
||||
* @param client subscriber to remove
|
||||
*/
|
||||
@Override
|
||||
public final void removeChildClient(Object client)
|
||||
public void removeChildClient(Object client)
|
||||
{
|
||||
if (client != null) {
|
||||
clients.remove(client);
|
||||
@@ -89,7 +89,7 @@ public abstract class BusNode implements BusAccess, ClientHub {
|
||||
*
|
||||
* @param listening receive events
|
||||
*/
|
||||
public final void setListening(boolean listening)
|
||||
public void setListening(boolean listening)
|
||||
{
|
||||
this.listening = listening;
|
||||
}
|
||||
@@ -100,14 +100,14 @@ public abstract class BusNode implements BusAccess, ClientHub {
|
||||
*
|
||||
* @param delegating
|
||||
*/
|
||||
public final void setDelegating(boolean delegating)
|
||||
public void setDelegating(boolean delegating)
|
||||
{
|
||||
this.delegating = delegating;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public final EventBus getEventBus()
|
||||
public EventBus getEventBus()
|
||||
{
|
||||
return busAccess.getEventBus();
|
||||
}
|
||||
|
||||
@@ -1,36 +0,0 @@
|
||||
package mightypork.util.control.eventbus.events;
|
||||
|
||||
|
||||
import mightypork.util.control.eventbus.events.flags.DelayedEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.ImmediateEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.SingleReceiverEvent;
|
||||
import mightypork.util.control.eventbus.events.flags.UnloggedEvent;
|
||||
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Something that can be handled by HANDLER, subscribing to the event bus.
|
||||
* </p>
|
||||
* <p>
|
||||
* Can be annotated as {@link SingleReceiverEvent} to be delivered once only,
|
||||
* and {@link DelayedEvent} or {@link ImmediateEvent} to specify default sending
|
||||
* mode. When marked as {@link UnloggedEvent}, it will not appear in detailed
|
||||
* bus logging (useful for very frequent events, such as UpdateEvent).
|
||||
* </p>
|
||||
* <p>
|
||||
* Default sending mode (if not changed by annotations) is <i>queued</i> with
|
||||
* zero delay.
|
||||
* </p>
|
||||
*
|
||||
* @author MightyPork
|
||||
* @param <HANDLER> handler type
|
||||
*/
|
||||
public interface Event<HANDLER> {
|
||||
|
||||
/**
|
||||
* Ask handler to handle this message.
|
||||
*
|
||||
* @param handler handler instance
|
||||
*/
|
||||
public void handleBy(HANDLER handler);
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package mightypork.util.control.eventbus.events.flags;
|
||||
|
||||
import java.lang.annotation.Documented;
|
||||
import java.lang.annotation.ElementType;
|
||||
import java.lang.annotation.Retention;
|
||||
import java.lang.annotation.RetentionPolicy;
|
||||
import java.lang.annotation.Target;
|
||||
|
||||
|
||||
/**
|
||||
* Event that cannot be consumed
|
||||
*
|
||||
* @author MightyPork
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Documented
|
||||
@Target(ElementType.TYPE)
|
||||
public @interface NonConsumableEvent {
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user