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