package vooga.scroller.sprites.state;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
import vooga.scroller.sprites.Sprite;
/**
* Limitations: can't do the same state multiple times.
*
* @author Scott Valentine
*
*/
public class SpriteStateManager {
//private static final SpriteState DEFAULT_STATE = new DefaultSpriteState();
@SuppressWarnings("rawtypes")
private Map<Integer, SpriteState> myStates;
@SuppressWarnings("rawtypes")
private Queue<SpriteState> myActiveStates;
/**
* Initializes a state manager with the default state.
*
* @param sprite is the sprite for which this state manager controls the states.
*/
@SuppressWarnings("rawtypes")
public SpriteStateManager(Sprite sprite) {
myActiveStates = new PriorityQueue<SpriteState>();
myStates = new HashMap<Integer, SpriteState>();
SpriteState<Sprite> defaultState = new DefaultSpriteState(sprite);
myStates.put(DefaultSpriteState.DEFAULT_ID, defaultState);
myActiveStates.add(defaultState);
}
/**
* Update the active states in this manager.
*
* @param elapsedTime
* @param bounds
*/
@SuppressWarnings("rawtypes")
public void update (double elapsedTime, Dimension bounds) {
Iterator<SpriteState> it = myActiveStates.iterator();
while(it.hasNext()){
it.next().update(elapsedTime, bounds);
}
// for(SpriteState spState: myActiveStates){
// spState.update(mySprite, elapsedTime, bounds);
// }
}
/**
* Paint the states active in this manager.
*
* @param pen
*/
public void paint (Graphics2D pen) {
// only paint the first state (painting multiple states does not work).
@SuppressWarnings("rawtypes")
SpriteState sp = myActiveStates.peek();
sp.paint(pen, 0);
}
/**
* Activates the specified state.
* @param stateID
*/
public void activateState(int stateID){
@SuppressWarnings("rawtypes")
SpriteState state = myStates.get(stateID);
if(!myActiveStates.contains(state) && state != null){
state.activate();
myActiveStates.add(state);
}
}
/**
* Deactivates the specified state. If stateID is not valid, remove no state.
* @param stateID
*/
@SuppressWarnings("rawtypes")
public void deactivateState(int stateID) {
SpriteState state = myStates.get(stateID);
if(state != null && myActiveStates.contains(state)){
state.deactivate();
myActiveStates.remove(myStates.get(stateID));
}
}
/**
* Adds a new possible state to this manager.
* @param stateID
* @param state
*/
@SuppressWarnings("rawtypes")
public void addState(int stateID, SpriteState state){
myStates.put(stateID, state);
}
/**
* Removes a possible state fromt this manager.
*
* @param stateID
*/
public void removeState(int stateID){
myStates.remove(stateID);
}
}