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.

126 lines
4.1 KiB

  1. package wow.doge.mygame.utils.wrappers.jme
  2. import com.jme3.input.controls.InputListener
  3. import com.jme3.input.controls.Trigger
  4. import com.jme3.{input => jmei}
  5. import enumeratum._
  6. import monix.bio.UIO
  7. import monix.reactive.Observable
  8. import wow.doge.mygame.ActionEvent
  9. import wow.doge.mygame.AnalogEvent
  10. import wow.doge.mygame.EnumActionEvent
  11. import wow.doge.mygame.EnumAnalogEvent
  12. import wow.doge.mygame.implicits._
  13. final class InputManager(val delegate: jmei.InputManager) {
  14. /**
  15. * Create a new mapping to the given triggers.
  16. *
  17. * <p>
  18. * The given mapping will be assigned to the given triggers, when
  19. * any of the triggers given raise an event, the listeners
  20. * registered to the mappings will receive appropriate events.
  21. *
  22. * @param mappingName The mapping name to assign.
  23. * @param triggers The triggers to which the mapping is to be registered.
  24. */
  25. def withMapping(mapping: String, triggers: Trigger*): UIO[Unit] =
  26. UIO(delegate.withMapping(mapping, triggers: _*)).void
  27. def withMapping[T <: EnumEntry](
  28. mapping: T,
  29. triggers: Trigger*
  30. ): UIO[Unit] = UIO(delegate.withMapping(mapping, triggers: _*)).void
  31. def withListener(listener: InputListener, mappings: String*) =
  32. UIO(delegate.withListener(listener, mappings: _*))
  33. /**
  34. * Creates new mappings from the values of the given Enum
  35. *
  36. * <p>
  37. * The given mapping will be assigned to the given triggers, when
  38. * any of the triggers given raise an event, the listeners
  39. * registered to the mappings will receive appropriate events.
  40. *
  41. * @param mappingName The mapping name to assign.
  42. * @param mappingFn Function from enum values to the sequence of trigers.
  43. *
  44. * @example
  45. *
  46. * {{{
  47. *
  48. * sealed trait PlayerAnalogMovementInput extends EnumEntry with UpperSnakecase
  49. * object PlayerAnalogMovementInput extends Enum[PlayerAnalogMovementInput] {
  50. * val values = findValues
  51. * case object TurnRight extends PlayerAnalogMovementInput
  52. * case object TurnLeft extends PlayerAnalogMovementInput
  53. * }
  54. *
  55. * {
  56. * inputManager.withEnumMappings(PlayerAnalogMovementInput) {
  57. * case PlayerAnalogMovementInput.TurnRight =>
  58. * Seq(new KeyTrigger(KeyInput.KEY_RIGHT))
  59. * case PlayerAnalogMovementInput.TurnLeft =>
  60. * Seq(new KeyTrigger(KeyInput.KEY_LEFT))
  61. * }
  62. * }
  63. * }}}
  64. */
  65. def withEnumMappings[T <: EnumEntry](
  66. mappingEnum: Enum[T]
  67. )(mappingFn: T => Seq[Trigger]) =
  68. UIO(delegate.withEnumMappings(mappingEnum)(mappingFn))
  69. /**
  70. * Create an observable which emits the given mappings as elements of an observable
  71. *
  72. * @param mappingNames
  73. * @return Observable of action events
  74. *
  75. * @see [[ActionEvent]]
  76. * @see [[enumObservableAction]]
  77. */
  78. def observableAction(mappingNames: String*): Observable[ActionEvent] =
  79. delegate.observableAction(mappingNames: _*)
  80. /**
  81. * <p>
  82. * Create an observable which emits the values of the given
  83. * enum as elements of an observable
  84. *
  85. * @param mappingNames
  86. * @return Observable of enum values
  87. *
  88. * @example {{{
  89. * inputManager
  90. * .enumObservableAction(PlayerMovementInput)
  91. * .doOnNext { action =>
  92. * action.binding match {
  93. * case PlayerMovementInput.WalkLeft => Task {/* your actions */}
  94. * }
  95. * }
  96. * }}}
  97. *
  98. * @see [[EnumActionEvent]]
  99. * @see [[enumAnalogObservable]]
  100. */
  101. def enumObservableAction[T <: EnumEntry](
  102. mappingEnum: Enum[T]
  103. ): Observable[EnumActionEvent[T]] =
  104. delegate.enumObservableAction(mappingEnum)
  105. def enumEntryObservableAction[T <: EnumEntry](
  106. mappingEnumEntry: T
  107. ) = delegate.enumEntryObservableAction(mappingEnumEntry)
  108. def analogObservable(mappingNames: String*): Observable[AnalogEvent] =
  109. delegate.analogObservable(mappingNames: _*)
  110. def enumAnalogObservable[T <: EnumEntry](
  111. mappingEnum: Enum[T]
  112. ): Observable[EnumAnalogEvent[T]] = delegate.enumAnalogObservable(mappingEnum)
  113. def cursorVisible_=(value: Boolean) = UIO(delegate.setCursorVisible(value))
  114. def cursorVisible = delegate.isCursorVisible
  115. }