Shuvit game master repo. http://shuvit.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

FSM.py 3.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import bge
  2. import StatesNpcPed
  3. import StatesCamera
  4. import StatesCar
  5. #====================================
  6. class Transition(object):
  7. def __init__(self, toState):
  8. self.toState = toState
  9. def Execute(self):
  10. pass
  11. #===================================
  12. class FSM(object):
  13. def __init__ (self, character, owner):
  14. self.char = character
  15. self.states = {}
  16. self.transitions = {}
  17. self.curState = None
  18. self.prevState = None
  19. self.trans = None
  20. self.stateLife = 0
  21. self.owner = owner
  22. self.name = None
  23. def AddTransition(self, transName, transition):
  24. self.transitions[transName] = transition
  25. def AddState(self, stateName, state):
  26. self.states[stateName] = state
  27. self.states[stateName].name = state
  28. def SetState(self, stateName):
  29. self.prevState = self.curState
  30. self.curState = self.states[stateName]
  31. def ToTransition(self, toTrans):
  32. self.trans = self.transitions[toTrans]
  33. def Execute(self, owner):
  34. if (self.trans):
  35. self.owner = owner
  36. self.curState.Exit()
  37. self.trans.Execute()
  38. self.SetState(self.trans.toState)
  39. self.curState.Enter()
  40. self.trans = None
  41. self.curState.Execute()
  42. #====================================
  43. Char = type("Char",(object,),{})
  44. #===================================
  45. class NpcPed(Char):
  46. def __init__(self, owner):
  47. self.FSM = FSM(self, owner)
  48. self.owner = owner
  49. state_list = [
  50. 'Example']
  51. for s in state_list:
  52. self.FSM.AddState(s, getattr(StatesNpcPed, s)(self.FSM))
  53. t = 'to' + s
  54. self.FSM.AddTransition(t, Transition(s))
  55. if self.FSM.curState == None:
  56. self.FSM.SetState('Example')
  57. def Execute(self):
  58. self.FSM.Execute(self.owner)
  59. #===================================
  60. class CameraFSM(Char):
  61. def __init__(self, owner):
  62. self.FSM = FSM(self, owner)
  63. self.owner = owner
  64. state_list = [
  65. 'Example']
  66. for s in state_list:
  67. self.FSM.AddState(s, getattr(StatesCamera, s)(self.FSM))
  68. t = 'to' + s
  69. self.FSM.AddTransition(t, Transition(s))
  70. if self.FSM.curState == None:
  71. self.FSM.SetState('Example')
  72. def Execute(self):
  73. self.FSM.Execute(self.owner)
  74. #===================================
  75. class CarFSM(Char):
  76. def __init__(self, owner):
  77. self.FSM = FSM(self, owner)
  78. self.owner = owner
  79. state_list = [
  80. 'Example',
  81. 'Activate',
  82. 'ExitParallelPark',
  83. 'EnterParallelPark',
  84. 'NavigateToTarget']
  85. for s in state_list:
  86. self.FSM.AddState(s, getattr(StatesCar, s)(self.FSM))
  87. t = 'to' + s
  88. self.FSM.AddTransition(t, Transition(s))
  89. if self.FSM.curState == None:
  90. self.FSM.SetState('Example')
  91. def Execute(self):
  92. self.FSM.Execute(self.owner)