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.

StatesWalker.py 8.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. import utils
  2. import bge
  3. import random
  4. from mathutils import Vector
  5. #====================================
  6. def mark_path(path, y):
  7. iter_ = 0
  8. for x in path:
  9. pm = bge.logic.getCurrentScene().addObject('path_marker', y.obj, 0)
  10. pm.worldPosition = path[iter_]
  11. iter_ += 1
  12. if iter_ == 1:
  13. pm.color = [0,1,0,.4]
  14. if iter_ == (len(path) ):
  15. pm.color = [1,0,0,.4]
  16. if iter_ == (len(path) +1):
  17. pm.color = [1,0,1,.4]
  18. y.path_display.append(pm)
  19. def clear_markers(self):
  20. for x in self.FSM.owner.path_display:
  21. try:
  22. x.endObject()
  23. except:
  24. pass
  25. def get_ground_ray(self):
  26. Axis = 2
  27. Distance = -10
  28. end = self.obj.worldPosition + (self.obj.worldOrientation.col[Axis]*Distance)
  29. start = self.obj.worldPosition.copy()
  30. ground_ray = self.obj.rayCast(end, start, 6,'', 1, 0)
  31. return ground_ray
  32. def set_height(self):
  33. ground_ray = get_ground_ray(self)
  34. target_height = 0.9
  35. hitpoint = ground_ray[1]
  36. try:
  37. dist = self.obj.getDistanceTo(hitpoint)
  38. if dist < target_height:
  39. self.obj.worldPosition.z += target_height - dist
  40. self.obj.linearVelocity.z = 0
  41. self.obj.linearVelocity.y *= .1
  42. except:
  43. pass
  44. def align_to_road(self):
  45. ground_ray = get_ground_ray(self)
  46. try:
  47. self.obj.alignAxisToVect(ground_ray[2], 2, .15)
  48. except:
  49. pass
  50. def find_new_parking(self):
  51. potentials = []
  52. for x in self.manager.idle_spots:
  53. if x.status == 'available':
  54. potentials.append(x)
  55. for x in potentials:
  56. min_dist = 45
  57. dist = self.obj.getDistanceTo(x.obj)
  58. if dist < min_dist:
  59. potentials.remove(x)
  60. if len(potentials) > 0:
  61. new_parking = random.choice(potentials)
  62. path2 = self.manager.navmesh2.queue_path(self.start_empty.obj.worldPosition, new_parking.obj.worldPosition, self)
  63. return new_parking, path2
  64. else:
  65. self.FSM.FSM.ToTransition('toEnterParallelPark')
  66. def get_lane_point(self):
  67. self.point = self.path[self.path_index]
  68. if self.point != self.last_lane_point:
  69. v = Vector([self.last_lane_point.x - self.point.x, self.last_lane_point.y - self.point.y, 0])
  70. tv = v.normalized()
  71. nv = Vector([-tv.y, tv.x, 0]) #rotate 90 degrees
  72. self.last_lane_point = self.lane_point
  73. self.lane_point = self.point + self.manager.lane_position * nv
  74. else:
  75. pass
  76. def update_point(self):
  77. if self.path_index >= (len(self.path) ):
  78. self.FSM.FSM.ToTransition('toEnterParallelPark')
  79. else:
  80. dist = self.obj.getDistanceTo(self.lane_point)
  81. self.point = self.path[self.path_index]
  82. if dist < 2.5:
  83. get_lane_point(self)
  84. if self.path_index > (len(self.path)):
  85. pass
  86. else:
  87. self.path_index += 1
  88. def align_to_point(self):
  89. v = self.obj.getVectTo(self.lane_point)[1]
  90. v.z = 0
  91. self.obj.alignAxisToVect(v, 0, .1)
  92. def delta_to_vect(self):
  93. v = self.obj.getVectTo(self.lane_point)[1]
  94. delta = self.last_lane_point - self.lane_point
  95. delta = delta.cross(v)
  96. delta_mult = -.1
  97. mult = 1.0
  98. deltamove = delta[2] * delta_mult
  99. #check if in front
  100. local = self.obj.worldOrientation.inverted() * (self.lane_point - self.obj.worldPosition)
  101. f = deltamove * 50
  102. if local < 0:
  103. f *= -1
  104. self.obj.applyForce([0, f, 0], True)
  105. def apply_gas(self):
  106. if self.obj.linearVelocity.x < self.speed_targ:
  107. self.obj.applyForce([self.speed_inc, 0, 0], True)
  108. def walk_anim(self):
  109. if self.obj.linearVelocity.x > .5:
  110. arm = self.obj.children['npc']
  111. arm.playAction('g_walk2', 1,62, layer=1, play_mode=0, speed=.5)
  112. #====================================
  113. State = type("State", (object,), {})
  114. #====================================
  115. class State(object):
  116. def __init__(self, FSM):
  117. self.FSM = FSM
  118. self.timer = 0
  119. self.startTime = 0
  120. def Enter(self):
  121. self.timer = 0
  122. self.startTime = 0
  123. def Execute(self):
  124. print('Executing')
  125. def Exit(self):
  126. print('Exiting')
  127. #====================================
  128. class Example(State):
  129. def __init__(self,FSM):
  130. super(Example, self).__init__(FSM)
  131. def Enter(self):
  132. self.FSM.stateLife = 1
  133. #self.FSM.owner.obj.worldPosition = self.FSM.owner.start_empty.obj.worldPosition
  134. #self.FSM.owner.resumePhysics()
  135. #self.FSM.owner.resumeDynamics()
  136. #print('physics resumed')
  137. super(Example, self).Enter()
  138. def Execute(self):
  139. self.FSM.stateLife += 1
  140. print('doing example')
  141. def Exit(self):
  142. pass
  143. class ExitParallelPark(State):
  144. def __init__(self,FSM):
  145. super(ExitParallelPark, self).__init__(FSM)
  146. def Enter(self):
  147. self.FSM.stateLife = 1
  148. self.FSM.owner.obj.restorePhysics()
  149. self.FSM.owner.obj.restoreDynamics()
  150. self.FSM.owner.obj.linearVelocity = [0,0,0]
  151. self.FSM.owner.path_index = 0
  152. self.FSM.owner.point = self.FSM.owner.path[self.FSM.owner.path_index]
  153. self.FSM.owner.target.status = 'targetted'
  154. self.FSM.owner.start_empty.status = 'available'
  155. print('physics resumed')
  156. super(ExitParallelPark, self).Enter()
  157. def Execute(self):
  158. self.FSM.stateLife += 1
  159. v = self.FSM.owner.obj.getVectTo(self.FSM.owner.path[0])
  160. self.FSM.owner.obj.alignAxisToVect(v[1], 0, .01)
  161. self.FSM.owner.obj.alignAxisToVect([0,0,1], 2, 1)
  162. if self.FSM.stateLife > 220:
  163. self.FSM.ToTransition('toNavigateToTarget')
  164. def Exit(self):
  165. pass
  166. #====================================
  167. class EnterParallelPark(State):
  168. def __init__(self,FSM):
  169. super(EnterParallelPark, self).__init__(FSM)
  170. def Enter(self):
  171. self.FSM.stateLife = 1
  172. self.FSM.owner.obj.worldPosition = self.FSM.owner.target.obj.worldPosition.copy()
  173. self.FSM.owner.obj.worldOrientation = self.FSM.owner.target.obj.worldOrientation.copy()
  174. self.FSM.owner.obj.applyMovement([0, 0, 0], True)
  175. self.FSM.owner.target.status = 'in_use'
  176. self.FSM.owner.obj.worldPosition.z += .9
  177. self.FSM.owner.active = False
  178. self.FSM.owner.start_empty = self.FSM.owner.target
  179. self.FSM.owner.last_point = self.FSM.owner.target.obj.worldPosition.copy()
  180. self.FSM.owner.lane_point = self.FSM.owner.target.obj.worldPosition.copy()
  181. self.FSM.owner.last_lane_point = self.FSM.owner.target.obj.worldPosition.copy()
  182. self.FSM.owner.point = self.FSM.owner.target.obj.worldPosition.copy()
  183. self.FSM.owner.path_index = 0
  184. self.FSM.owner.path = None
  185. super(EnterParallelPark, self).Enter()
  186. def Execute(self):
  187. self.FSM.stateLife += 1
  188. if self.FSM.stateLife == 2:
  189. self.FSM.owner.manager.walkers_active.remove(self.FSM.owner)
  190. self.FSM.owner.obj.suspendDynamics()
  191. self.FSM.owner.obj.suspendPhysics()
  192. def Exit(self):
  193. pass
  194. #====================================
  195. class NavigateToTarget(State):
  196. def __init__(self,FSM):
  197. super(NavigateToTarget, self).__init__(FSM)
  198. def Enter(self):
  199. self.FSM.stateLife = 1
  200. super(NavigateToTarget, self).Enter()
  201. def Execute(self):
  202. self.FSM.stateLife += 1
  203. update_point(self.FSM.owner)
  204. align_to_point(self.FSM.owner)
  205. align_to_road(self.FSM.owner)
  206. set_height(self.FSM.owner)
  207. delta_to_vect(self.FSM.owner)
  208. apply_gas(self.FSM.owner)
  209. walk_anim(self.FSM.owner)
  210. if self.FSM.stateLife > 30 * 180 * 3:
  211. self.FSM.ToTransition('toEnterParallelPark')
  212. def Exit(self):
  213. pass
  214. #====================================
  215. class Activate(State):
  216. def __init__(self,FSM):
  217. super(Activate, self).__init__(FSM)
  218. def Enter(self):
  219. self.FSM.stateLife = 1
  220. super(Activate, self).Enter()
  221. def find_target(self):
  222. pass
  223. def drive_to_point(self):
  224. pass
  225. def Execute(self):
  226. self.FSM.stateLife += 1
  227. def Exit(self):
  228. pass
  229. #====================================
  230. class RequestPath(State):
  231. def __init__(self,FSM):
  232. super(RequestPath, self).__init__(FSM)
  233. def Enter(self):
  234. self.FSM.stateLife = 1
  235. self.FSM.owner.target, self.FSM.owner.path = find_new_parking(self.FSM.owner)
  236. self.FSM.owner.path_index = 0
  237. super(RequestPath, self).Enter()
  238. def Execute(self):
  239. self.FSM.stateLife += 1
  240. def Exit(self):
  241. pass