You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.0 KiB
120 lines
2.0 KiB
10 years ago
|
package mightypork.gamecore.core;
|
||
10 years ago
|
|
||
|
|
||
|
import java.util.Queue;
|
||
|
import java.util.concurrent.ConcurrentLinkedQueue;
|
||
|
|
||
10 years ago
|
import mightypork.gamecore.eventbus.events.UpdateEvent;
|
||
10 years ago
|
import mightypork.gamecore.gui.screens.ScreenRegistry;
|
||
10 years ago
|
import mightypork.gamecore.render.Renderable;
|
||
10 years ago
|
import mightypork.gamecore.render.TaskTakeScreenshot;
|
||
|
import mightypork.gamecore.render.events.ScreenshotRequestListener;
|
||
10 years ago
|
import mightypork.gamecore.util.annot.DefaultImpl;
|
||
|
import mightypork.gamecore.util.math.timing.TimerDelta;
|
||
10 years ago
|
|
||
|
|
||
10 years ago
|
/**
|
||
|
* Delta-timed game loop with task queue etc.
|
||
|
*
|
||
|
* @author MightyPork
|
||
|
*/
|
||
10 years ago
|
public class MainLoop extends AppModule implements ScreenshotRequestListener {
|
||
10 years ago
|
|
||
10 years ago
|
private final Queue<Runnable> taskQueue = new ConcurrentLinkedQueue<>();
|
||
10 years ago
|
private TimerDelta timer;
|
||
10 years ago
|
private Renderable rootRenderable;
|
||
10 years ago
|
private volatile boolean running = true;
|
||
10 years ago
|
|
||
|
|
||
10 years ago
|
/**
|
||
|
* @param app {@link AppAccess} instance
|
||
10 years ago
|
*/
|
||
10 years ago
|
public MainLoop(AppAccess app)
|
||
10 years ago
|
{
|
||
10 years ago
|
super(app);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Set primary renderable
|
||
|
*
|
||
10 years ago
|
* @param rootRenderable main {@link Renderable}, typically a
|
||
|
* {@link ScreenRegistry}
|
||
|
*/
|
||
10 years ago
|
public void setRootRenderable(Renderable rootRenderable)
|
||
|
{
|
||
|
this.rootRenderable = rootRenderable;
|
||
10 years ago
|
}
|
||
|
|
||
|
|
||
10 years ago
|
/**
|
||
|
* Start the loop
|
||
|
*/
|
||
10 years ago
|
public void start()
|
||
|
{
|
||
|
timer = new TimerDelta();
|
||
|
|
||
|
while (running) {
|
||
10 years ago
|
getDisplay().beginFrame();
|
||
10 years ago
|
|
||
10 years ago
|
getEventBus().sendDirect(new UpdateEvent(timer.getDelta()));
|
||
10 years ago
|
|
||
|
Runnable r;
|
||
|
while ((r = taskQueue.poll()) != null) {
|
||
|
r.run();
|
||
|
}
|
||
|
|
||
10 years ago
|
beforeRender();
|
||
|
|
||
10 years ago
|
if (rootRenderable != null) {
|
||
|
rootRenderable.render();
|
||
|
}
|
||
10 years ago
|
|
||
|
afterRender();
|
||
10 years ago
|
|
||
10 years ago
|
getDisplay().endFrame();
|
||
10 years ago
|
}
|
||
|
}
|
||
|
|
||
|
|
||
10 years ago
|
/**
|
||
|
* Called before render
|
||
|
*/
|
||
10 years ago
|
@DefaultImpl
|
||
10 years ago
|
protected void beforeRender()
|
||
|
{
|
||
|
//
|
||
|
}
|
||
|
|
||
|
|
||
10 years ago
|
/**
|
||
|
* Called after render
|
||
|
*/
|
||
10 years ago
|
@DefaultImpl
|
||
10 years ago
|
protected void afterRender()
|
||
|
{
|
||
|
//
|
||
|
}
|
||
10 years ago
|
|
||
|
|
||
|
@Override
|
||
10 years ago
|
protected void deinit()
|
||
10 years ago
|
{
|
||
|
running = false;
|
||
|
}
|
||
|
|
||
|
|
||
10 years ago
|
public synchronized void queueTask(Runnable request)
|
||
10 years ago
|
{
|
||
|
taskQueue.add(request);
|
||
|
}
|
||
|
|
||
10 years ago
|
|
||
|
@Override
|
||
|
public void onScreenshotRequest()
|
||
|
{
|
||
|
queueTask(new TaskTakeScreenshot());
|
||
|
}
|
||
|
|
||
10 years ago
|
}
|