# JME 3 Tutorial (4) - Hello Update Loop

Previous: Hello Assets, Next: Hello Input System

Now that you know how to load assets such as 3-D models, you want them to implement the actual gameplay. In this tutorial we look at the update loop. The update loop of your game is where the action happens.

## Code Sample

    package jme3test.helloworld;

    import com.jme3.app.SimpleApplication;
    import com.jme3.material.Material;
    import com.jme3.math.ColorRGBA;
    import com.jme3.math.Vector3f;
    import com.jme3.scene.Geometry;
    import com.jme3.scene.shape.Box;

    /** Sample 4 - how to trigger repeating actions from the main update loop.
     * In this example, we make the player character rotate. */
    public class HelloLoop extends SimpleApplication {

        public static void main(String[] args){
            HelloLoop app = new HelloLoop();
            app.start();
        }

        protected Geometry player;

        @Override
        public void simpleInitApp() {

            Box(Vector3f.ZERO, 1, 1, 1);
            player = new Geometry("blue cube", b);
            Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
            mat.setColor("Color", ColorRGBA.Blue);
            player.setMaterial(mat);
            rootNode.attachChild(player);
        }

        /* This is the update loop */
        @Override
        public void simpleUpdate(float tpf) {
            // make the player rotate
            player.rotate(0, 2*tpf, 0);
        }
    }

Build and run the file: You see a constantly rotating cube.

## Understanding the Code

Compared to our previous code samples you note that the player Geometry is now a class field. This is because we want the update loop to be able to access and transform this Geometry. As you can see, we initialize the player object in the `simpleInitApp()` method.

Now have a closer look at the `simpleUpdate()` method, this is the update loop.

- The `player.rotate(0, 2*tpf, 0);` line changes the rotation of the player object.
- We use the `tpf` variable ("time per frame") to time this action depending on the current frames per second rate. This means the cube rotates with the same speed on fast machines, and the game remains playable.

## The Update Loop

A rotating object is just a simple example. In the update loop, you can update score and health points, check for collisions, make enemies calculate their next move, roll the dice whether a trap has been set off, play random ambient sounds, and much more.

- The update loop starts after the `simpleInitApp()` method has set up the scenegraph and state variables.
- JME executes everything in the `simpleUpdate()` method repeatedly, as fast as possible.
  1. Use the loop to poll the game state and initiate actions.
  2. Use the loop to trigger reactions and update the game state.
  3. Use it wisely, because having too many calls in the loop also slows down the game.

## Exercises

Here are some fun things to try:

1. What happens if you give the rotate() method negative numbers?
2. Can you create two models next to each other, and make one rotate twice as fast as the other? (use the `tpf`)
3. Can you make a cube that pulsates? (grows and shrinks)
4. Can you make a rolling cube? (spin around the x axis, and translate along the z axis)

Look back at the Hello Node tutorial if you do not remember the transformation methods for scaling, translating, and rotating.

## Conclusion

Now you are listening to the update loop, "the heart beat" of the game, and you can add all kinds of action to it.

The next thing the game needs is some interaction! Continue learning how to respond to user input.

See also: Advanced jME3 developers additionally use Application States and Custom Controls to implement more complex mechanics in their game loops. You will come across these topics later when you proceed to advanced documentation.

documentation, beginner,, state, states, intro, beginner, controller, controllers, loop

view online version