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.

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