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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import bge
  2. import StatesWalker
  3. import StatesCamera
  4. import StatesCar
  5. import StatesEa
  6. import StatesTrain
  7. #====================================
  8. class Transition(object):
  9. def __init__(self, toState):
  10. self.toState = toState
  11. def Execute(self):
  12. pass
  13. #===================================
  14. class FSM(object):
  15. def __init__ (self, character, owner):
  16. self.char = character
  17. self.states = {}
  18. self.transitions = {}
  19. self.curState = None
  20. self.prevState = None
  21. self.trans = None
  22. self.stateLife = 0
  23. self.owner = owner
  24. self.name = None
  25. def AddTransition(self, transName, transition):
  26. self.transitions[transName] = transition
  27. def AddState(self, stateName, state):
  28. self.states[stateName] = state
  29. self.states[stateName].name = state
  30. def SetState(self, stateName):
  31. self.prevState = self.curState
  32. self.curState = self.states[stateName]
  33. def ToTransition(self, toTrans):
  34. self.trans = self.transitions[toTrans]
  35. def Execute(self, owner):
  36. if (self.trans):
  37. self.owner = owner
  38. self.curState.Exit()
  39. self.trans.Execute()
  40. self.SetState(self.trans.toState)
  41. self.curState.Enter()
  42. self.trans = None
  43. self.curState.Execute()
  44. #====================================
  45. Char = type("Char",(object,),{})
  46. #===================================
  47. #===================================
  48. class GameFSM(Char):
  49. def __init__(self, owner):
  50. self.FSM = FSM(self, owner)
  51. self.owner = owner
  52. state_list = [
  53. 'Example']
  54. for s in state_list:
  55. self.FSM.AddState(s, getattr(StatesGame, s)(self.FSM))
  56. t = 'to' + s
  57. self.FSM.AddTransition(t, Transition(s))
  58. if self.FSM.curState == None:
  59. self.FSM.SetState('Example')
  60. def Execute(self):
  61. self.FSM.Execute(self.owner)
  62. #===================================
  63. #===================================
  64. class CameraFSM(Char):
  65. def __init__(self, owner):
  66. self.FSM = FSM(self, owner)
  67. self.owner = owner
  68. state_list = [
  69. 'Example']
  70. for s in state_list:
  71. self.FSM.AddState(s, getattr(StatesCamera, s)(self.FSM))
  72. t = 'to' + s
  73. self.FSM.AddTransition(t, Transition(s))
  74. if self.FSM.curState == None:
  75. self.FSM.SetState('Example')
  76. def Execute(self):
  77. self.FSM.Execute(self.owner)
  78. #===================================
  79. class CarFSM(Char):
  80. def __init__(self, owner):
  81. self.FSM = FSM(self, owner)
  82. self.owner = owner
  83. state_list = [
  84. 'Example',
  85. 'Activate',
  86. 'ExitParallelPark',
  87. 'EnterParallelPark',
  88. 'NavigateToTarget',
  89. 'RequestPath',
  90. 'EnterPerpPark',
  91. 'ExitPerpPark']
  92. for s in state_list:
  93. self.FSM.AddState(s, getattr(StatesCar, s)(self.FSM))
  94. t = 'to' + s
  95. self.FSM.AddTransition(t, Transition(s))
  96. if self.FSM.curState == None:
  97. self.FSM.SetState('Example')
  98. def Execute(self):
  99. self.FSM.Execute(self.owner)
  100. #===================================
  101. class WalkerFSM(Char):
  102. def __init__(self, owner):
  103. self.FSM = FSM(self, owner)
  104. self.owner = owner
  105. state_list = [
  106. 'Example',
  107. 'Activate',
  108. 'ExitParallelPark',
  109. 'EnterParallelPark',
  110. 'NavigateToTarget',
  111. 'RequestPath',
  112. 'HitBySkater',
  113. 'WalkingHitBySkater',
  114. 'Dance1',
  115. 'GoToSleep']
  116. for s in state_list:
  117. self.FSM.AddState(s, getattr(StatesWalker, s)(self.FSM))
  118. t = 'to' + s
  119. self.FSM.AddTransition(t, Transition(s))
  120. if self.FSM.curState == None:
  121. self.FSM.SetState('Example')
  122. def Execute(self):
  123. self.FSM.Execute(self.owner)
  124. #===================================
  125. class TrainFSM(Char):
  126. def __init__(self, owner):
  127. self.FSM = FSM(self, owner)
  128. self.owner = owner
  129. state_list = [
  130. 'Example']
  131. for s in state_list:
  132. self.FSM.AddState(s, getattr(StatesTrain, s)(self.FSM))
  133. t = 'to' + s
  134. self.FSM.AddTransition(t, Transition(s))
  135. if self.FSM.curState == None:
  136. self.FSM.SetState('Example')
  137. def Execute(self):
  138. self.FSM.Execute(self.owner)
  139. #===================================
  140. class EaFSM(Char):
  141. def __init__(self, owner):
  142. self.FSM = FSM(self, owner)
  143. self.owner = owner
  144. state_list = [
  145. 'Example',
  146. 'Land']
  147. for s in state_list:
  148. self.FSM.AddState(s, getattr(StatesEa, s)(self.FSM))
  149. t = 'to' + s
  150. self.FSM.AddTransition(t, Transition(s))
  151. if self.FSM.curState == None:
  152. self.FSM.SetState('Example')
  153. def Execute(self):
  154. self.FSM.Execute(self.owner)