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.

91 lines
3.1 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
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.Scheduler
  5. import akka.actor.typed.SpawnProtocol
  6. import akka.util.Timeout
  7. import com.jme3.asset.plugins.ZipLocator
  8. import com.jme3.bullet.BulletAppState
  9. import com.softwaremill.macwire._
  10. import com.softwaremill.tagging._
  11. import io.odin.Logger
  12. import monix.bio.Task
  13. import monix.reactive.Consumer
  14. import wow.doge.mygame.events.EventBus
  15. import wow.doge.mygame.game.nodes.Player
  16. import wow.doge.mygame.game.nodes.PlayerController
  17. import wow.doge.mygame.game.subsystems.input.GameInputHandler
  18. import wow.doge.mygame.game.subsystems.level.DefaultGameLevel
  19. import wow.doge.mygame.implicits._
  20. import wow.doge.mygame.subsystems.events.EntityMovementEvent.PlayerMovementEvent
  21. import wow.doge.mygame.subsystems.movement.ImMovementActor
  22. import wow.doge.mygame.utils.IOUtils
  23. import wow.doge.mygame.math.ImVector3f
  24. import monix.bio.IO
  25. import wow.doge.mygame.subsystems.events.EntityMovementEvent
  26. import akka.actor.typed.ActorSystem
  27. import wow.doge.mygame.subsystems.events.PlayerCameraEvent
  28. class GameSystemsInitializer(
  29. spawnProtocol: ActorSystem[SpawnProtocol.Command],
  30. loggerL: Logger[Task],
  31. // eventBuses: EventsModule2
  32. playerMovementEventBus: ActorRef[
  33. EventBus.Command[EntityMovementEvent.PlayerMovementEvent]
  34. ],
  35. playerCameraEventBus: ActorRef[EventBus.Command[PlayerCameraEvent]]
  36. )(app: GameApp) {
  37. implicit val timeout: Timeout = Timeout(1.second)
  38. import GameSystemsInitializer._
  39. implicit val akkaScheduler: Scheduler = spawnProtocol.scheduler
  40. lazy val inputManager = app.inputManager
  41. lazy val assetManager = app.assetManager
  42. lazy val bulletAppState = new BulletAppState()
  43. // lazy val playerMovementEventBus = eventBuses.playerMovementEventBusTask
  44. val init =
  45. for {
  46. _ <- loggerL.info("Initializing Systems")
  47. // playerMovementEventBus <- playerMovementEventBusTask
  48. _ <- Task(app.stateManager.attach(bulletAppState))
  49. _ <- Task(
  50. app.assetManager.registerLocator(
  51. // "src/main/resources/assets/town.zip",
  52. (os.rel / "src" / "main" / "resources" / "assets" / "town.zip"),
  53. classOf[ZipLocator]
  54. )
  55. )
  56. _ <- app.enqueueL(() => DefaultGameLevel(app, bulletAppState))
  57. _ <- wireWith(createPlayerController _).startAndForget
  58. _ <- wire[GameInputHandler.Props].begin
  59. } yield ()
  60. def createPlayerController(
  61. // playerMovementEventBus: ActorRef[
  62. // EventBus.Command[PlayerMovementEvent]
  63. // ],
  64. // playerCameraEventBus: ActorRef[EventBus.Command[PlayerCameraEvent]]
  65. ): IO[PlayerController.Error, Unit] = {
  66. val playerPos = ImVector3f.ZERO
  67. val playerNode = None.taggedWith[Player]
  68. val modelPath = os.rel / "Models" / "Jaime" / "Jaime.j3o"
  69. wire[PlayerController.Props].create
  70. }
  71. }
  72. object GameSystemsInitializer {
  73. def playerMovementActorTickConsumer(
  74. playerMovementActor: ActorRef[ImMovementActor.Command]
  75. ) =
  76. Consumer
  77. .foreachTask[Float](tpf =>
  78. IOUtils.toTask(playerMovementActor !! ImMovementActor.Tick)
  79. )
  80. // .mapTask()
  81. }