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.

166 lines
4.2 KiB

4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
4 years ago
  1. package wow.doge.mygame.game
  2. import scala.concurrent.duration._
  3. import akka.actor.typed.SupervisorStrategy
  4. import akka.actor.typed.scaladsl.Behaviors
  5. import wow.doge.mygame.game.TickGenerator.Send
  6. import wow.doge.mygame.game.entities.GenericTimerActor
  7. import wow.doge.mygame.subsystems.events.EventBus
  8. import wow.doge.mygame.subsystems.events.EventsModule.GameEventBus
  9. import wow.doge.mygame.subsystems.events.TickEvent
  10. import wow.doge.mygame.subsystems.events.TickEvent.PhysicsTick
  11. object GameAppActor {
  12. sealed trait Command
  13. case object Start extends Command
  14. case object Pause extends Command
  15. case object Stop extends Command
  16. case class Props(
  17. // app: SimpleAppExt,
  18. // akkaScheduler: Scheduler,
  19. // schedulers: Schedulers,
  20. // spawnProtocol: ActorRef[SpawnProtocol.Command],
  21. // loggerL: Logger[Task]
  22. tickEventBus: GameEventBus[TickEvent]
  23. ) {
  24. def behavior =
  25. Behaviors.setup[Command] { ctx =>
  26. ctx.log.info("Hello from GameAppActor")
  27. val renderTickGenerator =
  28. ctx.spawn(
  29. Behaviors
  30. .supervise(renderTickGeneratorBehavior)
  31. .onFailure[Exception](SupervisorStrategy.restart),
  32. "tickGeneratorActor"
  33. )
  34. val tickGeneratorTimer = ctx.spawn(
  35. GenericTimerActor
  36. .Props(renderTickGenerator, TickGenerator.Send, 10.millis)
  37. .behavior,
  38. "tickGeneratorTimer"
  39. )
  40. Behaviors.receiveMessage {
  41. case Start =>
  42. tickGeneratorTimer ! GenericTimerActor.Start
  43. Behaviors.same
  44. case Pause =>
  45. tickGeneratorTimer ! GenericTimerActor.Stop
  46. Behaviors.same
  47. case Stop =>
  48. ctx.log.info("Received stop")
  49. tickGeneratorTimer ! GenericTimerActor.Stop
  50. Behaviors.stopped
  51. }
  52. }
  53. val renderTickGeneratorBehavior =
  54. Behaviors.receiveMessage[TickGenerator.Command] {
  55. case Send =>
  56. tickEventBus ! EventBus.Publish(
  57. TickEvent.RenderTick,
  58. "tickGeneratorActor"
  59. )
  60. Behaviors.same
  61. }
  62. }
  63. }
  64. object TickGenerator {
  65. sealed trait Command
  66. case object Send extends Command
  67. }
  68. object SubscribingActor {
  69. def apply() =
  70. Behaviors.receive[PhysicsTick.type] { (ctx, msg) =>
  71. ctx.log.debug(s"received event $msg")
  72. Behaviors.same
  73. }
  74. }
  75. object Methods {
  76. def old() = {
  77. // val movementActor =
  78. // ctx.spawn(
  79. // MovementActor(MovementActor.Props(app, geom)),
  80. // "movementActor"
  81. // // DispatcherSelector.fromConfig("jme-dispatcher")
  82. // )
  83. // val movementActorTimer = ctx.spawn(
  84. // MovementActorTimer(movementActor),
  85. // "movementActorTimer"
  86. // )
  87. }
  88. def old2() = {
  89. // ctx.log.info("here")
  90. // {
  91. // implicit val s = schedulers.async
  92. // Task
  93. // .parZip2(
  94. // loggerL.info("Test").executeOn(app.scheduler),
  95. // app
  96. // .enqueueL(() => loggerL.info("here 2").executeOn(app.scheduler))
  97. // .flatten
  98. // )
  99. // .runToFuture
  100. // }
  101. // app
  102. // .getRootNode()
  103. // .depthFirst(s =>
  104. // // s match {
  105. // // case node: Node =>
  106. // // println("node" + s.getName() + " children " + node.getChildren())
  107. // // case g: Geometry => println(s.getName())
  108. // // }
  109. // println(s.getName())
  110. // )
  111. // println("----------------")
  112. // {
  113. // app
  114. // .getRootNode()
  115. // .observableDepthFirst()
  116. // .map(s => s.getName())
  117. // // .takeWhileInclusive(_.getName() != "level")
  118. // .onErrorHandle(e => e.getMessage())
  119. // .foreach(println)(schedulers.async)
  120. // }
  121. // println("----------------")
  122. // {
  123. // app
  124. // .getRootNode()
  125. // .observableBreadthFirst()
  126. // .map(s => s.getName())
  127. // // .takeWhileInclusive(_.getName() != "level")
  128. // .onErrorHandle(e => e.getMessage())
  129. // .foreach(println)(schedulers.async)
  130. // }
  131. // app.start()
  132. // Behaviors.same
  133. }
  134. }
  135. // new PlayerMovementState(
  136. // // movementActor,
  137. // // movementActorTimer,
  138. // imMovementActor,
  139. // // geom,
  140. // // camNode,
  141. // playerNode
  142. // // ctx.self
  143. // )