More easing types, cleanup

v5stable
Ondřej Hruška 11 years ago
parent 5c261c4513
commit e2e5576664
  1. 16
      src/mightypork/rogue/App.java
  2. 19
      src/mightypork/rogue/display/DisplaySystem.java
  3. 14
      src/mightypork/rogue/display/Screen.java
  4. 167
      src/mightypork/rogue/display/ScreenSplash.java
  5. 200
      src/mightypork/rogue/display/ScreenTestAnimations.java
  6. 12
      src/mightypork/rogue/display/constraints/Constraint.java
  7. 3
      src/mightypork/rogue/display/constraints/ConstraintContext.java
  8. 3
      src/mightypork/rogue/input/InputSystem.java
  9. 1
      src/mightypork/rogue/input/KeyBinder.java
  10. 2
      src/mightypork/rogue/input/KeyBinding.java
  11. 6
      src/mightypork/rogue/input/KeyBindingPool.java
  12. 8
      src/mightypork/rogue/input/events/KeyboardEvent.java
  13. 2
      src/mightypork/rogue/sounds/LoopPlayer.java
  14. 10
      src/mightypork/rogue/sounds/SoundSystem.java
  15. 1
      src/mightypork/rogue/util/RenderUtils.java
  16. 4
      src/mightypork/rogue/util/Utils.java
  17. 4
      src/mightypork/utils/math/Calc.java
  18. 7
      src/mightypork/utils/math/coord/CoordAnimated.java
  19. 421
      src/mightypork/utils/math/easing/Easing.java
  20. 3
      src/mightypork/utils/objects/Mutable.java
  21. 1
      src/mightypork/utils/objects/VarargsParser.java
  22. 1
      src/mightypork/utils/patterns/Destroyable.java
  23. 1
      src/mightypork/utils/patterns/Initializable.java
  24. 3
      src/mightypork/utils/patterns/subscription/MessageBus.java
  25. 5
      src/mightypork/utils/patterns/subscription/MessageChannel.java
  26. 13
      src/mightypork/utils/time/animation/AnimDouble.java
  27. 2
      src/mightypork/utils/time/animation/AnimDoubleDeg.java
  28. 2
      src/mightypork/utils/time/animation/AnimDoubleRad.java

@ -9,10 +9,9 @@ import javax.swing.JOptionPane;
import mightypork.rogue.display.DisplaySystem; import mightypork.rogue.display.DisplaySystem;
import mightypork.rogue.display.Screen; import mightypork.rogue.display.Screen;
import mightypork.rogue.display.ScreenSplash; import mightypork.rogue.display.ScreenTestAnimations;
import mightypork.rogue.input.InputSystem; import mightypork.rogue.input.InputSystem;
import mightypork.rogue.input.KeyStroke; import mightypork.rogue.input.KeyStroke;
import mightypork.rogue.input.events.MouseMotionEvent;
import mightypork.rogue.sounds.SoundSystem; import mightypork.rogue.sounds.SoundSystem;
import mightypork.rogue.tasks.TaskTakeScreenshot; import mightypork.rogue.tasks.TaskTakeScreenshot;
import mightypork.rogue.util.Utils; import mightypork.rogue.util.Utils;
@ -24,7 +23,6 @@ import mightypork.utils.time.TimerDelta;
import mightypork.utils.time.TimerInterpolating; import mightypork.utils.time.TimerInterpolating;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
public class App implements Destroyable { public class App implements Destroyable {
@ -273,28 +271,20 @@ public class App implements Destroyable {
/** timer */ /** timer */
private TimerDelta timerRender; private TimerDelta timerRender;
private TimerInterpolating timerGui;
private void mainLoop() private void mainLoop()
{ {
screen = new ScreenSplash(); screen = new ScreenTestAnimations();
screen.setActive(true); screen.setActive(true);
timerRender = new TimerDelta(); timerRender = new TimerDelta();
timerGui = new TimerInterpolating(Const.FPS_GUI_UPDATE);
while (!display.isCloseRequested()) { while (!display.isCloseRequested()) {
display.beginFrame(); display.beginFrame();
// gui update input.poll();
timerGui.sync();
int ticks = timerGui.getSkipped();
if (ticks >= 1) {
input.poll();
timerGui.startNewFrame();
}
double delta = timerRender.getDelta(); double delta = timerRender.getDelta();

@ -6,19 +6,17 @@ import static org.lwjgl.opengl.GL11.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import mightypork.rogue.App; import mightypork.rogue.App;
import mightypork.rogue.Const;
import mightypork.rogue.display.events.ScreenChangeEvent; import mightypork.rogue.display.events.ScreenChangeEvent;
import mightypork.utils.logging.Log; import mightypork.utils.logging.Log;
import mightypork.utils.math.coord.Coord; import mightypork.utils.math.coord.Coord;
import mightypork.utils.patterns.Destroyable; import mightypork.utils.patterns.Destroyable;
import mightypork.utils.patterns.Initializable; import mightypork.utils.patterns.Initializable;
import mightypork.utils.time.Updateable;
import org.lwjgl.BufferUtils;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
public class DisplaySystem implements Initializable, Destroyable { public class DisplaySystem implements Initializable, Destroyable {
@ -33,16 +31,18 @@ public class DisplaySystem implements Initializable, Destroyable {
initialize(); initialize();
} }
@Override @Override
public void initialize() public void initialize()
{ {
if(initialized) return; if (initialized) return;
initChannels(); initChannels();
initialized = true; initialized = true;
} }
/** /**
* Initialize event channels * Initialize event channels
*/ */
@ -51,6 +51,7 @@ public class DisplaySystem implements Initializable, Destroyable {
App.msgbus().registerMessageType(ScreenChangeEvent.class, ScreenChangeEvent.Listener.class); App.msgbus().registerMessageType(ScreenChangeEvent.class, ScreenChangeEvent.Listener.class);
} }
@Override @Override
public void destroy() public void destroy()
{ {
@ -180,7 +181,7 @@ public class DisplaySystem implements Initializable, Destroyable {
*/ */
public void beginFrame() public void beginFrame()
{ {
if(Display.wasResized()) { if (Display.wasResized()) {
App.broadcast(new ScreenChangeEvent(false, Display.isFullscreen(), getSize())); App.broadcast(new ScreenChangeEvent(false, Display.isFullscreen(), getSize()));
} }

@ -2,19 +2,15 @@ package mightypork.rogue.display;
import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL11.*;
import java.util.Random;
import mightypork.rogue.App; import mightypork.rogue.App;
import mightypork.rogue.display.events.ScreenChangeEvent; import mightypork.rogue.display.events.ScreenChangeEvent;
import mightypork.rogue.input.KeyBinder; import mightypork.rogue.input.KeyBinder;
import mightypork.rogue.input.KeyBindingPool; import mightypork.rogue.input.KeyBindingPool;
import mightypork.rogue.input.KeyStroke; import mightypork.rogue.input.KeyStroke;
import mightypork.rogue.input.events.KeyboardEvent; import mightypork.rogue.input.events.KeyboardEvent;
import mightypork.rogue.input.events.MouseMotionEvent;
import mightypork.rogue.input.events.MouseButtonEvent; import mightypork.rogue.input.events.MouseButtonEvent;
import mightypork.rogue.input.events.MouseMotionEvent;
import mightypork.utils.math.coord.Coord; import mightypork.utils.math.coord.Coord;
import mightypork.utils.patterns.Destroyable;
import mightypork.utils.patterns.Initializable; import mightypork.utils.patterns.Initializable;
import mightypork.utils.time.Updateable; import mightypork.utils.time.Updateable;
@ -54,6 +50,7 @@ public abstract class Screen implements KeyBinder, Updateable, Initializable, Ke
/** /**
* Prepare for being shown * Prepare for being shown
*
* @param shown true to show, false to hide * @param shown true to show, false to hide
*/ */
public final void setActive(boolean shown) public final void setActive(boolean shown)
@ -113,11 +110,13 @@ public abstract class Screen implements KeyBinder, Updateable, Initializable, Ke
/** /**
* Initialize screen layout and key bindings.<br> * Initialize screen layout and key bindings.<br>
* Called when the screen is created, not when it comes to front. For that, use onEnter(). * Called when the screen is created, not when it comes to front. For that,
* use onEnter().
*/ */
@Override @Override
public abstract void initialize(); public abstract void initialize();
/** /**
* Called when the screen becomes active * Called when the screen becomes active
*/ */
@ -172,6 +171,9 @@ public abstract class Screen implements KeyBinder, Updateable, Initializable, Ke
} }
/**
* Update and render the screen
*/
@Override @Override
public final void update(double delta) public final void update(double delta)
{ {

@ -1,167 +0,0 @@
package mightypork.rogue.display;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import mightypork.rogue.App;
import mightypork.rogue.input.KeyStroke;
import mightypork.rogue.input.events.MouseButtonEvent;
import mightypork.rogue.input.events.MouseMotionEvent;
import mightypork.rogue.util.RenderUtils;
import mightypork.utils.math.Polar;
import mightypork.utils.math.color.RGB;
import mightypork.utils.math.coord.Coord;
import mightypork.utils.math.easing.Easing;
import mightypork.utils.time.AnimDouble;
import mightypork.utils.time.AnimDoubleDeg;
public class ScreenSplash extends Screen {
private AnimDoubleDeg degAnim = new AnimDoubleDeg(0, Easing.SINE);
//@formatter:off
private AnimDouble[] anims = new AnimDouble[] {
new AnimDouble(0, Easing.NONE),
new AnimDouble(0, Easing.LINEAR),
new AnimDouble(0, Easing.QUADRATIC_IN),
new AnimDouble(0, Easing.QUADRATIC_OUT),
new AnimDouble(0, Easing.QUADRATIC),
new AnimDouble(0, Easing.CUBIC_IN),
new AnimDouble(0, Easing.CUBIC_OUT),
new AnimDouble(0, Easing.CUBIC),
new AnimDouble(0, Easing.QUADRATIC_IN),
new AnimDouble(0, Easing.QUADRATIC_OUT),
new AnimDouble(0, Easing.QUADRATIC),
new AnimDouble(0, Easing.QUINTIC_IN),
new AnimDouble(0, Easing.QUINTIC_OUT),
new AnimDouble(0, Easing.QUINTIC_IN_OUT),
new AnimDouble(0, Easing.EXPO_IN),
new AnimDouble(0, Easing.EXPO_OUT),
new AnimDouble(0, Easing.EXPO),
new AnimDouble(0, Easing.SINE_IN),
new AnimDouble(0, Easing.SINE_OUT),
new AnimDouble(0, Easing.SINE),
new AnimDouble(0, Easing.CIRC_IN),
new AnimDouble(0, Easing.CIRC_OUT),
new AnimDouble(0, Easing.CIRC),
};
//@formatter:on
@Override
public void initialize()
{
bindKeyStroke(new KeyStroke(Keyboard.KEY_RIGHT), new Runnable() {
@Override
public void run()
{
for (AnimDouble a : anims) {
a.animate(0, 1, 3);
}
}
});
bindKeyStroke(new KeyStroke(Keyboard.KEY_LEFT), new Runnable() {
@Override
public void run()
{
for (AnimDouble a : anims) {
a.animate(1, 0, 3);
}
}
});
}
@Override
protected void renderScreen()
{
double screenH = Display.getHeight();
double screenW = Display.getWidth();
double perBoxH = screenH / anims.length;
double padding = perBoxH*0.1;
double boxSide = perBoxH-padding*2;
for (int i = 0; i < anims.length; i++) {
AnimDouble a = anims[i];
RenderUtils.setColor(i%3==0?RGB.GREEN:RGB.BLUE);
RenderUtils.quadSize(
padding + a.getCurrentValue() * (screenW - perBoxH - padding*2),
screenH - perBoxH * i - perBoxH + padding,
boxSide,
boxSide
);
}
RenderUtils.setColor(RGB.YELLOW);
RenderUtils.translate(new Coord(Display.getWidth() / 2, Display.getHeight() / 2));
RenderUtils.rotateZ(degAnim.getCurrentValue());
RenderUtils.quadSize(-10, -10, 20, 200);
}
@Override
public void receive(MouseMotionEvent event)
{
}
@Override
public void receive(MouseButtonEvent event)
{
if(event.isDown()) {
Coord vec = App.disp().getSize().half().vecTo(event.getPos());
Polar p = Polar.fromCoord(vec);
degAnim.fadeTo(p.getAngleDeg() - 90, 0.2);
}
}
@Override
protected void onEnter()
{
// TODO Auto-generated method stub
}
@Override
protected void onLeave()
{
// TODO Auto-generated method stub
}
@Override
protected void onSizeChanged(Coord size)
{
// TODO Auto-generated method stub
}
@Override
protected void updateScreen(double delta)
{
degAnim.update(delta);
for (AnimDouble a : anims) {
a.update(delta);
}
}
}

@ -0,0 +1,200 @@
package mightypork.rogue.display;
import java.util.Random;
import mightypork.rogue.App;
import mightypork.rogue.input.KeyStroke;
import mightypork.rogue.input.events.MouseButtonEvent;
import mightypork.rogue.input.events.MouseMotionEvent;
import mightypork.rogue.util.RenderUtils;
import mightypork.utils.math.Polar;
import mightypork.utils.math.color.RGB;
import mightypork.utils.math.coord.Coord;
import mightypork.utils.math.easing.Easing;
import mightypork.utils.time.animation.AnimDouble;
import mightypork.utils.time.animation.AnimDoubleDeg;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
public class ScreenTestAnimations extends Screen {
private Random rand = new Random();
private AnimDoubleDeg degAnim = new AnimDoubleDeg(0, Easing.ELASTIC_OUT);
//@formatter:off
private AnimDouble[] anims = new AnimDouble[] {
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
new AnimDouble(0, Easing.BOUNCE_OUT),
// new AnimDouble(0, Easing.NONE),
// new AnimDouble(0, Easing.LINEAR),
//
// new AnimDouble(0, Easing.QUADRATIC_IN),
// new AnimDouble(0, Easing.QUADRATIC_OUT),
// new AnimDouble(0, Easing.QUADRATIC_IN_OUT),
//
// new AnimDouble(0, Easing.CUBIC_IN),
// new AnimDouble(0, Easing.CUBIC_OUT),
// new AnimDouble(0, Easing.CUBIC_IN_OUT),
//
// new AnimDouble(0, Easing.QUADRATIC_IN),
// new AnimDouble(0, Easing.QUADRATIC_OUT),
// new AnimDouble(0, Easing.QUADRATIC_IN_OUT),
//
// new AnimDouble(0, Easing.QUINTIC_IN),
// new AnimDouble(0, Easing.QUINTIC_OUT),
// new AnimDouble(0, Easing.QUINTIC_IN_OUT),
//
// new AnimDouble(0, Easing.EXPO_IN),
// new AnimDouble(0, Easing.EXPO_OUT),
// new AnimDouble(0, Easing.EXPO_IN_OUT),
//
// new AnimDouble(0, Easing.SINE_IN),
// new AnimDouble(0, Easing.SINE_OUT),
// new AnimDouble(0, Easing.SINE_IN_OUT),
//
// new AnimDouble(0, Easing.CIRC_IN),
// new AnimDouble(0, Easing.CIRC_OUT),
// new AnimDouble(0, Easing.CIRC_IN_OUT),
//
// new AnimDouble(0, Easing.BOUNCE_IN),
// new AnimDouble(0, Easing.BOUNCE_OUT),
// new AnimDouble(0, Easing.BOUNCE_IN_OUT),
//
// new AnimDouble(0, Easing.BACK_IN),
// new AnimDouble(0, Easing.BACK_OUT),
// new AnimDouble(0, Easing.BACK_IN_OUT),
//
// new AnimDouble(0, Easing.ELASTIC_IN),
// new AnimDouble(0, Easing.ELASTIC_OUT),
// new AnimDouble(0, Easing.ELASTIC_IN_OUT),
};
//@formatter:on
@Override
public void initialize()
{
bindKeyStroke(new KeyStroke(Keyboard.KEY_RIGHT), new Runnable() {
@Override
public void run()
{
for (AnimDouble a : anims) {
a.animate(0, 1, 1+rand.nextDouble()*1);
}
}
});
bindKeyStroke(new KeyStroke(Keyboard.KEY_LEFT), new Runnable() {
@Override
public void run()
{
for (AnimDouble a : anims) {
a.animate(1, 0, 1+rand.nextDouble()*1);
}
}
});
}
@Override
protected void renderScreen()
{
double screenH = Display.getHeight();
double screenW = Display.getWidth();
double perBoxH = screenH / anims.length;
double padding = perBoxH * 0.1;
double boxSide = perBoxH - padding * 2;
for (int i = 0; i < anims.length; i++) {
AnimDouble a = anims[i];
RenderUtils.setColor(RGB.GREEN);
RenderUtils.quadSize(padding + a.getCurrentValue() * (screenW - perBoxH), screenH - perBoxH * i - perBoxH + padding, boxSide, boxSide);
}
RenderUtils.setColor(RGB.YELLOW);
RenderUtils.translate(new Coord(Display.getWidth() / 2, Display.getHeight() / 2));
RenderUtils.rotateZ(degAnim.getCurrentValue());
RenderUtils.quadSize(-10, -10, 20, 200);
}
@Override
public void receive(MouseMotionEvent event)
{
//
}
@Override
public void receive(MouseButtonEvent event)
{
if (event.isDown()) {
Coord vec = App.disp().getSize().half().vecTo(event.getPos());
Polar p = Polar.fromCoord(vec);
degAnim.fadeTo(p.getAngleDeg() - 90, 1.5);
}
}
@Override
protected void onEnter()
{
// TODO Auto-generated method stub
}
@Override
protected void onLeave()
{
// TODO Auto-generated method stub
}
@Override
protected void onSizeChanged(Coord size)
{
// TODO Auto-generated method stub
}
@Override
protected void updateScreen(double delta)
{
degAnim.update(delta);
for (AnimDouble a : anims) {
a.update(delta);
}
}
}

@ -1,5 +1,6 @@
package mightypork.rogue.display.constraints; package mightypork.rogue.display.constraints;
import mightypork.utils.math.coord.Coord; import mightypork.utils.math.coord.Coord;
@ -13,7 +14,8 @@ public abstract class Constraint implements ConstraintContext {
} }
public void setContext(ConstraintContext context) { public void setContext(ConstraintContext context)
{
this.context = context; this.context = context;
} }
@ -23,11 +25,15 @@ public abstract class Constraint implements ConstraintContext {
return context; return context;
} }
protected Coord origin() {
protected Coord origin()
{
return context.getRect().getOrigin(); return context.getRect().getOrigin();
} }
protected Coord size() {
protected Coord size()
{
return context.getRect().getSize(); return context.getRect().getSize();
} }

@ -1,9 +1,10 @@
package mightypork.rogue.display.constraints; package mightypork.rogue.display.constraints;
import mightypork.utils.math.coord.Coord;
import mightypork.utils.math.coord.Rect; import mightypork.utils.math.coord.Rect;
public interface ConstraintContext { public interface ConstraintContext {
public Rect getRect(); public Rect getRect();
} }

@ -8,6 +8,7 @@ import mightypork.rogue.input.events.MouseMotionEvent;
import mightypork.utils.math.coord.Coord; import mightypork.utils.math.coord.Coord;
import mightypork.utils.patterns.Destroyable; import mightypork.utils.patterns.Destroyable;
import mightypork.utils.patterns.Initializable; import mightypork.utils.patterns.Initializable;
import org.lwjgl.LWJGLException; import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard; import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse; import org.lwjgl.input.Mouse;
@ -112,7 +113,7 @@ public class InputSystem implements KeyBinder, Destroyable, Initializable {
int wheeld = Mouse.getEventDWheel(); int wheeld = Mouse.getEventDWheel();
if (button != -1 || wheeld != 0) App.broadcast(new MouseButtonEvent(pos, button, down, wheeld)); if (button != -1 || wheeld != 0) App.broadcast(new MouseButtonEvent(pos, button, down, wheeld));
if(!move.isZero()) App.broadcast(new MouseMotionEvent(pos, move)); if (!move.isZero()) App.broadcast(new MouseMotionEvent(pos, move));
} }

@ -14,6 +14,7 @@ public interface KeyBinder {
/** /**
* Remove handler from a keystroke (id any) * Remove handler from a keystroke (id any)
*
* @param stroke stroke * @param stroke stroke
*/ */
abstract void unbindKeyStroke(KeyStroke stroke); abstract void unbindKeyStroke(KeyStroke stroke);

@ -35,7 +35,7 @@ public class KeyBinding implements KeyboardEvent.Listener {
public void receive(KeyboardEvent event) public void receive(KeyboardEvent event)
{ {
// ignore unrelated events // ignore unrelated events
if(!keystroke.getKeys().contains(event.getKey())) return; if (!keystroke.getKeys().contains(event.getKey())) return;
// run handler when event was met // run handler when event was met
if (keystroke.isActive() && !wasActive) { if (keystroke.isActive() && !wasActive) {

@ -30,7 +30,7 @@ public class KeyBindingPool implements KeyBinder, KeyboardEvent.Listener {
{ {
for (KeyBinding kb : bindings) { for (KeyBinding kb : bindings) {
if (kb.matches(stroke)) { if (kb.matches(stroke)) {
Log.w("Duplicate KeyBinding ("+stroke+"), using newest handler."); Log.w("Duplicate KeyBinding (" + stroke + "), using newest handler.");
kb.setHandler(task); kb.setHandler(task);
return; return;
} }
@ -42,6 +42,7 @@ public class KeyBindingPool implements KeyBinder, KeyboardEvent.Listener {
/** /**
* Remove handler from keystroke (id any) * Remove handler from keystroke (id any)
*
* @param stroke stroke * @param stroke stroke
*/ */
@Override @Override
@ -58,10 +59,11 @@ public class KeyBindingPool implements KeyBinder, KeyboardEvent.Listener {
} }
} }
@Override @Override
public void receive(KeyboardEvent event) public void receive(KeyboardEvent event)
{ {
for(KeyBinding kb: bindings) { for (KeyBinding kb : bindings) {
kb.receive(event); kb.receive(event);
} }
} }

@ -1,10 +1,10 @@
package mightypork.rogue.input.events; package mightypork.rogue.input.events;
import org.lwjgl.input.Keyboard;
import mightypork.utils.patterns.subscription.Handleable; import mightypork.utils.patterns.subscription.Handleable;
import org.lwjgl.input.Keyboard;
/** /**
* A keyboard event * A keyboard event
@ -42,6 +42,7 @@ public class KeyboardEvent implements Handleable<KeyboardEvent.Listener> {
return down; return down;
} }
/** /**
* @return true if key was just released * @return true if key was just released
*/ */
@ -76,10 +77,11 @@ public class KeyboardEvent implements Handleable<KeyboardEvent.Listener> {
public void receive(KeyboardEvent event); public void receive(KeyboardEvent event);
} }
@Override @Override
public String toString() public String toString()
{ {
return Keyboard.getKeyName(key)+":"+(down?"DOWN":"UP"); return Keyboard.getKeyName(key) + ":" + (down ? "DOWN" : "UP");
} }
} }

@ -2,9 +2,9 @@ package mightypork.rogue.sounds;
import mightypork.utils.objects.Mutable; import mightypork.utils.objects.Mutable;
import mightypork.utils.time.AnimDouble;
import mightypork.utils.time.Pauseable; import mightypork.utils.time.Pauseable;
import mightypork.utils.time.Updateable; import mightypork.utils.time.Updateable;
import mightypork.utils.time.animation.AnimDouble;
import org.lwjgl.openal.AL10; import org.lwjgl.openal.AL10;

@ -34,7 +34,6 @@ public class SoundSystem implements Updateable, Destroyable {
private static Coord listener = new Coord(); private static Coord listener = new Coord();
static { static {
// initialize sound system // initialize sound system
SoundStore.get().setMaxSources(MAX_SOURCES); SoundStore.get().setMaxSources(MAX_SOURCES);
@ -118,14 +117,15 @@ public class SoundSystem implements Updateable, Destroyable {
/** /**
* Create {@link AudioX} for a resource * Create {@link AudioX} for a resource
*
* @param res a resource name * @param res a resource name
* @return the resource * @return the resource
*
* @throws IllegalArgumentException if resource is already registered * @throws IllegalArgumentException if resource is already registered
*/ */
private AudioX getResource(String res) { private AudioX getResource(String res)
{
AudioX a = new AudioX(res); AudioX a = new AudioX(res);
if(resources.contains(a)) throw new IllegalArgumentException("Sound resource "+res+" is already registered."); if (resources.contains(a)) throw new IllegalArgumentException("Sound resource " + res + " is already registered.");
resources.add(a); resources.add(a);
return a; return a;
} }
@ -298,7 +298,7 @@ public class SoundSystem implements Updateable, Destroyable {
@Override @Override
public void destroy() public void destroy()
{ {
for(AudioX r: resources) { for (AudioX r : resources) {
r.destroy(); r.destroy();
} }

@ -4,7 +4,6 @@ package mightypork.rogue.util;
import static org.lwjgl.opengl.GL11.*; import static org.lwjgl.opengl.GL11.*;
import mightypork.rogue.textures.TextureManager; import mightypork.rogue.textures.TextureManager;
import mightypork.rogue.textures.TxQuad; import mightypork.rogue.textures.TxQuad;
import mightypork.utils.math.Calc.Deg;
import mightypork.utils.math.color.HSV; import mightypork.utils.math.color.HSV;
import mightypork.utils.math.color.RGB; import mightypork.utils.math.color.RGB;
import mightypork.utils.math.coord.Coord; import mightypork.utils.math.coord.Coord;

@ -7,7 +7,9 @@ package mightypork.rogue.util;
* @author MightyPork * @author MightyPork
*/ */
public class Utils { public class Utils {
public static Thread runAsThread(Runnable r) {
public static Thread runAsThread(Runnable r)
{
Thread t = new Thread(r); Thread t = new Thread(r);
t.start(); t.start();
return t; return t;

@ -757,7 +757,7 @@ public class Calc {
* @param from last angle * @param from last angle
* @param to new angle * @param to new angle
* @param time time 0..1 * @param time time 0..1
* @param easing easing function * @param easing easing function
* @return current angle to render * @return current angle to render
*/ */
public static double interpolateDeg(double from, double to, double time, Easing easing) public static double interpolateDeg(double from, double to, double time, Easing easing)
@ -772,7 +772,7 @@ public class Calc {
* @param from last angle * @param from last angle
* @param to new angle * @param to new angle
* @param time time 0..1 * @param time time 0..1
* @param easing easing function * @param easing easing function
* @return current angle to render * @return current angle to render
*/ */
public static double interpolateRad(double from, double to, double time, Easing easing) public static double interpolateRad(double from, double to, double time, Easing easing)

@ -1,5 +1,6 @@
package mightypork.utils.math.coord; package mightypork.utils.math.coord;
import mightypork.utils.math.Calc; import mightypork.utils.math.Calc;
import mightypork.utils.time.Updateable; import mightypork.utils.time.Updateable;
@ -16,6 +17,7 @@ public class CoordAnimated extends Coord implements Updateable {
private Coord start; private Coord start;
private double time = 0; private double time = 0;
/** /**
* Update delta timing * Update delta timing
* *
@ -34,6 +36,7 @@ public class CoordAnimated extends Coord implements Updateable {
} }
} }
/** /**
* Remember position (other changes will be for animation) * Remember position (other changes will be for animation)
*/ */
@ -45,6 +48,7 @@ public class CoordAnimated extends Coord implements Updateable {
offs = Coord.zero(); offs = Coord.zero();
} }
/** /**
* Start animation * Start animation
* *
@ -59,6 +63,7 @@ public class CoordAnimated extends Coord implements Updateable {
offs = start.vecTo(this); offs = start.vecTo(this);
} }
/** /**
* Stop animation, assign to current value * Stop animation, assign to current value
*/ */
@ -69,6 +74,7 @@ public class CoordAnimated extends Coord implements Updateable {
animTime = 0; animTime = 0;
} }
/** /**
* Get if animation is finished * Get if animation is finished
* *
@ -79,6 +85,7 @@ public class CoordAnimated extends Coord implements Updateable {
return animTime >= time; return animTime >= time;
} }
/** /**
* Get current value (animated) * Get current value (animated)
* *

@ -1,322 +1,311 @@
package mightypork.utils.math.easing; package mightypork.utils.math.easing;
import mightypork.utils.math.Calc;
/** /**
* Easing function.<br> * EasingFunction function.
* The easing function must be time-invariant and it's domain is [0-1].
* *
* @author MightyPork * @author MightyPork
*/ */
public interface Easing { public abstract class Easing {
/** /**
* Get value of the easing function at given time. * Get value at time t.
* *
* @param time number in range 0..1 * @param t time parameter (t = 1..1)
* @return value at given time * @return value at given t (0..1, can exceed if needed)
*/ */
public double get(double time); public abstract double get(double t);
public static final Easing NONE = new Easing() {
@Override /**
public double get(double time) * Reverse an easing
{ *
double t = Calc.clampd(time, 0, 1); * @param original original easing
* @return reversed easing
*/
public static Easing reverse(Easing original)
{
return new Reverse(original);
}
return (t < 0.5 ? 0 : 1);
}
};
public static final Easing LINEAR = new Easing() { /**
* Combine two easings
*
* @param in initial easing
* @param out terminal easing
* @return product
*/
public static Easing combine(Easing in, Easing out)
{
return new Composite(in, out);
}
@Override
public double get(double time)
{
double t = Calc.clampd(time, 0, 1);
return t; /**
} * Create "bilinear" easing - compose of straight and reverse.
}; *
* @param in initial easing
* @return product
*/
public static Easing inOut(Easing in)
{
return combine(in, reverse(in));
}
public static final Easing QUADRATIC_IN = new Easing() { /**
* Reverse EasingFunction
*
* @author MightyPork
*/
private static class Reverse extends Easing {
@Override private Easing ea;
public double get(double time)
{
double t = Calc.clampd(time, 0, 1);
return t * t;
/**
* @param in Easing to reverse
*/
public Reverse(Easing in) {
this.ea = in;
} }
};
public static final Easing QUADRATIC_OUT = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double t = Calc.clampd(time, 0, 1); return 1 - ea.get(1 - t);
return 1 - (t - 1) * (t - 1);
} }
}; }
/**
* Composite EasingFunction (0-0.5 EasingFunction A, 0.5-1 EasingFunction B)
*
* @author MightyPork
*/
private static class Composite extends Easing {
public static final Easing QUADRATIC = new Easing() { private Easing in;
private Easing out;
@Override
public double get(double time)
{
double t = Calc.clampd(time, 0, 1);
if (t < 0.5) return QUADRATIC_IN.get(2 * t) * 0.5; /**
return 0.5 + QUADRATIC_OUT.get(2 * t - 1) * 0.5; * Create a composite EasingFunction
*
* @param in initial EasingFunction
* @param out terminal EasingFunction
*/
public Composite(Easing in, Easing out) {
this.in = in;
this.out = out;
} }
};
public static final Easing CUBIC_IN = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double t = Calc.clampd(time, 0, 1); if (t < 0.5) return in.get(2 * t) * 0.5;
return 0.5 + out.get(2 * t - 1) * 0.5;
return t * t * t;
} }
}; }
public static final Easing CUBIC_OUT = new Easing() {
/** No easing; At t=0.5 goes high. */
public static final Easing NONE = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double t = Calc.clampd(time, 0, 1); return (t < 0.5 ? 0 : 1);
return (t - 1) * (t - 1) * (t - 1) + 1;
} }
}; };
public static final Easing CUBIC = new Easing() {
/** Linear (y=t) easing */
public static final Easing LINEAR = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double d = 1; return t;
double t = time;
double b = 0;
double c = (1 - 0);
t /= d / 2;
if (t < 1) return c / 2 * t * t * t + b;
t -= 2;
return c / 2 * (t * t * t + 2) + b;
} }
}; };
public static final Easing QUARTIC_IN = new Easing() {
/** Quadratic (y=t^2) easing in */
public static final Easing QUADRATIC_IN = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double d = 1; return t * t;
double t = time;
double b = 0;
double c = (1 - 0);
t /= d;
return c * t * t * t * t + b;
} }
}; };
public static final Easing QUARTIC_OUT = new Easing() {
/** Quadratic (y=t^2) easing out */
public static final Easing QUADRATIC_OUT = reverse(QUADRATIC_IN);
/** Quadratic (y=t^2) easing both */
public static final Easing QUADRATIC_IN_OUT = inOut(QUADRATIC_IN);
/** Cubic (y=t^3) easing in */
public static final Easing CUBIC_IN = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double d = 1; return t * t * t;
double t = time;
double b = 0;
double c = (1 - 0);
t /= d;
t--;
return -c * (t * t * t * t - 1) + b;
} }
}; };
public static final Easing QUARTIC = new Easing() {
/** Cubic (y=t^3) easing out */
public static final Easing CUBIC_OUT = reverse(CUBIC_IN);
/** Cubic (y=t^3) easing both */
public static final Easing CUBIC_IN_OUT = inOut(CUBIC_IN);
/** Quartic (y=t^4) easing in */
public static final Easing QUARTIC_IN = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double d = 1; return t * t * t * t;
double t = time;
double b = 0;
double c = (1 - 0);
t /= d / 2;
if (t < 1) return c / 2 * t * t * t * t + b;
t -= 2;
return -c / 2 * (t * t * t * t - 2) + b;
} }
}; };
/** Quartic (y=t^4) easing out */
public static final Easing QUARTIC_OUT = reverse(QUADRATIC_IN);
/** Quartic (y=t^4) easing both */
public static final Easing QUARTIC_IN_OUT = inOut(QUADRATIC_IN);
/** Quintic (y=t^5) easing in */
public static final Easing QUINTIC_IN = new Easing() { public static final Easing QUINTIC_IN = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double d = 1; return t * t * t * t * t;
double t = time;
double b = 0;
double c = (1 - 0);
t /= d;
return c * t * t * t * t * t + b;
} }
}; };
public static final Easing QUINTIC_OUT = new Easing() {
@Override /** Quintic (y=t^5) easing out */
public double get(double time) public static final Easing QUINTIC_OUT = reverse(QUINTIC_IN);
{
double d = 1;
double t = time;
double b = 0;
double c = (1 - 0);
t /= d;
t--;
return c * (t * t * t * t * t + 1) + b;
}
};
public static final Easing QUINTIC_IN_OUT = new Easing() {
@Override /** Quintic (y=t^5) easing both */
public double get(double time) public static final Easing QUINTIC_IN_OUT = inOut(QUINTIC_IN);
{
double d = 1; /** Sine easing in */
double t = time;
double b = 0;
double c = (1 - 0);
t /= d / 2;
if (t < 1) return c / 2 * t * t * t * t * t + b;
t -= 2;
return c / 2 * (t * t * t * t * t + 2) + b;
}
};
public static final Easing SINE_IN = new Easing() { public static final Easing SINE_IN = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double d = 1; return 1 - Math.cos(t * (Math.PI / 2));
double t = time;
double b = 0;
double c = (1 - 0);
return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;
} }
}; };
public static final Easing SINE_OUT = new Easing() {
@Override /** Sine easing out */
public double get(double time) public static final Easing SINE_OUT = reverse(SINE_IN);
{
double d = 1;
double t = time;
double b = 0;
double c = (1 - 0);
return c * Math.sin(t / d * (Math.PI / 2)) + b; /** Sine easing both */
} public static final Easing SINE_IN_OUT = inOut(SINE_IN);
};
public static final Easing SINE = new Easing() {
@Override /** Exponential easing in */
public double get(double time)
{
double d = 1;
double t = time;
double b = 0;
double c = (1 - 0);
return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;
}
};
public static final Easing EXPO_IN = new Easing() { public static final Easing EXPO_IN = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double d = 1; return Math.pow(2, 10 * (t - 1));
double t = time;
double b = 0;
double c = (1 - 0);
return c * Math.pow(2, 10 * (t / d - 1)) + b;
} }
}; };
public static final Easing EXPO_OUT = new Easing() {
@Override /** Exponential easing out */
public double get(double time) public static final Easing EXPO_OUT = reverse(EXPO_IN);
{
double d = 1;
double t = time;
double b = 0;
double c = (1 - 0);
return c * (-Math.pow(2, -10 * t / d) + 1) + b; /** Exponential easing both */
} public static final Easing EXPO_IN_OUT = inOut(EXPO_IN);
};
public static final Easing EXPO = new Easing() { /** Circular easing in */
public static final Easing CIRC_IN = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double d = 1; return 1 - Math.sqrt(1 - t * t);
double t = time;
double b = 0;
double c = (1 - 0);
t /= d / 2;
if (t < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
t--;
return c / 2 * (-Math.pow(2, -10 * t) + 2) + b;
} }
}; };
public static final Easing CIRC_IN = new Easing() {
/** Circular easing out */
public static final Easing CIRC_OUT = reverse(CIRC_IN);
/** Circular easing both */
public static final Easing CIRC_IN_OUT = inOut(CIRC_IN);
/** Bounce easing in */
public static final Easing BOUNCE_OUT = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double d = 1; if (t < (1 / 2.75f)) {
double t = time; return (7.5625f * t * t);
double b = 0;
double c = (1 - 0); } else if (t < (2 / 2.75f)) {
t /= d; t -= (1.5f / 2.75f);
return -c * (Math.sqrt(1 - t * t) - 1) + b; return (7.5625f * t * t + 0.75f);
} else if (t < (2.5 / 2.75)) {
t -= (2.25f / 2.75f);
return (7.5625f * t * t + 0.9375f);
} else {
t -= (2.625f / 2.75f);
return (7.5625f * t * t + 0.984375f);
}
} }
}; };
public static final Easing CIRC_OUT = new Easing() {
/** Bounce easing out */
public static final Easing BOUNCE_IN = reverse(BOUNCE_OUT);
/** Bounce easing both */
public static final Easing BOUNCE_IN_OUT = inOut(BOUNCE_IN);
/** Back easing in */
public static final Easing BACK_IN = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double d = 1; float s = 1.70158f;
double t = time; return t * t * ((s + 1) * t - s);
double b = 0;
double c = (1 - 0);
t--;
return c * Math.sqrt(1 - t * t) + b;
} }
}; };
public static final Easing CIRC = new Easing() {
/** Back easing out */
public static final Easing BACK_OUT = reverse(BACK_IN);
/** Back easing both */
public static final Easing BACK_IN_OUT = inOut(BACK_IN);
/** Elastic easing in */
public static final Easing ELASTIC_IN = new Easing() {
@Override @Override
public double get(double time) public double get(double t)
{ {
double d = 1; if (t == 0) return 0;
double t = time; if (t == 1) return 1;
double b = 0;
double c = (1 - 0); double p = .3f;
double s = p / 4;
t /= d / 2; return -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));
if (t < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;
t -= 2;
return c / 2 * (Math.sqrt(1 - t * t) + 1) + b;
} }
}; };
/** Elastic easing out */
public static final Easing ELASTIC_OUT = reverse(ELASTIC_IN);
/** Elastic easing both */
public static final Easing ELASTIC_IN_OUT = inOut(ELASTIC_IN);
} }

@ -71,10 +71,11 @@ public class Mutable<T> {
return true; return true;
} }
@Override @Override
public String toString() public String toString()
{ {
if(o == null) return "<null>"; if (o == null) return "<null>";
return o.toString(); return o.toString();
} }
} }

@ -15,6 +15,7 @@ import java.util.Map;
* *
* *
* *
*
* Object[] array = { &quot;one&quot;, 1, &quot;two&quot;, 4, &quot;three&quot;, 9, &quot;four&quot;, 16 }; * Object[] array = { &quot;one&quot;, 1, &quot;two&quot;, 4, &quot;three&quot;, 9, &quot;four&quot;, 16 };
* Map&lt;String, Integer&gt; args = new VarargsParser&lt;String, Integer&gt;().parse(array); * Map&lt;String, Integer&gt; args = new VarargsParser&lt;String, Integer&gt;().parse(array);
* </pre> * </pre>

@ -7,6 +7,7 @@ package mightypork.utils.patterns;
* @author MightyPork * @author MightyPork
*/ */
public interface Destroyable { public interface Destroyable {
/** /**
* Destroy this object * Destroy this object
*/ */

@ -7,6 +7,7 @@ package mightypork.utils.patterns;
* @author MightyPork * @author MightyPork
*/ */
public interface Initializable { public interface Initializable {
/** /**
* Initialize if not initialized yet * Initialize if not initialized yet
*/ */

@ -1,5 +1,6 @@
package mightypork.utils.patterns.subscription; package mightypork.utils.patterns.subscription;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
import java.util.Set; import java.util.Set;
@ -29,7 +30,7 @@ public class MessageBus implements Subscribable {
// if the channel already exists, return this instance instead. // if the channel already exists, return this instance instead.
for (MessageChannel<?, ?> ch : channels) { for (MessageChannel<?, ?> ch : channels) {
if (ch.equals(channel)) { if (ch.equals(channel)) {
Log.w("Channel of type "+channel+" already registered."); Log.w("Channel of type " + channel + " already registered.");
return ch; return ch;
} }
} }

@ -24,7 +24,7 @@ public final class MessageChannel<MESSAGE extends Handleable<CLIENT>, CLIENT> im
public MessageChannel(Class<MESSAGE> messageClass, Class<CLIENT> clientClass) { public MessageChannel(Class<MESSAGE> messageClass, Class<CLIENT> clientClass) {
if(messageClass == null || clientClass == null) throw new IllegalArgumentException("Null Message or Client class."); if (messageClass == null || clientClass == null) throw new IllegalArgumentException("Null Message or Client class.");
this.clientClass = clientClass; this.clientClass = clientClass;
this.messageClass = messageClass; this.messageClass = messageClass;
@ -134,10 +134,11 @@ public final class MessageChannel<MESSAGE extends Handleable<CLIENT>, CLIENT> im
return true; return true;
} }
@Override @Override
public String toString() public String toString()
{ {
return "CHANNEL( "+messageClass.getSimpleName()+" -> "+clientClass.getSimpleName()+" )"; return "CHANNEL( " + messageClass.getSimpleName() + " -> " + clientClass.getSimpleName() + " )";
} }

@ -1,8 +1,10 @@
package mightypork.utils.time; package mightypork.utils.time.animation;
import mightypork.utils.math.Calc; import mightypork.utils.math.Calc;
import mightypork.utils.math.easing.Easing; import mightypork.utils.math.easing.Easing;
import mightypork.utils.time.Pauseable;
import mightypork.utils.time.Updateable;
/** /**
@ -194,7 +196,12 @@ public class AnimDouble implements Updateable, Pauseable {
this.from = from; this.from = from;
this.to = to; this.to = to;
this.duration = time * (1 - getProgressFromValue(current));
double progress = getProgressFromValue(current);
this.from = (progress > 0 ? current : from);
this.duration = time * (1 - progress);
this.elapsedTime = 0; this.elapsedTime = 0;
} }
@ -203,6 +210,8 @@ public class AnimDouble implements Updateable, Pauseable {
{ {
double p = 0; double p = 0;
if (from == to) return 0;
if (value >= from && value <= to) { // up if (value >= from && value <= to) { // up
p = ((value - from) / (to - from)); p = ((value - from) / (to - from));
} else if (value >= to && value <= from) { // down } else if (value >= to && value <= from) { // down

@ -1,4 +1,4 @@
package mightypork.utils.time; package mightypork.utils.time.animation;
import mightypork.utils.math.Calc; import mightypork.utils.math.Calc;

@ -1,4 +1,4 @@
package mightypork.utils.time; package mightypork.utils.time.animation;
import mightypork.utils.math.Calc; import mightypork.utils.math.Calc;
Loading…
Cancel
Save