ControlManager.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. from ShowBaseGlobal import *
  2. #from DirectGui import *
  3. #from PythonUtil import *
  4. #from IntervalGlobal import *
  5. import Avatar
  6. if __debug__:
  7. import DevWalker
  8. import DirectNotifyGlobal
  9. import GhostWalker
  10. import GravityWalker
  11. import NonPhysicsWalker
  12. import PhysicsWalker
  13. import Task
  14. class ControlManager:
  15. notify = DirectNotifyGlobal.directNotify.newCategory("ControlManager")
  16. wantAvatarPhysicsIndicator = base.config.GetBool('want-avatar-physics-indicator', 0)
  17. wantAvatarPhysicsDebug = base.config.GetBool('want-avatar-physics-debug', 0)
  18. def __init__(self, avatar):
  19. self.avatar = avatar
  20. assert(self.debugPrint("ControlManager()"))
  21. self.enableJumpCounter = 1
  22. self.swimControls=NonPhysicsWalker.NonPhysicsWalker()
  23. self.ghostControls=GhostWalker.GhostWalker()
  24. if __debug__:
  25. self.devControls=DevWalker.DevWalker()
  26. self.walkControls=GravityWalker.GravityWalker(
  27. gravity = -32.1740 * 2.0) # * 2.0 is a hack;
  28. # This is the non physics walker if you ever wanted to turn off phys
  29. # self.walkControls=NonPhysicsWalker.NonPhysicsWalker()
  30. self.currentControls = self.walkControls
  31. self.isEnabled = 1
  32. #self.monitorTask = taskMgr.add(self.monitor, "ControlManager-%s"%(id(self)), priority=-1)
  33. inputState.watch("forward", "arrow_up", "arrow_up-up")
  34. inputState.watch("forward", "control-arrow_up", "control-arrow_up-up")
  35. inputState.watch("forward", "alt-arrow_up", "alt-arrow_up-up")
  36. inputState.watch("forward", "shift-arrow_up", "shift-arrow_up-up")
  37. inputState.watch("reverse", "arrow_down", "arrow_down-up")
  38. inputState.watch("reverse", "control-arrow_down", "control-arrow_down-up")
  39. inputState.watch("reverse", "alt-arrow_down", "alt-arrow_down-up")
  40. inputState.watch("reverse", "shift-arrow_down", "shift-arrow_down-up")
  41. inputState.watch("turnLeft", "arrow_left", "arrow_left-up")
  42. inputState.watch("turnLeft", "control-arrow_left", "control-arrow_left-up")
  43. inputState.watch("turnLeft", "alt-arrow_left", "alt-arrow_left-up")
  44. inputState.watch("turnLeft", "shift-arrow_left", "shift-arrow_left-up")
  45. inputState.watch("turnLeft", "mouse-look_left", "mouse-look_left-done")
  46. inputState.watch("turnRight", "arrow_right", "arrow_right-up")
  47. inputState.watch("turnRight", "control-arrow_right", "control-arrow_right-up")
  48. inputState.watch("turnRight", "alt-arrow_right", "alt-arrow_right-up")
  49. inputState.watch("turnRight", "shift-arrow_right", "shift-arrow_right-up")
  50. inputState.watch("turnRight", "mouse-look_right", "mouse-look_right-done")
  51. inputState.watch("jump", "control", "control-up")
  52. inputState.watch("jump", "alt-control", "alt-control-up")
  53. inputState.watch("jump", "shift-control", "shift-control-up")
  54. inputState.watch("slideLeft", "home", "home-up")
  55. inputState.watch("slideRight", "end", "end-up")
  56. inputState.watch("levitateUp", "page_up", "page_up-up")
  57. inputState.watch("levitateDown", "page_down", "page_down-up")
  58. inputState.watch("run", "shift", "shift-up")
  59. # FYI, ghost mode uses jump for slide.
  60. #inputState.watch("slide", "slide-is-disabled", "slide-is-disabled")
  61. inputState.watch("slide", "mouse3", "mouse3-up")
  62. #inputState.watch("slideLeft", "shift-arrow_left", "shift-arrow_left-up")
  63. #inputState.watch("slideLeft", "control-arrow_left", "control-arrow_left-up")
  64. #inputState.watch("slideLeft", "alt-arrow_left", "alt-arrow_left-up")
  65. #inputState.watch("slideLeft", "shift-arrow_left", "shift-arrow_left-up")
  66. #inputState.watch("slideLeft", "slide-is-disabled", "slide-is-disabled")
  67. #inputState.watch("slideRight", "shift-arrow_right", "shift-arrow_right-up")
  68. #inputState.watch("slideRight", "control-arrow_right", "control-arrow_right-up")
  69. #inputState.watch("slideRight", "alt-arrow_right", "alt-arrow_right-up")
  70. #inputState.watch("slideRight", "shift-arrow_right", "shift-arrow_right-up")
  71. #inputState.watch("slideRight", "slide-is-disabled", "slide-is-disabled")
  72. def add(self, controls, name="basic"):
  73. controls = self.controls.get(name)
  74. if controls is not None:
  75. print "Replacing controls:", name
  76. controls.delete()
  77. self.controls[name] = controls
  78. def use(self, name="basic"):
  79. controls = self.controls.get(name)
  80. if controls is not None:
  81. if controls is not self.currentControls:
  82. self.currentControls.disableAvatarControls()
  83. self.currentControls.setCollisionsActive(0)
  84. self.currentControls = controls
  85. self.currentControls.setCollisionsActive(1)
  86. else:
  87. print "Unkown controls:", name
  88. def setSpeeds_new(self, toonForwardSpeed, toonJumpForce,
  89. toonReverseSpeed, toonRotateSpeed):
  90. assert(self.debugPrint(
  91. "setSpeeds(toonForwardSpeed=%s, toonJumpForce=%s, toonReverseSpeed=%s, toonRotateSpeed=%s)"%(
  92. toonForwardSpeed, toonJumpForce,
  93. toonReverseSpeed, toonRotateSpeed)))
  94. for controls in self.controls.values():
  95. controls.setWalkSpeed(
  96. toonForwardSpeed,
  97. toonJumpForce,
  98. toonReverseSpeed,
  99. toonRotateSpeed)
  100. def useSwimControls(self):
  101. assert(self.debugPrint("useSwimControls()"))
  102. if self.currentControls is not self.swimControls:
  103. self.currentControls.disableAvatarControls()
  104. self.currentControls.setCollisionsActive(0)
  105. self.swimControls.setCollisionsActive(1)
  106. self.currentControls = self.swimControls
  107. if self.isEnabled:
  108. self.currentControls.enableAvatarControls()
  109. def useGhostControls(self):
  110. assert(self.debugPrint("useGhostControls()"))
  111. if self.currentControls is not self.ghostControls:
  112. self.currentControls.disableAvatarControls()
  113. self.currentControls.setCollisionsActive(0)
  114. self.ghostControls.setCollisionsActive(1)
  115. self.currentControls = self.ghostControls
  116. if self.isEnabled:
  117. self.currentControls.enableAvatarControls()
  118. def useWalkControls(self):
  119. assert(self.debugPrint("useWalkControls()"))
  120. if self.currentControls is not self.walkControls:
  121. self.currentControls.disableAvatarControls()
  122. self.currentControls.setCollisionsActive(0)
  123. self.walkControls.setCollisionsActive(1)
  124. self.currentControls = self.walkControls
  125. if self.isEnabled:
  126. self.currentControls.enableAvatarControls()
  127. if __debug__:
  128. def useDevControls(self):
  129. assert(self.debugPrint("useDevControls()"))
  130. if self.currentControls is not self.devControls:
  131. self.currentControls.disableAvatarControls()
  132. self.currentControls.setCollisionsActive(0)
  133. self.devControls.setCollisionsActive(1)
  134. self.currentControls = self.devControls
  135. if self.isEnabled:
  136. self.currentControls.enableAvatarControls()
  137. def delete(self):
  138. self.disable()
  139. #self.monitorTask.remove()
  140. def setSpeeds(self, toonForwardSpeed, toonJumpForce,
  141. toonReverseSpeed, toonRotateSpeed):
  142. assert(self.debugPrint(
  143. "setSpeeds(toonForwardSpeed=%s, toonJumpForce=%s, toonReverseSpeed=%s, toonRotateSpeed=%s)"%(
  144. toonForwardSpeed, toonJumpForce,
  145. toonReverseSpeed, toonRotateSpeed)))
  146. self.swimControls.setWalkSpeed(
  147. toonForwardSpeed,
  148. toonJumpForce,
  149. toonReverseSpeed,
  150. toonRotateSpeed)
  151. self.ghostControls.setWalkSpeed(
  152. toonForwardSpeed,
  153. toonJumpForce,
  154. toonReverseSpeed,
  155. toonRotateSpeed)
  156. self.walkControls.setWalkSpeed(
  157. toonForwardSpeed,
  158. toonJumpForce,
  159. toonReverseSpeed,
  160. toonRotateSpeed)
  161. if __debug__:
  162. self.devControls.setWalkSpeed(
  163. toonForwardSpeed,
  164. toonJumpForce,
  165. toonReverseSpeed,
  166. toonRotateSpeed)
  167. def getSpeeds(self):
  168. return self.currentControls.getSpeeds()
  169. def initializeCollisions(self, cTrav,
  170. wallBitmask, floorBitmask, ghostBitmask, avatarRadius, floorOffset, reach = 4.0):
  171. assert(self.debugPrint("initializeCollisions()"))
  172. self.walkControls.initializeCollisions(cTrav, self.avatar,
  173. wallBitmask, floorBitmask, avatarRadius, floorOffset, reach)
  174. self.walkControls.setAirborneHeightFunc(self.avatar.getAirborneHeight)
  175. self.walkControls.disableAvatarControls()
  176. self.walkControls.setCollisionsActive(0)
  177. self.swimControls.initializeCollisions(cTrav, self.avatar,
  178. wallBitmask, floorBitmask, avatarRadius, floorOffset, reach)
  179. self.swimControls.setAirborneHeightFunc(self.avatar.getAirborneHeight)
  180. self.swimControls.disableAvatarControls()
  181. self.swimControls.setCollisionsActive(0)
  182. self.ghostControls.initializeCollisions(cTrav, self.avatar,
  183. ghostBitmask, floorBitmask, avatarRadius, floorOffset, reach)
  184. self.ghostControls.setAirborneHeightFunc(self.avatar.getAirborneHeight)
  185. self.ghostControls.disableAvatarControls()
  186. self.ghostControls.setCollisionsActive(0)
  187. if __debug__:
  188. self.devControls.initializeCollisions(cTrav, self.avatar,
  189. wallBitmask, floorBitmask, avatarRadius, floorOffset, reach)
  190. self.devControls.setAirborneHeightFunc(self.avatar.getAirborneHeight)
  191. self.devControls.disableAvatarControls()
  192. self.devControls.setCollisionsActive(0)
  193. #self.walkControls.setCollisionsActive(1)
  194. #self.walkControls.enableAvatarControls()
  195. def deleteCollisions(self):
  196. assert(self.debugPrint("deleteCollisions()"))
  197. self.walkControls.deleteCollisions()
  198. self.swimControls.deleteCollisions()
  199. self.ghostControls.deleteCollisions()
  200. if __debug__:
  201. self.devControls.deleteCollisions()
  202. def collisionsOn(self):
  203. assert(self.debugPrint("collisionsOn()"))
  204. self.currentControls.setCollisionsActive(1)
  205. def collisionsOff(self):
  206. assert(self.debugPrint("collisionsOff()"))
  207. self.currentControls.setCollisionsActive(0)
  208. def placeOnFloor(self):
  209. self.currentControls.placeOnFloor()
  210. def enable(self):
  211. assert(self.debugPrint("enable()"))
  212. self.isEnabled = 1
  213. self.currentControls.enableAvatarControls()
  214. def disable(self):
  215. assert(self.debugPrint("disable()"))
  216. self.isEnabled = 0
  217. self.currentControls.disableAvatarControls()
  218. def enableAvatarJump(self):
  219. """
  220. Stop forcing the ctrl key to return 0's
  221. """
  222. self.enableJumpCounter+=1
  223. if self.enableJumpCounter:
  224. assert self.enableJumpCounter == 1
  225. self.enableJumpCounter = 1
  226. inputState.unforce("jump")
  227. def disableAvatarJump(self):
  228. """
  229. Force the ctrl key to return 0's
  230. """
  231. self.enableJumpCounter-=1
  232. if self.enableJumpCounter <= 0:
  233. inputState.force("jump", 0)
  234. def monitor(self, foo):
  235. #assert(self.debugPrint("monitor()"))
  236. if 1:
  237. airborneHeight=self.avatar.getAirborneHeight()
  238. onScreenDebug.add("airborneHeight", "% 10.4f"%(airborneHeight,))
  239. if 0:
  240. onScreenDebug.add("InputState forward", "%d"%(inputState.isSet("forward")))
  241. onScreenDebug.add("InputState reverse", "%d"%(inputState.isSet("reverse")))
  242. onScreenDebug.add("InputState turnLeft", "%d"%(inputState.isSet("turnLeft")))
  243. onScreenDebug.add("InputState turnRight", "%d"%(inputState.isSet("turnRight")))
  244. return Task.cont
  245. if __debug__:
  246. def debugPrint(self, message):
  247. """for debugging"""
  248. return self.notify.debug(
  249. str(id(self))+' '+message)