@ -50,11 +50,21 @@ public class AppStateManager {
private final ArrayList < AppState > states = new ArrayList < AppState > ( ) ;
private final Application app ;
private AppState [ ] stateArray ;
public AppStateManager ( Application app ) {
this . app = app ;
}
protected AppState [ ] getArray ( ) {
synchronized ( states ) {
if ( stateArray = = null ) {
stateArray = states . toArray ( new AppState [ states . size ( ) ] ) ;
}
return stateArray ;
}
}
/ * *
* Attach a state to the AppStateManager , the same state cannot be attached
* twice .
@ -68,6 +78,7 @@ public class AppStateManager {
if ( ! states . contains ( state ) ) {
state . stateAttached ( this ) ;
states . add ( state ) ;
stateArray = null ;
return true ;
} else {
return false ;
@ -87,6 +98,7 @@ public class AppStateManager {
if ( states . contains ( state ) ) {
state . stateDetached ( this ) ;
states . remove ( state ) ;
stateArray = null ;
return true ;
} else {
return false ;
@ -132,18 +144,15 @@ public class AppStateManager {
* @param tpf Time per frame .
* /
public void update ( float tpf ) {
synchronized ( states ) {
int num = states . size ( ) ;
for ( int i = 0 ; i < num ; i + + ) {
AppState state = states . get ( i ) ;
if ( ! state . isInitialized ( ) )
state . initialize ( this , app ) ;
AppState [ ] array = getArray ( ) ;
for ( AppState state : array ) {
if ( ! state . isInitialized ( ) )
state . initialize ( this , app ) ;
if ( state . isEnabled ( ) ) {
state . update ( tpf ) ;
}
if ( state . isEnabled ( ) ) {
state . update ( tpf ) ;
}
}
}
}
/ * *
@ -151,16 +160,13 @@ public class AppStateManager {
* @param rm The RenderManager
* /
public void render ( RenderManager rm ) {
synchronized ( states ) {
int num = states . size ( ) ;
for ( int i = 0 ; i < num ; i + + ) {
AppState state = states . get ( i ) ;
if ( ! state . isInitialized ( ) )
state . initialize ( this , app ) ;
AppState [ ] array = getArray ( ) ;
for ( AppState state : array ) {
if ( ! state . isInitialized ( ) )
state . initialize ( this , app ) ;
if ( state . isEnabled ( ) ) {
state . render ( rm ) ;
}
if ( state . isEnabled ( ) ) {
state . render ( rm ) ;
}
}
}
@ -170,16 +176,13 @@ public class AppStateManager {
* @param rm The RenderManager
* /
public void postRender ( ) {
synchronized ( states ) {
int num = states . size ( ) ;
for ( int i = 0 ; i < num ; i + + ) {
AppState state = states . get ( i ) ;
if ( ! state . isInitialized ( ) )
state . initialize ( this , app ) ;
AppState [ ] array = getArray ( ) ;
for ( AppState state : array ) {
if ( ! state . isInitialized ( ) )
state . initialize ( this , app ) ;
if ( state . isEnabled ( ) ) {
state . postRender ( ) ;
}
if ( state . isEnabled ( ) ) {
state . postRender ( ) ;
}
}
}
@ -188,11 +191,9 @@ public class AppStateManager {
* Calls cleanup on attached states , do not call directly .
* /
public void cleanup ( ) {
synchronized ( states ) {
for ( int i = 0 ; i < states . size ( ) ; i + + ) {
AppState state = states . get ( i ) ;
state . cleanup ( ) ;
}
AppState [ ] array = getArray ( ) ;
for ( AppState state : array ) {
state . cleanup ( ) ;
}
}
}
}