@@ -151,6 +151,65 @@ public class FrameBasedGameLoop extends GameLoop {
151151 }
152152}
153153` ` `
154+ Here's the next game loop implementation, `FixedStepGameLoop` :
155+
156+ ` ` ` java
157+ public class FixedStepGameLoop extends GameLoop {
158+
159+ /**
160+ * 20 ms per frame = 50 FPS.
161+ */
162+ private static final long MS_PER_FRAME = 20;
163+
164+ @Override
165+ protected void processGameLoop() {
166+ var previousTime = System.currentTimeMillis();
167+ var lag = 0L;
168+ while (isGameRunning()) {
169+ var currentTime = System.currentTimeMillis();
170+ var elapsedTime = currentTime - previousTime;
171+ previousTime = currentTime;
172+ lag += elapsedTime;
173+
174+ processInput();
175+
176+ while (lag >= MS_PER_FRAME) {
177+ update();
178+ lag -= MS_PER_FRAME;
179+ }
180+
181+ render();
182+ }
183+ }
184+
185+ protected void update() {
186+ controller.moveBullet(0.5f * MS_PER_FRAME / 1000);
187+ }
188+ }
189+ ` ` `
190+ And the last game loop implementation, `VariableStepGameLoop` :
191+ ` ` ` java
192+ public class VariableStepGameLoop extends GameLoop {
193+
194+ @Override
195+ protected void processGameLoop() {
196+ var lastFrameTime = System.currentTimeMillis();
197+ while (isGameRunning()) {
198+ processInput();
199+ var currentFrameTime = System.currentTimeMillis();
200+ var elapsedTime = currentFrameTime - lastFrameTime;
201+ update(elapsedTime);
202+ lastFrameTime = currentFrameTime;
203+ render();
204+ }
205+ }
206+
207+ protected void update(Long elapsedTime) {
208+ controller.moveBullet(0.5f * elapsedTime / 1000);
209+ }
210+
211+ }
212+ ` ` `
154213
155214Finally, we show all the game loops in action.
156215
0 commit comments