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.

107 lines
3.4 KiB

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.ActorRef
  4. import akka.actor.typed.Props
  5. import akka.actor.typed.Scheduler
  6. import akka.actor.typed.SpawnProtocol
  7. import akka.util.Timeout
  8. import com.jme3.asset.plugins.ZipLocator
  9. import com.jme3.bullet.BulletAppState
  10. import com.jme3.bullet.control.BetterCharacterControl
  11. import com.softwaremill.macwire._
  12. import com.softwaremill.tagging._
  13. import io.odin.Logger
  14. import monix.bio.Task
  15. import monix.reactive.Consumer
  16. import wow.doge.mygame.events.EventBus
  17. import wow.doge.mygame.events.EventsModule
  18. import wow.doge.mygame.game.nodes.Player
  19. import wow.doge.mygame.game.nodes.PlayerController
  20. import wow.doge.mygame.game.subsystems.input.GameInputHandler
  21. import wow.doge.mygame.game.subsystems.level.DefaultGameLevel
  22. import wow.doge.mygame.implicits._
  23. import wow.doge.mygame.subsystems.events.MovementEvent.PlayerMovementEvent
  24. import wow.doge.mygame.subsystems.movement.ImMovementActor
  25. import wow.doge.mygame.utils.IOUtils
  26. class GameSystemsInitializer()(
  27. override val spawnProtocol: ActorRef[SpawnProtocol.Command],
  28. override implicit val akkaScheduler: Scheduler,
  29. app: GameApp,
  30. loggerL: Logger[Task]
  31. ) extends EventsModule {
  32. override implicit val timeout: Timeout = Timeout(1.second)
  33. import GameSystemsInitializer._
  34. def init =
  35. for {
  36. playerMovementEventBus <- playerMovementEventBusTask
  37. inputManager = app.inputManager
  38. bulletAppState = new BulletAppState()
  39. _ <- Task(app.stateManager.attach(bulletAppState))
  40. _ <- Task(
  41. app.assetManager.registerLocator(
  42. // "src/main/resources/assets/town.zip",
  43. (os.rel / "src" / "main" / "resources" / "assets" / "town.zip"),
  44. classOf[ZipLocator]
  45. )
  46. )
  47. _ <- app.enqueueL(() => DefaultGameLevel(app, bulletAppState))
  48. playerController <- app.enqueueL(() =>
  49. PlayerController(
  50. app,
  51. modelPath = os.rel / "Models" / "Jaime" / "Jaime.j3o",
  52. cam = app.camera
  53. )(app.assetManager, bulletAppState)
  54. .taggedWith[Player]
  55. )
  56. // _ <- loggerL.debug(playerNode.getName())
  57. // _ <- Task(app.rootNode.attachChild(playerNode))
  58. // playerMovementActor <- wireWith(spawnMovementActor _)
  59. // _ <-
  60. // IOUtils
  61. // .toIO(
  62. // app.tickObservable
  63. // .doOnNext { tpf =>
  64. // IOUtils.toTask(playerMovementActor !! ImMovementActor.Tick(tpf))
  65. // }
  66. // .completedL
  67. // .startAndForget
  68. // .onErrorRestart(3)
  69. // )
  70. _ <- wire[GameInputHandler.Props].begin
  71. } yield ()
  72. }
  73. object GameSystemsInitializer {
  74. def spawnMovementActor(
  75. app: GameApp,
  76. spawnProtocol: ActorRef[SpawnProtocol.Command],
  77. playerNode: BetterCharacterControl @@ Player,
  78. playerMovementEventBus: ActorRef[
  79. EventBus.Command[PlayerMovementEvent]
  80. ],
  81. loggerL: Logger[Task]
  82. )(implicit timeout: Timeout, scheduler: Scheduler) =
  83. spawnProtocol.askL[ActorRef[ImMovementActor.Command]](
  84. SpawnProtocol.Spawn(
  85. ImMovementActor.Props(app, playerNode, playerMovementEventBus).create,
  86. "imMovementActor",
  87. Props.empty,
  88. _
  89. )
  90. )
  91. def playerMovementActorTickConsumer(
  92. playerMovementActor: ActorRef[ImMovementActor.Command]
  93. ) =
  94. Consumer
  95. .foreachTask[Float](tpf =>
  96. IOUtils.toTask(playerMovementActor !! ImMovementActor.Tick(tpf))
  97. )
  98. // .mapTask()
  99. }