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.

139 lines
4.4 KiB

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