From 8cd834c4557adf641f4aae13cea645840d00c1da Mon Sep 17 00:00:00 2001 From: gered Date: Sun, 15 Dec 2013 13:33:52 -0500 Subject: [PATCH] add support for controlling how fast game updates run at --- src/main/java/ca/blarg/gdx/GameLooper.java | 10 ++++ .../java/ca/blarg/gdx/GdxGameAppListener.java | 57 +++++++++++++++++-- 2 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 src/main/java/ca/blarg/gdx/GameLooper.java diff --git a/src/main/java/ca/blarg/gdx/GameLooper.java b/src/main/java/ca/blarg/gdx/GameLooper.java new file mode 100644 index 0000000..f277626 --- /dev/null +++ b/src/main/java/ca/blarg/gdx/GameLooper.java @@ -0,0 +1,10 @@ +package ca.blarg.gdx; + +public interface GameLooper { + void setTiming(int updatesPerSecond, int maxFrameSkip); + + int getUpdateFrequency(); + + float getUpdateDelta(); + float getRenderDelta(); +} diff --git a/src/main/java/ca/blarg/gdx/GdxGameAppListener.java b/src/main/java/ca/blarg/gdx/GdxGameAppListener.java index 483ddd4..8b67c6a 100644 --- a/src/main/java/ca/blarg/gdx/GdxGameAppListener.java +++ b/src/main/java/ca/blarg/gdx/GdxGameAppListener.java @@ -2,8 +2,19 @@ package ca.blarg.gdx; import com.badlogic.gdx.ApplicationListener; import com.badlogic.gdx.Gdx; +import com.badlogic.gdx.utils.TimeUtils; + +public class GdxGameAppListener implements ApplicationListener, GameLooper { + int updatesPerSecond; + int updateFrequency; + int maxFrameSkip; + + long nextTick = 0; + int loops; + + float updateDelta = 0.0f; + float renderDelta = 0.0f; -public class GdxGameAppListener implements ApplicationListener { Class gameAppType; GameApp gameApp; @@ -16,6 +27,10 @@ public class GdxGameAppListener implements ApplicationListener { Gdx.app.debug("GdxGameAppListener", "create"); Gdx.app.debug("GdxGameAppListener", String.format("Application type: %s", Gdx.app.getType())); + Services.register(GameLooper.class, this); + + setTiming(20, 5); + try { gameApp = gameAppType.newInstance(); } catch (Exception e) { @@ -30,6 +45,8 @@ public class GdxGameAppListener implements ApplicationListener { } gameApp.onCreate(); + + nextTick = TimeUtils.millis(); } @Override @@ -40,10 +57,17 @@ public class GdxGameAppListener implements ApplicationListener { @Override public void render() { - // TODO: probably not the best idea to share the same delta with both renders and updates... - float delta = Gdx.graphics.getDeltaTime(); - gameApp.onUpdate(delta); - gameApp.onRender(delta); + loops = 0; + while (TimeUtils.millis() > nextTick && loops < maxFrameSkip) { + gameApp.onUpdate(updateDelta); + + nextTick += updateFrequency; + ++loops; + } + + renderDelta = (float)(TimeUtils.millis() + updateFrequency - nextTick) / (float)updateFrequency; + + gameApp.onRender(renderDelta); } @Override @@ -64,4 +88,27 @@ public class GdxGameAppListener implements ApplicationListener { if (gameApp != null) gameApp.dispose(); } + + @Override + public void setTiming(int updatesPerSecond, int maxFrameSkip) { + this.updatesPerSecond = updatesPerSecond; + updateFrequency = 1000 / this.updatesPerSecond; + this.maxFrameSkip = maxFrameSkip; + this.updateDelta = updateFrequency / 1000.0f; + } + + @Override + public int getUpdateFrequency() { + return updateFrequency; + } + + @Override + public float getUpdateDelta() { + return updateDelta; + } + + @Override + public float getRenderDelta() { + return renderDelta; + } }