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.

140 lines
4.5 KiB

4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
3 years ago
4 years ago
4 years ago
4 years ago
3 years ago
4 years ago
4 years ago
  1. package wow.doge.mygame.game.entities
  2. import akka.actor.typed.ActorRef
  3. import akka.actor.typed.Behavior
  4. import akka.actor.typed.LogOptions
  5. import akka.actor.typed.SupervisorStrategy
  6. import akka.actor.typed.scaladsl.ActorContext
  7. import akka.actor.typed.scaladsl.Behaviors
  8. import com.typesafe.scalalogging.Logger
  9. import org.slf4j.event.Level
  10. import wow.doge.mygame.game.subsystems.movement.CanMove
  11. import wow.doge.mygame.subsystems.events.EventBus
  12. import wow.doge.mygame.subsystems.events.EventsModule.GameEventBus
  13. import wow.doge.mygame.subsystems.events.PlayerEvent
  14. import wow.doge.mygame.subsystems.events.TickEvent
  15. import wow.doge.mygame.subsystems.events.TickEvent.RenderTick
  16. import wow.doge.mygame.subsystems.movement.ImMovementActor
  17. import wow.doge.mygame.implicits._
  18. object PlayerActorSupervisor {
  19. sealed trait Command
  20. final case class Props(
  21. playerEventBus: GameEventBus[PlayerEvent],
  22. tickEventBus: GameEventBus[TickEvent],
  23. imMovementActorBehavior: Behavior[ImMovementActor.Command],
  24. playerCameraActorBehavior: Behavior[PlayerCameraActor.Command]
  25. ) {
  26. def behavior =
  27. Behaviors.logMessages(
  28. LogOptions()
  29. .withLevel(Level.TRACE)
  30. .withLogger(
  31. Logger[PlayerActorSupervisor].underlying
  32. ),
  33. Behaviors.setup[Command] { ctx =>
  34. ctx.log.infoP("Starting PlayerActor")
  35. // spawn children actors
  36. val movementActor =
  37. ctx.spawn(
  38. Behaviors
  39. .supervise(imMovementActorBehavior)
  40. .onFailure[Exception](SupervisorStrategy.restart),
  41. "playerMovementActor"
  42. )
  43. val playerCameraActor =
  44. ctx.spawn(playerCameraActorBehavior, "playerCameraActor")
  45. val playerCameraEl = ctx.spawn(
  46. PlayerCameraEventListener(playerCameraActor),
  47. "playerCameraActorEl"
  48. )
  49. val playerMovementEl = ctx.spawn(
  50. Behaviors
  51. .supervise(PlayerMovementEventListener(movementActor))
  52. .onFailure[Exception](SupervisorStrategy.restart),
  53. "playerMovementEventHandler"
  54. )
  55. val renderTickEl = {
  56. val behavior =
  57. Behaviors.receiveMessage[RenderTick.type] {
  58. case RenderTick =>
  59. movementActor ! ImMovementActor.Tick
  60. // playerCameraActor ! PlayerCameraActor.Tick
  61. Behaviors.same
  62. }
  63. ctx.spawn(behavior, "playerMovementTickListener")
  64. }
  65. //init listeners
  66. playerEventBus ! EventBus.Subscribe(playerMovementEl)
  67. tickEventBus ! EventBus.Subscribe(renderTickEl)
  68. playerEventBus ! EventBus.Subscribe(playerCameraEl)
  69. new PlayerActorSupervisor(
  70. ctx,
  71. this,
  72. Children(movementActor)
  73. ).receive
  74. }
  75. )
  76. }
  77. case class Children(
  78. movementActor: ActorRef[ImMovementActor.Command]
  79. )
  80. }
  81. class PlayerActorSupervisor(
  82. ctx: ActorContext[PlayerActorSupervisor.Command],
  83. props: PlayerActorSupervisor.Props,
  84. children: PlayerActorSupervisor.Children
  85. ) {
  86. import PlayerActorSupervisor._
  87. def receive =
  88. Behaviors
  89. .receiveMessage[Command] {
  90. case _ =>
  91. // children.movementActor ! ImMovementActor.MovedDown(true)
  92. Behaviors.same
  93. }
  94. }
  95. object PlayerMovementActor {
  96. sealed trait Command
  97. final case class Props(
  98. movementActor: ActorRef[ImMovementActor.Command],
  99. playerCameraActor: ActorRef[PlayerCameraActor.Command],
  100. playerEventBus: GameEventBus[PlayerEvent],
  101. tickEventBus: GameEventBus[TickEvent]
  102. ) {
  103. def behavior: Behavior[Command] =
  104. Behaviors.setup { ctx =>
  105. val playerMovementEl = ctx.spawn(
  106. Behaviors
  107. .supervise(PlayerMovementEventListener(movementActor))
  108. .onFailure[Exception](SupervisorStrategy.restart),
  109. "playerMovementEventHandler"
  110. )
  111. val renderTickEl = {
  112. val behavior =
  113. Behaviors.receiveMessage[RenderTick.type] {
  114. case RenderTick =>
  115. movementActor ! ImMovementActor.Tick
  116. // playerCameraActor ! PlayerCameraActor.Tick
  117. Behaviors.same
  118. }
  119. ctx.spawn(behavior, "playerMovementTickListener")
  120. }
  121. playerEventBus ! EventBus.Subscribe(playerMovementEl)
  122. tickEventBus ! EventBus.Subscribe(renderTickEl)
  123. Behaviors.receiveMessage { msg => Behaviors.same }
  124. }
  125. }
  126. }