com.jme.app
Class FixedLogicrateGame

java.lang.Object
  extended bycom.jme.app.AbstractGame
      extended bycom.jme.app.FixedLogicrateGame

public abstract class FixedLogicrateGame
extends AbstractGame

FixedLogicrateGame implements a main-loop designed to acheive frame rate independence. The goal is to keep a consistent gameplay speed regardless of the framerate acheived by the visuals. The game renders as fast as the hardware permits, while running the game logic at a fixed rate. The concept behind this is forcing every game logic tick to represent a fixed amount of real-time. For example, if the logic is updated at a rate of 15 times per second, and we have a person moving at 30 pixels per second, each update the person should move 2 pixels.
To compensate for the non-constant frame rate, we smooth the visuals using interpolation. So, if the scene is rendered twice without the game logic being updated, we do not render the same thing twice.
Using a fixed-timestep model has a number of benefits. Game logic is simplified as there is no longer any need to add "*deltaTime" to acheive frame rate independence. There is also a gain in efficiency: the logic can be run at a lower frequency than the rendering, meaning that the logic may be updated only once every second game - a net save in time. In addition, because the exact same sequence of game logic code is executed every time, the game becomes deterministic (that is to say, it will run the exact same way every time).
Further extension of this class could be used to integrate both a fixed logic rate and a fixed frame rate.

Version:
$Id: FixedLogicrateGame.java,v 1.6 2004/04/26 18:56:01 mojomonkey Exp $
Author:
Eric Woroshow

Field Summary
 
Fields inherited from class com.jme.app.AbstractGame
ALWAYS_SHOW_PROPS_DIALOG, display, finished, FIRSTRUN_OR_NOCONFIGFILE_SHOW_PROPS_DIALOG, NEVER_SHOW_PROPS_DIALOG, properties
 
Constructor Summary
FixedLogicrateGame()
           
 
Method Summary
protected abstract  void cleanup()
          cleanup cleans up any created objects before exiting the application.
protected abstract  void initGame()
          initGame creates and initializes all game data required for startup.
protected abstract  void initSystem()
          initSystem creates all the necessary system components for the client application.
protected  void quit()
          Quits the program abruptly using System.exit.
protected abstract  void reinit()
          reinit rebuilds the subsystems.
protected abstract  void render(float percentWithinTick)
          Renders the scene.
 void setLogicTicksPerSecond(int tps)
          setLogicTicksPerSecond sets the number of logic times per second the game should update the logic.
 void start()
          Ticks logic at a fixed rate while rendering as fast as hardware permits.
protected abstract  void update(float interpolation)
          update updates the game state.
 
Methods inherited from class com.jme.app.AbstractGame
assertDisplayCreated, finish, getAttributes, getVersion, setDialogBehaviour, setDialogBehaviour, setDialogBehaviour
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

FixedLogicrateGame

public FixedLogicrateGame()
Method Detail

setLogicTicksPerSecond

public void setLogicTicksPerSecond(int tps)
setLogicTicksPerSecond sets the number of logic times per second the game should update the logic. This should not be called prior to the application being start() -ed.

Parameters:
tps - the desired logic rate in ticks per second

start

public final void start()
Ticks logic at a fixed rate while rendering as fast as hardware permits.

Specified by:
start in class AbstractGame

quit

protected void quit()
Quits the program abruptly using System.exit.

Specified by:
quit in class AbstractGame
See Also:
AbstractGame.quit()

update

protected abstract void update(float interpolation)
Description copied from class: AbstractGame
update updates the game state. Physics, AI, networking, score checking and like should be completed in this method. How often and when this method is called depends on the main loop implementation.

Specified by:
update in class AbstractGame
Parameters:
interpolation - unused in this implementation
See Also:
AbstractGame.update(float interpolation)

render

protected abstract void render(float percentWithinTick)
Renders the scene. Under no circumstances should the render method alter anything that could directly or indirectly modify the game logic.

Specified by:
render in class AbstractGame
Parameters:
percentWithinTick - decimal value representing the position between update ticks
See Also:
AbstractGame.render(float interpolation)

initSystem

protected abstract void initSystem()
Description copied from class: AbstractGame
initSystem creates all the necessary system components for the client application. It is is called once after start is called. The display must be initialized within this method.

Specified by:
initSystem in class AbstractGame
See Also:
AbstractGame.initSystem()

initGame

protected abstract void initGame()
Description copied from class: AbstractGame
initGame creates and initializes all game data required for startup. It is suggested that caching of frequently used resources is done within this method. It is called once after initSystem has completed.

Specified by:
initGame in class AbstractGame
See Also:
AbstractGame.initGame()

reinit

protected abstract void reinit()
Description copied from class: AbstractGame
reinit rebuilds the subsystems. It may be called at any time by the client application.

Specified by:
reinit in class AbstractGame
See Also:
AbstractGame.reinit()

cleanup

protected abstract void cleanup()
Description copied from class: AbstractGame
cleanup cleans up any created objects before exiting the application. It is called once after finish is called.

Specified by:
cleanup in class AbstractGame
See Also:
AbstractGame.cleanup()