diff --git a/com/danitheskunk/skunkworks/BaseGame.java b/com/danitheskunk/skunkworks/BaseGame.java index 8f053c0..abd0488 100644 --- a/com/danitheskunk/skunkworks/BaseGame.java +++ b/com/danitheskunk/skunkworks/BaseGame.java @@ -31,6 +31,7 @@ public abstract class BaseGame { lastTime = currentTime; window.tick(); //todo: frame rate control + rootNode.tick(); update(1000.0 / 60.0); var rc = window.renderStart(); renderPre(rc); diff --git a/com/danitheskunk/skunkworks/TestNode.java b/com/danitheskunk/skunkworks/TestNode.java index 2c23087..8c8f399 100644 --- a/com/danitheskunk/skunkworks/TestNode.java +++ b/com/danitheskunk/skunkworks/TestNode.java @@ -11,9 +11,11 @@ public class TestNode extends BaseGame { sprite.setTexture(window.loadTexture("demoassets/test.png")); sprite.setPos(new Vec2f(100, 100)); rootNode.add(sprite); + sprite.tweenPos(new Vec2f(800, 400), 120).delay(600); } public static void main(String[] args) { new TestNode().run(); } } + diff --git a/com/danitheskunk/skunkworks/nodes/BaseTween.java b/com/danitheskunk/skunkworks/nodes/BaseTween.java index 441c9ee..680a9a5 100644 --- a/com/danitheskunk/skunkworks/nodes/BaseTween.java +++ b/com/danitheskunk/skunkworks/nodes/BaseTween.java @@ -2,6 +2,8 @@ package com.danitheskunk.skunkworks.nodes; public abstract class BaseTween { protected double progress; + protected int startFrame; + protected int endFrame; public BaseTween() { progress = 0; @@ -11,5 +13,10 @@ public abstract class BaseTween { this.progress = progress; } + public void delay(int frames) { + startFrame += frames; + endFrame += frames; + } + protected abstract void apply(); } diff --git a/com/danitheskunk/skunkworks/nodes/Node.java b/com/danitheskunk/skunkworks/nodes/Node.java index 3688981..9381a4b 100644 --- a/com/danitheskunk/skunkworks/nodes/Node.java +++ b/com/danitheskunk/skunkworks/nodes/Node.java @@ -56,12 +56,13 @@ public class Node implements Iterable { return Vec2f.add(parent.getAbsolutePos(), pos); } - public Node getRoot() { + public NodeRoot getRoot() { var node = this; while(node.parent != null) { node = node.parent; } - return node; + //todo: check if right class + return (NodeRoot) node; } @Override @@ -69,14 +70,29 @@ public class Node implements Iterable { return children.iterator(); } - public class TweenPos extends BaseTween { - private final Vec2f start; - private final Vec2f end; + public int getCurrentFrame() { + return getRoot().getCurrentFrame(); + } - public TweenPos(Vec2f start, Vec2f end) { - this.start = start; - this.end = end; - } + protected void prepareTween(BaseTween tween, int frames) { + var root = getRoot(); + tween.startFrame = root.getCurrentFrame(); + tween.endFrame = tween.startFrame + frames; + } + + public TweenPos tweenPos(Vec2f to, int frames) { + var tween = new TweenPos(); + tween.start = pos; + tween.end = to; + prepareTween(tween, frames); + getRoot().getTweener().add(tween); + return tween; + } + + + public class TweenPos extends BaseTween { + private Vec2f start; + private Vec2f end; @Override protected void apply() { diff --git a/com/danitheskunk/skunkworks/nodes/NodeRoot.java b/com/danitheskunk/skunkworks/nodes/NodeRoot.java index 6a331e4..7bf750f 100644 --- a/com/danitheskunk/skunkworks/nodes/NodeRoot.java +++ b/com/danitheskunk/skunkworks/nodes/NodeRoot.java @@ -1,5 +1,25 @@ package com.danitheskunk.skunkworks.nodes; -public class NodeRoot extends Node { +import com.danitheskunk.skunkworks.Timestep; +import com.danitheskunk.skunkworks.Vec2f; +public class NodeRoot extends Node { + private Tweener tweener; + + public NodeRoot() { + tweener = new Tweener(Timestep.FIXED); + } + + @Override + public int getCurrentFrame() { + return tweener.getCurrentFrame(); + } + + public void tick() { + tweener.tick(); + } + + public Tweener getTweener() { + return tweener; + } } diff --git a/com/danitheskunk/skunkworks/nodes/Tweener.java b/com/danitheskunk/skunkworks/nodes/Tweener.java index de8dbff..c771e97 100644 --- a/com/danitheskunk/skunkworks/nodes/Tweener.java +++ b/com/danitheskunk/skunkworks/nodes/Tweener.java @@ -2,10 +2,46 @@ package com.danitheskunk.skunkworks.nodes; import com.danitheskunk.skunkworks.Timestep; +import java.util.ArrayList; +import java.util.List; + public class Tweener { private Timestep timestepMode; + private List tweens; + private int currentFrame; public Tweener(Timestep timestepMode) { this.timestepMode = timestepMode; + this.tweens = new ArrayList<>(); + this.currentFrame = 0; + } + + public int getCurrentFrame() { + return currentFrame; + } + + public void tick() { + var toRemove = new ArrayList(); + for(var tween : tweens) { + if(currentFrame >= tween.startFrame && + currentFrame <= tween.endFrame) { + var len = tween.endFrame - tween.startFrame; + var off = currentFrame - tween.startFrame; + var progress = (double) off / (double) len; + tween.setProgress(progress); + tween.apply(); + } + if(currentFrame == tween.endFrame) { + toRemove.add(tween); + } + } + for(var tween : toRemove) { + tweens.remove(tween); + } + ++currentFrame; + } + + public void add(BaseTween tween) { + tweens.add(tween); } }