Sep 2, 2014

41. AppStates

AppStates can be used to keep code manageable by keeping code separate in different state classes, such as game and GUI elements.




Here 3 state classes are written. This is State1.java with some overrides.


// State1.java

package mygame;

import com.jme3.app.Application;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;

class State1 extends AbstractAppState{
    
    @Override
    public void initialize(AppStateManager stateManager, Application app) {
        super.initialize(stateManager, app);
        System.out.println("Initialized - 1");
    }
    
    @Override
    public void stateAttached(AppStateManager stateManager) {
        super.stateAttached(stateManager);
        System.out.println("Attached - 1");
    }
 
    @Override
    public void update(float tpf) {
        super.update(tpf);
        System.out.println("update - 1");
    }

    @Override
    public void stateDetached(AppStateManager stateManager) {
        super.stateDetached(stateManager);
        System.out.println("Detached - 1");
    }
 
    @Override
    public void cleanup() {
        super.cleanup();
        System.out.println("Cleanup - 1"); 
    }
    
}



This is State2.java with some overrides. There are more overrides available.


// State2.java

package mygame;

import com.jme3.app.Application;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;

class State2 extends AbstractAppState{
    
    @Override
    public void initialize(AppStateManager stateManager, Application app) {
        super.initialize(stateManager, app);
        System.out.println("Initialized - 2");
    }
    
    @Override
    public void stateAttached(AppStateManager stateManager) {
        super.stateAttached(stateManager);
        System.out.println("Attached - 2");
    }
 
    @Override
    public void update(float tpf) {
        super.update(tpf);
        System.out.println("update - 2");
    }

    @Override
    public void stateDetached(AppStateManager stateManager) {
        super.stateDetached(stateManager);
        System.out.println("Detached - 2");
    }
 
    @Override
    public void cleanup() {
        super.cleanup();
        System.out.println("Cleanup - 2"); 
    }
}



This is State3.java with some overrides. These are just skeletons and they might be used in 2D GUI or parts of 3D scene graph.


// State3.java

package mygame;

import com.jme3.app.Application;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;

class State3 extends AbstractAppState{
    
    @Override
    public void initialize(AppStateManager stateManager, Application app) {
        super.initialize(stateManager, app);
        System.out.println("Initialized - 3");
    }
    
    @Override
    public void stateAttached(AppStateManager stateManager) {
        super.stateAttached(stateManager);
        System.out.println("Attached - 3");
    }
 
    @Override
    public void update(float tpf) {
        super.update(tpf);
        System.out.println("update - 3");
    }

    @Override
    public void stateDetached(AppStateManager stateManager) {
        super.stateDetached(stateManager);
        System.out.println("Detached - 3");
    }
 
    @Override
    public void cleanup() {
        super.cleanup();
        System.out.println("Cleanup - 3"); 
    }
}



We can start states, by attaching them to the stateManager.


        // *** 1. Start (creating states and starting State1,State2)
        state1 = new State1();
        state2 = new State2();
        state3 = new State3();
        System.out.println("Attaching state1 and state3.");
        stateManager.attach(state1);
        stateManager.attach(state3);
        // *** 1. End



For this simple example, different states are started and stopped according to this table.


        // *** 2. Start (Starting and ending states)
        State1 active1 = stateManager.getState(State1.class);
        State2 active2 = stateManager.getState(State2.class);
        State3 active3 = stateManager.getState(State3.class);
        if (active1!=null) { System.out.println("state1 active"); }
        if (active2!=null) { System.out.println("state2 active"); }
        if (active3!=null) { System.out.println("state3 active"); }
        counter++;
        if (counter<60) {
            System.out.print("counter: " + counter);
            System.out.println("\tin SimpleUpdate()");
        }
        if (counter==10) {
            System.out.println("Detaching state3."); 
            stateManager.detach(stateManager.getState(State3.class));
        } else if (counter==20) {
            System.out.println("Detaching state1."); 
            stateManager.detach(stateManager.getState(State1.class));
            System.out.println("Attaching state2.");
            stateManager.attach(state2);
        } else if (counter==30) {
            System.out.println("Attaching state3.");
            stateManager.attach(state3);
        } else if (counter==40) {
            System.out.println("Detaching state2.");
            stateManager.detach(stateManager.getState(State2.class));
        } else if (counter==50) {
            System.out.println("Detaching state3.");
            stateManager.detach(stateManager.getState(State3.class));
        }
        // *** 2. End



// JMonkey41.java

package mygame;

import com.jme3.app.SimpleApplication;

public class JMonkey41 extends SimpleApplication {
    
    private int counter = 0;
    private State1 state1;
    private State2 state2;
    private State3 state3;

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

    @Override
    public void simpleInitApp() {
        // *** 1. Start (creating states and starting State1,State2)
        state1 = new State1();
        state2 = new State2();
        state3 = new State3();
        System.out.println("Attaching state1 and state3.");
        stateManager.attach(state1);
        stateManager.attach(state3);
        // *** 1. End
    }

    @Override
    public void simpleUpdate(float tpf) {
        // *** 2. Start (Starting and ending states)
        State1 active1 = stateManager.getState(State1.class);
        State2 active2 = stateManager.getState(State2.class);
        State3 active3 = stateManager.getState(State3.class);
        if (active1!=null) { System.out.println("state1 active"); }
        if (active2!=null) { System.out.println("state2 active"); }
        if (active3!=null) { System.out.println("state3 active"); }
        counter++;
        if (counter<60) {
            System.out.print("counter: " + counter);
            System.out.println("\tin SimpleUpdate()");
        }
        if (counter==10) {
            System.out.println("Detaching state3."); 
            stateManager.detach(stateManager.getState(State3.class));
        } else if (counter==20) {
            System.out.println("Detaching state1."); 
            stateManager.detach(stateManager.getState(State1.class));
            System.out.println("Attaching state2.");
            stateManager.attach(state2);
        } else if (counter==30) {
            System.out.println("Attaching state3.");
            stateManager.attach(state3);
        } else if (counter==40) {
            System.out.println("Detaching state2.");
            stateManager.detach(stateManager.getState(State2.class));
        } else if (counter==50) {
            System.out.println("Detaching state3.");
            stateManager.detach(stateManager.getState(State3.class));
        }
        // *** 2. End
    }
}



No comments:

Post a Comment