Testing out JmonkeyEngine to make a game in Scala with Akka Actors within a pure FP layer
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.

87 lines
2.6 KiB

  1. package wow.doge.mygame.game.subsystems.input
  2. import com.jme3.input.KeyInput
  3. import com.jme3.input.MouseInput
  4. import com.jme3.input.controls.KeyTrigger
  5. import com.jme3.input.controls.MouseAxisTrigger
  6. import monix.{eval => me}
  7. import wow.doge.mygame.implicits._
  8. import wow.doge.mygame.utils.wrappers.jme.InputManager
  9. class InputMappings(inputManager: InputManager) {
  10. def setup =
  11. for {
  12. _ <- setupMovementKeys
  13. _ <- setupAnalogMovementKeys
  14. _ <- setupCameraKeys
  15. _ <- cursorToggle
  16. } yield ()
  17. def setupMovementKeys =
  18. inputManager.withEnumMappings(PlayerMovementInput) {
  19. case PlayerMovementInput.WalkRight =>
  20. new KeyTrigger(KeyInput.KEY_D) :: Nil
  21. case PlayerMovementInput.WalkLeft =>
  22. new KeyTrigger(KeyInput.KEY_A) :: Nil
  23. case PlayerMovementInput.WalkForward =>
  24. new KeyTrigger(KeyInput.KEY_W) :: Nil
  25. case PlayerMovementInput.WalkBackward =>
  26. new KeyTrigger(KeyInput.KEY_S) :: Nil
  27. case PlayerMovementInput.Jump =>
  28. new KeyTrigger(KeyInput.KEY_SPACE) :: Nil
  29. }
  30. def setupAnalogMovementKeys =
  31. inputManager.withEnumMappings(PlayerAnalogMovementInput) {
  32. case PlayerAnalogMovementInput.TurnRight =>
  33. Seq(new KeyTrigger(KeyInput.KEY_D))
  34. case PlayerAnalogMovementInput.TurnLeft =>
  35. Seq(new KeyTrigger(KeyInput.KEY_A))
  36. }
  37. def setupCameraKeys =
  38. inputManager.withEnumMappings(PlayerCameraInput) {
  39. case PlayerCameraInput.CameraRotateLeft =>
  40. Seq(
  41. new KeyTrigger(KeyInput.KEY_LEFT),
  42. new MouseAxisTrigger(MouseInput.AXIS_X, false)
  43. )
  44. case PlayerCameraInput.CameraRotateRight =>
  45. Seq(
  46. new KeyTrigger(KeyInput.KEY_RIGHT),
  47. new MouseAxisTrigger(MouseInput.AXIS_X, true)
  48. )
  49. case PlayerCameraInput.CameraRotateUp =>
  50. Seq(
  51. new KeyTrigger(KeyInput.KEY_UP),
  52. new MouseAxisTrigger(MouseInput.AXIS_Y, false)
  53. )
  54. case PlayerCameraInput.CameraRotateDown =>
  55. Seq(
  56. new KeyTrigger(KeyInput.KEY_DOWN),
  57. new MouseAxisTrigger(MouseInput.AXIS_Y, true)
  58. )
  59. }
  60. def cursorToggle =
  61. inputManager.withMapping(
  62. MiscInput.ToggleCursor,
  63. new KeyTrigger(KeyInput.KEY_Z)
  64. ) >>
  65. inputManager
  66. .enumEntryObservableAction(MiscInput.ToggleCursor)
  67. .doOnNext(action =>
  68. action.binding match {
  69. case MiscInput.ToggleCursor =>
  70. if (action.value)(inputManager.cursorVisible =
  71. !inputManager.cursorVisible).toTask
  72. else me.Task.unit
  73. }
  74. )
  75. .completedL
  76. .toIO
  77. .hideErrors
  78. .startAndForget
  79. }