parent
53b7b02609
commit
f5929f23b1
@ -0,0 +1,38 @@ |
||||
package mightypork.rogue.bus.events; |
||||
|
||||
|
||||
import mightypork.utils.control.bus.Event; |
||||
import mightypork.utils.control.bus.SingularEvent; |
||||
|
||||
|
||||
/** |
||||
* Request to execute given {@link Runnable} in main loop. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public class MainLoopTaskRequest implements Event<MainLoopTaskRequest.Listener>, SingularEvent { |
||||
|
||||
private final Runnable task; |
||||
|
||||
|
||||
public MainLoopTaskRequest(Runnable task) { |
||||
this.task = task; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void handleBy(Listener handler) |
||||
{ |
||||
handler.queueTask(task); |
||||
} |
||||
|
||||
public interface Listener { |
||||
|
||||
/** |
||||
* Perform the requested action |
||||
* |
||||
* @param request |
||||
*/ |
||||
public void queueTask(Runnable request); |
||||
} |
||||
} |
@ -1,7 +0,0 @@ |
||||
package mightypork.rogue.bus.events; |
||||
|
||||
|
||||
public enum RequestType |
||||
{ |
||||
FULLSCREEN, SCREENSHOT, SHUTDOWN; |
||||
} |
@ -0,0 +1,39 @@ |
||||
package mightypork.rogue.bus.events; |
||||
|
||||
|
||||
import mightypork.rogue.Deferred; |
||||
import mightypork.utils.control.bus.Event; |
||||
import mightypork.utils.control.bus.SingularEvent; |
||||
|
||||
|
||||
/** |
||||
* Request to schedule loading a deferred resource. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public class ResourceLoadRequest implements Event<ResourceLoadRequest.Listener>, SingularEvent { |
||||
|
||||
private final Deferred resource; |
||||
|
||||
|
||||
public ResourceLoadRequest(Deferred resource) { |
||||
this.resource = resource; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void handleBy(Listener handler) |
||||
{ |
||||
handler.loadResource(resource); |
||||
} |
||||
|
||||
public interface Listener { |
||||
|
||||
/** |
||||
* Load a resource |
||||
* |
||||
* @param resource |
||||
*/ |
||||
public void loadResource(Deferred resource); |
||||
} |
||||
} |
@ -0,0 +1,45 @@ |
||||
package mightypork.rogue.gui.constraints; |
||||
|
||||
|
||||
import static mightypork.utils.math.constraints.ConstraintFactory.*; |
||||
import mightypork.rogue.AppAccess; |
||||
import mightypork.utils.math.constraints.ConstraintContext; |
||||
|
||||
|
||||
public class ColumnHolder extends ElementHolder { |
||||
|
||||
private final int cols; |
||||
private int col = 0; |
||||
|
||||
|
||||
public ColumnHolder(AppAccess app, ConstraintContext context, int rows) { |
||||
super(app, context); |
||||
this.cols = rows; |
||||
} |
||||
|
||||
|
||||
public ColumnHolder(AppAccess app, int rows) { |
||||
super(app); |
||||
this.cols = rows; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Add a row to the holder. |
||||
* |
||||
* @param elem |
||||
*/ |
||||
public void addRow(RenderableWithContext elem) |
||||
{ |
||||
if (elem == null) return; |
||||
add(elem, c_column(null, cols, col++)); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void remove(RenderableWithContext elem) |
||||
{ |
||||
throw new UnsupportedOperationException("Can't remove from ColumnHolder."); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,45 @@ |
||||
package mightypork.rogue.gui.constraints; |
||||
|
||||
|
||||
import static mightypork.utils.math.constraints.ConstraintFactory.*; |
||||
import mightypork.rogue.AppAccess; |
||||
import mightypork.utils.math.constraints.ConstraintContext; |
||||
|
||||
|
||||
public class RowHolder extends ElementHolder { |
||||
|
||||
private final int rows; |
||||
private int row = 0; |
||||
|
||||
|
||||
public RowHolder(AppAccess app, ConstraintContext context, int rows) { |
||||
super(app, context); |
||||
this.rows = rows; |
||||
} |
||||
|
||||
|
||||
public RowHolder(AppAccess app, int rows) { |
||||
super(app); |
||||
this.rows = rows; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* Add a row to the holder. |
||||
* |
||||
* @param elem |
||||
*/ |
||||
public void addRow(RenderableWithContext elem) |
||||
{ |
||||
if (elem == null) return; |
||||
add(elem, c_row(null, rows, row++)); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void remove(RenderableWithContext elem) |
||||
{ |
||||
throw new UnsupportedOperationException("Can't remove from RowHolder."); |
||||
} |
||||
|
||||
} |
@ -1,70 +0,0 @@ |
||||
package mightypork.rogue.gui.screens.screenBouncy; |
||||
|
||||
|
||||
import mightypork.rogue.AppAccess; |
||||
import mightypork.rogue.gui.screens.LayeredScreen; |
||||
import mightypork.rogue.input.KeyStroke; |
||||
|
||||
import org.lwjgl.input.Keyboard; |
||||
|
||||
|
||||
public class ScreenTestAnim extends LayeredScreen { |
||||
|
||||
private LayerBouncyBoxes layer; |
||||
|
||||
|
||||
public ScreenTestAnim(AppAccess app) { |
||||
super(app); |
||||
|
||||
layer = new LayerBouncyBoxes(this); |
||||
|
||||
addLayer(layer); |
||||
|
||||
bindKeyStroke(new KeyStroke(Keyboard.KEY_RIGHT), new Runnable() { |
||||
|
||||
@Override |
||||
public void run() |
||||
{ |
||||
layer.goRight(); |
||||
} |
||||
}); |
||||
|
||||
bindKeyStroke(new KeyStroke(Keyboard.KEY_LEFT), new Runnable() { |
||||
|
||||
@Override |
||||
public void run() |
||||
{ |
||||
layer.goLeft(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void deinitScreen() |
||||
{ |
||||
// no impl
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void onScreenEnter() |
||||
{ |
||||
// no impl
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void onScreenLeave() |
||||
{ |
||||
// no impl
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void updateScreen(double delta) |
||||
{ |
||||
// no impl
|
||||
} |
||||
|
||||
} |
@ -1,4 +1,4 @@ |
||||
package mightypork.rogue.gui.screens.screenBouncy; |
||||
package mightypork.rogue.gui.screens.test_bouncyboxes; |
||||
|
||||
|
||||
import static mightypork.utils.math.constraints.ConstraintFactory.*; |
@ -0,0 +1,80 @@ |
||||
package mightypork.rogue.gui.screens.test_bouncyboxes; |
||||
|
||||
|
||||
import mightypork.rogue.AppAccess; |
||||
import mightypork.rogue.bus.events.ScreenRequestEvent; |
||||
import mightypork.rogue.gui.LayeredScreen; |
||||
import mightypork.rogue.input.KeyStroke; |
||||
|
||||
import org.lwjgl.input.Keyboard; |
||||
|
||||
|
||||
public class ScreenTestBouncy extends LayeredScreen { |
||||
|
||||
private LayerBouncyBoxes layer; |
||||
|
||||
|
||||
public ScreenTestBouncy(AppAccess app) { |
||||
super(app); |
||||
|
||||
layer = new LayerBouncyBoxes(this); |
||||
|
||||
addLayer(layer); |
||||
|
||||
bindKeyStroke(new KeyStroke(true, Keyboard.KEY_RIGHT), new Runnable() { |
||||
|
||||
@Override |
||||
public void run() |
||||
{ |
||||
layer.goRight(); |
||||
} |
||||
}); |
||||
|
||||
bindKeyStroke(new KeyStroke(true, Keyboard.KEY_LEFT), new Runnable() { |
||||
|
||||
@Override |
||||
public void run() |
||||
{ |
||||
layer.goLeft(); |
||||
} |
||||
}); |
||||
|
||||
bindKeyStroke(new KeyStroke(Keyboard.KEY_C), new Runnable() { |
||||
|
||||
@Override |
||||
public void run() |
||||
{ |
||||
bus().queue(new ScreenRequestEvent("test.cat")); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void deinitScreen() |
||||
{ |
||||
// no impl
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void onScreenEnter() |
||||
{ |
||||
// no impl
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void onScreenLeave() |
||||
{ |
||||
// no impl
|
||||
} |
||||
|
||||
|
||||
@Override |
||||
public String getId() |
||||
{ |
||||
return "test.bouncy"; |
||||
} |
||||
|
||||
} |
@ -0,0 +1,73 @@ |
||||
package mightypork.rogue.gui.screens.test_cat_sound; |
||||
|
||||
|
||||
import mightypork.rogue.AppAccess; |
||||
import mightypork.rogue.Res; |
||||
import mightypork.rogue.bus.events.ActionRequest; |
||||
import mightypork.rogue.bus.events.ActionRequest.RequestType; |
||||
import mightypork.rogue.bus.events.ScreenRequestEvent; |
||||
import mightypork.rogue.gui.LayeredScreen; |
||||
import mightypork.rogue.input.KeyStroke; |
||||
|
||||
import org.lwjgl.input.Keyboard; |
||||
|
||||
|
||||
public class ScreenTestCat extends LayeredScreen { |
||||
|
||||
LayerFlyingCat layer; |
||||
|
||||
|
||||
public ScreenTestCat(AppAccess app) { |
||||
super(app); |
||||
|
||||
addLayer(layer = new LayerFlyingCat(this)); |
||||
|
||||
bindKeyStroke(new KeyStroke(Keyboard.KEY_ESCAPE), new Runnable() { |
||||
|
||||
@Override |
||||
public void run() |
||||
{ |
||||
snd().fadeOutAllLoops(); |
||||
bus().schedule(new ActionRequest(RequestType.SHUTDOWN), 3); |
||||
} |
||||
}); |
||||
|
||||
bindKeyStroke(new KeyStroke(Keyboard.KEY_B), new Runnable() { |
||||
|
||||
@Override |
||||
public void run() |
||||
{ |
||||
bus().queue(new ScreenRequestEvent("test.bouncy")); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void deinitScreen() |
||||
{ |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void onScreenEnter() |
||||
{ |
||||
snd().fadeOutAllLoops(); |
||||
Res.getLoop("test.wilderness").fadeIn(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
protected void onScreenLeave() |
||||
{ |
||||
Res.getLoop("test.wilderness").fadeOut(); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public String getId() |
||||
{ |
||||
return "test.cat"; |
||||
} |
||||
|
||||
} |
@ -1,4 +1,4 @@ |
||||
package mightypork.rogue.audio; |
||||
package mightypork.rogue.sound; |
||||
|
||||
|
||||
public class NullAudio extends DeferredAudio { |
@ -1,6 +1,7 @@ |
||||
package mightypork.rogue.audio; |
||||
package mightypork.rogue.sound.players; |
||||
|
||||
|
||||
import mightypork.rogue.sound.DeferredAudio; |
||||
import mightypork.utils.math.coord.Coord; |
||||
import mightypork.utils.objects.Mutable; |
||||
|
@ -0,0 +1,102 @@ |
||||
package mightypork.rogue.texture; |
||||
|
||||
|
||||
import java.util.concurrent.ExecutorService; |
||||
import java.util.concurrent.Executors; |
||||
import java.util.concurrent.LinkedBlockingQueue; |
||||
|
||||
import mightypork.rogue.AppAccess; |
||||
import mightypork.rogue.Deferred; |
||||
import mightypork.rogue.bus.events.MainLoopTaskRequest; |
||||
import mightypork.rogue.bus.events.ResourceLoadRequest; |
||||
import mightypork.utils.control.interf.Destroyable; |
||||
import mightypork.utils.logging.Log; |
||||
|
||||
|
||||
/** |
||||
* Asynchronous resource loading thread. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public class DeferredLoader extends Thread implements ResourceLoadRequest.Listener, Destroyable { |
||||
|
||||
public static void launch(AppAccess app) |
||||
{ |
||||
(new DeferredLoader(app)).start(); |
||||
} |
||||
|
||||
private ExecutorService exs = Executors.newCachedThreadPool(); |
||||
|
||||
private LinkedBlockingQueue<Deferred> toLoad = new LinkedBlockingQueue<Deferred>(); |
||||
private boolean stopped; |
||||
private AppAccess app; |
||||
|
||||
|
||||
public DeferredLoader(AppAccess app) { |
||||
super("Deferred loader"); |
||||
this.app = app; |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void loadResource(Deferred resource) |
||||
{ |
||||
toLoad.add(resource); |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void run() |
||||
{ |
||||
while (!stopped) { |
||||
|
||||
try { |
||||
final Deferred def = toLoad.take(); |
||||
if (def == null) continue; |
||||
|
||||
if (!def.isLoaded()) { |
||||
|
||||
// texture needs to be loaded in main thread, unfortunately.
|
||||
// -> delegate to MainLoop
|
||||
if (def instanceof DeferredTexture) { |
||||
app.bus().queue(new MainLoopTaskRequest(new Runnable() { |
||||
|
||||
@Override |
||||
public void run() |
||||
{ |
||||
Log.f3("<DEFERRED> Loading \"" + Log.str(def) + "\""); |
||||
def.load(); |
||||
} |
||||
})); |
||||
|
||||
continue; |
||||
} |
||||
|
||||
Log.f3("<DEFERRED> Loading \"" + Log.str(def) + "\""); |
||||
|
||||
exs.submit(new Runnable() { |
||||
|
||||
@Override |
||||
public void run() |
||||
{ |
||||
def.load(); |
||||
} |
||||
}); |
||||
} |
||||
|
||||
} catch (InterruptedException ignored) { |
||||
//
|
||||
} |
||||
|
||||
} |
||||
} |
||||
|
||||
|
||||
@Override |
||||
public void destroy() |
||||
{ |
||||
stopped = true; |
||||
exs.shutdownNow(); |
||||
} |
||||
|
||||
} |
@ -0,0 +1,11 @@ |
||||
package mightypork.utils.control.bus; |
||||
|
||||
|
||||
/** |
||||
* Event handled by only single client. |
||||
* |
||||
* @author MightyPork |
||||
*/ |
||||
public interface SingularEvent { |
||||
|
||||
} |
Loading…
Reference in new issue