|
|
@ -2,17 +2,17 @@ |
|
|
|
using System.Collections.Generic; |
|
|
|
|
|
|
|
namespace SemiColinGames { |
|
|
|
public interface IState { |
|
|
|
public interface IState<T> { |
|
|
|
public void Enter(); |
|
|
|
public string? Update(NPC npc, float modelTime, AABB[] collisionTargets); |
|
|
|
public string? Update(T obj, float modelTime, AABB[] collisionTargets); |
|
|
|
} |
|
|
|
|
|
|
|
public class FSM { |
|
|
|
public class FSM<T> { |
|
|
|
float timeInState = 0f; |
|
|
|
Dictionary<string, IState> states; |
|
|
|
IState state; |
|
|
|
Dictionary<string, IState<T>> states; |
|
|
|
IState<T> state; |
|
|
|
|
|
|
|
public FSM(Dictionary<string, IState> states, string initial) { |
|
|
|
public FSM(Dictionary<string, IState<T>> states, string initial) { |
|
|
|
this.states = states; |
|
|
|
StateName = initial; |
|
|
|
Transition(StateName); |
|
|
@ -20,9 +20,9 @@ namespace SemiColinGames { |
|
|
|
|
|
|
|
public string StateName { get; private set; } |
|
|
|
|
|
|
|
public void Update(NPC npc, float modelTime, AABB[] collisionTargets) { |
|
|
|
public void Update(T obj, float modelTime, AABB[] collisionTargets) { |
|
|
|
timeInState += modelTime; |
|
|
|
string? newState = state.Update(npc, modelTime, collisionTargets); |
|
|
|
string? newState = state.Update(obj, modelTime, collisionTargets); |
|
|
|
if (newState != null) { |
|
|
|
Transition(newState); |
|
|
|
} |
|
|
@ -32,7 +32,7 @@ namespace SemiColinGames { |
|
|
|
Debug.WriteLine("{0} -> {1} @ {2}", StateName, state, timeInState); |
|
|
|
timeInState = 0f; |
|
|
|
StateName = state; |
|
|
|
IState newState = states[state]; |
|
|
|
IState<T> newState = states[state]; |
|
|
|
this.state = newState; |
|
|
|
this.state.Enter(); |
|
|
|
} |
|
|
|