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.4 KiB

4 years ago
  1. package wow.doge.mygame
  2. import akka.actor.typed.scaladsl.Behaviors
  3. import wow.doge.mygame.game.GameApp
  4. import akka.actor.typed.Behavior
  5. import wow.doge.mygame.game.GameAppActor
  6. import cats.effect.Resource
  7. import akka.actor.typed.ActorSystem
  8. import monix.bio.Task
  9. import wow.doge.mygame.game.GameModule
  10. import io.odin._
  11. import io.odin.syntax._
  12. import wow.doge.mygame.executors.ExecutorsModule
  13. import akka.actor.typed.scaladsl.ActorContext
  14. import wow.doge.mygame.executors.Schedulers
  15. import com.softwaremill.macwire._
  16. trait MainModule extends GameModule with ExecutorsModule {
  17. def actorSystemResource(
  18. logger: Logger[Task],
  19. app: GameApp,
  20. schedulers: Schedulers
  21. ): Resource[Task, ActorSystem[RootActor.Command]] =
  22. Resource.make(logger.info("Creating Actor System") >> Task {
  23. ActorSystem(RootActor(app, schedulers), name = "GameActorSystem")
  24. })(sys =>
  25. logger.info("Shutting down actor system") >> Task(
  26. sys.terminate()
  27. )
  28. )
  29. }
  30. object MainModule {
  31. // import cats.implicits._
  32. import scala.concurrent.duration._
  33. val DefaultFileLogger: Resource[Task, Logger[Task]] =
  34. fileLogger[Task](
  35. "log.log"
  36. ).withAsync(timeWindow = 1.seconds)
  37. }
  38. object RootActor {
  39. sealed trait Command
  40. final case object Start extends Command
  41. final case object Stop extends Command
  42. final case class State(initialized: Boolean = false)
  43. def apply(
  44. app: GameApp,
  45. schedulers: Schedulers,
  46. state: State = State()
  47. ): Behavior[Command] =
  48. Behaviors.setup { ctx =>
  49. ctx.log.info("Hello from root actor")
  50. wire[RootActor].receive(state)
  51. }
  52. }
  53. class RootActor(
  54. ctx: ActorContext[RootActor.Command],
  55. app: GameApp,
  56. schedulers: Schedulers
  57. ) {
  58. import RootActor._
  59. def receive(state: State): Behavior[Command] =
  60. Behaviors.receiveMessage(msg =>
  61. msg match {
  62. case Start =>
  63. if (!state.initialized) {
  64. ctx.log.info("Starting GameAppActor")
  65. val _ = ctx.spawn(
  66. wireWith(GameAppActor.apply _),
  67. "gameAppActor"
  68. // DispatcherSelector.fromConfig("jme-dispatcher")
  69. )
  70. receive(state.copy(initialized = true))
  71. } else {
  72. ctx.log.warn("Already Initialized")
  73. Behaviors.same
  74. }
  75. case Stop =>
  76. ctx.log.info("Stopping")
  77. Behaviors.stopped
  78. }
  79. )
  80. }