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 4.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import bge
  2. import StatesWalker
  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. #===================================
  46. class GameFSM(Char):
  47. def __init__(self, owner):
  48. self.FSM = FSM(self, owner)
  49. self.owner = owner
  50. state_list = [
  51. 'Example']
  52. for s in state_list:
  53. self.FSM.AddState(s, getattr(StatesGame, s)(self.FSM))
  54. t = 'to' + s
  55. self.FSM.AddTransition(t, Transition(s))
  56. if self.FSM.curState == None:
  57. self.FSM.SetState('Example')
  58. def Execute(self):
  59. self.FSM.Execute(self.owner)
  60. #===================================
  61. #===================================
  62. class CameraFSM(Char):
  63. def __init__(self, owner):
  64. self.FSM = FSM(self, owner)
  65. self.owner = owner
  66. state_list = [
  67. 'Example']
  68. for s in state_list:
  69. self.FSM.AddState(s, getattr(StatesCamera, s)(self.FSM))
  70. t = 'to' + s
  71. self.FSM.AddTransition(t, Transition(s))
  72. if self.FSM.curState == None:
  73. self.FSM.SetState('Example')
  74. def Execute(self):
  75. self.FSM.Execute(self.owner)
  76. #===================================
  77. class CarFSM(Char):
  78. def __init__(self, owner):
  79. self.FSM = FSM(self, owner)
  80. self.owner = owner
  81. state_list = [
  82. 'Example',
  83. 'Activate',
  84. 'ExitParallelPark',
  85. 'EnterParallelPark',
  86. 'NavigateToTarget',
  87. 'RequestPath']
  88. for s in state_list:
  89. self.FSM.AddState(s, getattr(StatesCar, s)(self.FSM))
  90. t = 'to' + s
  91. self.FSM.AddTransition(t, Transition(s))
  92. if self.FSM.curState == None:
  93. self.FSM.SetState('Example')
  94. def Execute(self):
  95. self.FSM.Execute(self.owner)
  96. #===================================
  97. class WalkerFSM(Char):
  98. def __init__(self, owner):
  99. self.FSM = FSM(self, owner)
  100. self.owner = owner
  101. state_list = [
  102. 'Example',
  103. 'Activate',
  104. 'ExitParallelPark',
  105. 'EnterParallelPark',
  106. 'NavigateToTarget',
  107. 'RequestPath']
  108. for s in state_list:
  109. self.FSM.AddState(s, getattr(StatesWalker, s)(self.FSM))
  110. t = 'to' + s
  111. self.FSM.AddTransition(t, Transition(s))
  112. if self.FSM.curState == None:
  113. self.FSM.SetState('Example')
  114. def Execute(self):
  115. self.FSM.Execute(self.owner)