diff --git a/src/mightypork/rogue/AppAccess.java b/src/mightypork/gamecore/AppAccess.java
similarity index 55%
rename from src/mightypork/rogue/AppAccess.java
rename to src/mightypork/gamecore/AppAccess.java
index e1eb958..210378b 100644
--- a/src/mightypork/rogue/AppAccess.java
+++ b/src/mightypork/gamecore/AppAccess.java
@@ -1,10 +1,9 @@
-package mightypork.rogue;
+package mightypork.gamecore;
-import mightypork.rogue.input.InputSystem;
-import mightypork.rogue.render.DisplaySystem;
-import mightypork.rogue.sounds.SoundSystem;
-import mightypork.utils.control.bus.EventBus;
+import mightypork.gamecore.input.InputSystem;
+import mightypork.gamecore.render.DisplaySystem;
+import mightypork.gamecore.resources.sounds.SoundSystem;
/**
@@ -12,7 +11,7 @@ import mightypork.utils.control.bus.EventBus;
*
* @author MightyPork
*/
-public interface AppAccess {
+public interface AppAccess extends BusAccess {
/**
* @return sound system
@@ -32,12 +31,6 @@ public interface AppAccess {
abstract DisplaySystem disp();
- /**
- * @return event bus
- */
- abstract EventBus bus();
-
-
/**
* Quit to OS
* Destroy app & exit VM
diff --git a/src/mightypork/rogue/AppAdapter.java b/src/mightypork/gamecore/AppAdapter.java
similarity index 74%
rename from src/mightypork/rogue/AppAdapter.java
rename to src/mightypork/gamecore/AppAdapter.java
index 2d6e368..191dd0f 100644
--- a/src/mightypork/rogue/AppAdapter.java
+++ b/src/mightypork/gamecore/AppAdapter.java
@@ -1,10 +1,10 @@
-package mightypork.rogue;
+package mightypork.gamecore;
-import mightypork.rogue.input.InputSystem;
-import mightypork.rogue.render.DisplaySystem;
-import mightypork.rogue.sounds.SoundSystem;
-import mightypork.utils.control.bus.EventBus;
+import mightypork.gamecore.control.bus.EventBus;
+import mightypork.gamecore.input.InputSystem;
+import mightypork.gamecore.render.DisplaySystem;
+import mightypork.gamecore.resources.sounds.SoundSystem;
/**
diff --git a/src/mightypork/gamecore/BusAccess.java b/src/mightypork/gamecore/BusAccess.java
new file mode 100644
index 0000000..7f22310
--- /dev/null
+++ b/src/mightypork/gamecore/BusAccess.java
@@ -0,0 +1,14 @@
+package mightypork.gamecore;
+
+
+import mightypork.gamecore.control.bus.EventBus;
+
+
+public interface BusAccess {
+
+ /**
+ * @return event bus
+ */
+ public abstract EventBus bus();
+
+}
diff --git a/src/mightypork/gamecore/GameLoop.java b/src/mightypork/gamecore/GameLoop.java
new file mode 100644
index 0000000..3c39026
--- /dev/null
+++ b/src/mightypork/gamecore/GameLoop.java
@@ -0,0 +1,66 @@
+package mightypork.gamecore;
+
+
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+import mightypork.gamecore.control.Subsystem;
+import mightypork.gamecore.control.bus.events.MainLoopTaskRequest;
+import mightypork.gamecore.control.bus.events.UpdateEvent;
+import mightypork.gamecore.control.timing.TimerDelta;
+
+
+public abstract class GameLoop extends Subsystem implements MainLoopTaskRequest.Listener {
+
+ private final Queue taskQueue = new ConcurrentLinkedQueue();
+ /** timer */
+ private TimerDelta timer;
+ private boolean running = true;
+
+
+ public GameLoop(AppAccess app) {
+ super(app);
+ }
+
+
+ public void start()
+ {
+ timer = new TimerDelta();
+
+ while (running) {
+ disp().beginFrame();
+
+ bus().send(new UpdateEvent(timer.getDelta()));
+
+ Runnable r;
+ while ((r = taskQueue.poll()) != null) {
+ r.run();
+ }
+
+ tick();
+
+ disp().endFrame();
+ }
+ }
+
+
+ /**
+ * Called each frame, in rendering context.
+ */
+ protected abstract void tick();
+
+
+ @Override
+ protected final void deinit()
+ {
+ running = false;
+ }
+
+
+ @Override
+ public final synchronized void queueTask(Runnable request)
+ {
+ taskQueue.add(request);
+ }
+
+}
diff --git a/src/mightypork/rogue/util/SlickLogRedirector.java b/src/mightypork/gamecore/SlickLogRedirector.java
similarity index 95%
rename from src/mightypork/rogue/util/SlickLogRedirector.java
rename to src/mightypork/gamecore/SlickLogRedirector.java
index bfbd343..db95755 100644
--- a/src/mightypork/rogue/util/SlickLogRedirector.java
+++ b/src/mightypork/gamecore/SlickLogRedirector.java
@@ -1,4 +1,4 @@
-package mightypork.rogue.util;
+package mightypork.gamecore;
import mightypork.utils.logging.LogInstance;
diff --git a/src/mightypork/rogue/bus/ChildClient.java b/src/mightypork/gamecore/control/ChildClient.java
similarity index 63%
rename from src/mightypork/rogue/bus/ChildClient.java
rename to src/mightypork/gamecore/control/ChildClient.java
index 59176ea..2b5df8e 100644
--- a/src/mightypork/rogue/bus/ChildClient.java
+++ b/src/mightypork/gamecore/control/ChildClient.java
@@ -1,15 +1,15 @@
-package mightypork.rogue.bus;
+package mightypork.gamecore.control;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.Set;
-import mightypork.rogue.AppAccess;
-import mightypork.rogue.AppAdapter;
-import mightypork.utils.control.bus.EventBus;
-import mightypork.utils.control.bus.clients.DelegatingClient;
-import mightypork.utils.control.bus.clients.ToggleableClient;
+import mightypork.gamecore.BusAccess;
+import mightypork.gamecore.control.bus.EventBus;
+import mightypork.gamecore.control.bus.clients.DelegatingClient;
+import mightypork.gamecore.control.bus.clients.ToggleableClient;
+import mightypork.gamecore.control.interf.Destroyable;
/**
@@ -18,17 +18,38 @@ import mightypork.utils.control.bus.clients.ToggleableClient;
*
* @author MightyPork
*/
-public class ChildClient extends AppAdapter implements DelegatingClient, ToggleableClient {
+public abstract class ChildClient implements BusAccess, DelegatingClient, ToggleableClient, Destroyable {
- public ChildClient(AppAccess app) {
- super(app);
- }
+ private BusAccess busAccess;
private final Set