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.

64 lines
2.0 KiB

4 years ago
  1. package wow.doge.mygame.subsystems.events
  2. import akka.actor.typed.ActorRef
  3. import akka.actor.typed.SpawnProtocol
  4. import wow.doge.mygame.implicits._
  5. import akka.actor.typed.Props
  6. import akka.actor.typed.LogOptions
  7. import com.typesafe.scalalogging.{Logger => SLLogger}
  8. import wow.doge.mygame.events.EventBus
  9. import akka.actor.typed.scaladsl.Behaviors
  10. import scala.concurrent.duration._
  11. import akka.util.Timeout
  12. import akka.actor.typed.SupervisorStrategy
  13. import cats.effect.Resource
  14. import akka.actor.typed.ActorSystem
  15. import monix.bio.Task
  16. import org.slf4j.event.Level
  17. import wow.doge.mygame.subsystems.events.EntityMovementEvent.PlayerMovementEvent
  18. class EventsModule2(
  19. spawnProtocol: ActorSystem[SpawnProtocol.Command]
  20. ) {
  21. private implicit lazy val s = spawnProtocol.scheduler
  22. private implicit lazy val timeout = Timeout(1.second)
  23. private lazy val eventBusLogger = SLLogger[EventBus[_]]
  24. private lazy val playerMovementEventBusTask =
  25. createEventBus[PlayerMovementEvent]("movementEventBus")
  26. private lazy val playerCameraEventBusTask =
  27. createEventBus[PlayerCameraEvent]("playerCameraEventBus", Level.DEBUG)
  28. def createEventBus[T](busName: String, logLevel: Level = Level.DEBUG) =
  29. spawnProtocol.askL(
  30. SpawnProtocol.Spawn[EventBus.Command[T]](
  31. Behaviors.logMessages(
  32. logOptions = LogOptions()
  33. .withLevel(logLevel)
  34. .withLogger(eventBusLogger.underlying),
  35. Behaviors
  36. .supervise(EventBus[T]())
  37. .onFailure[Exception](SupervisorStrategy.restart)
  38. ),
  39. busName,
  40. Props.empty,
  41. _
  42. )
  43. )
  44. type EventBuses = (
  45. ActorRef[
  46. EventBus.Command[EntityMovementEvent.PlayerMovementEvent],
  47. ],
  48. ActorRef[EventBus.Command[PlayerCameraEvent]]
  49. )
  50. val resource: Resource[Task, EventBuses] =
  51. Resource.liftF(for {
  52. playerMovementEventBus <- playerMovementEventBusTask
  53. playerCameraEventBus <- playerCameraEventBusTask
  54. } yield (playerMovementEventBus, playerCameraEventBus))
  55. }