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.

151 lines
4.5 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. package wow.doge.mygame.game.entities
  2. import akka.actor.typed.ActorRef
  3. import akka.actor.typed.DispatcherSelector
  4. import com.jme3.bullet.control.BetterCharacterControl
  5. import com.jme3.renderer.Camera
  6. import com.jme3.scene.CameraNode
  7. import com.jme3.scene.Geometry
  8. import com.jme3.scene.Node
  9. import com.jme3.scene.Spatial
  10. import com.jme3.scene.shape.Box
  11. import com.softwaremill.tagging._
  12. import io.odin.Logger
  13. import monix.bio.IO
  14. import monix.bio.Task
  15. import wow.doge.mygame.AppError
  16. import wow.doge.mygame.executors.Schedulers.AsyncScheduler
  17. import wow.doge.mygame.game.GameApp
  18. import wow.doge.mygame.implicits._
  19. import wow.doge.mygame.math.ImVector3f
  20. import wow.doge.mygame.subsystems.events.EventsModule.GameEventBus
  21. import wow.doge.mygame.subsystems.events.PlayerEvent
  22. import wow.doge.mygame.subsystems.events.TickEvent
  23. import wow.doge.mygame.subsystems.movement.ImMovementActor
  24. import wow.doge.mygame.types._
  25. import wow.doge.mygame.utils.wrappers.jme._
  26. object PlayerController {
  27. sealed trait Error
  28. case class CouldNotCreatePlayerModel(reason: AssetManager.Error) extends Error
  29. object Tags {
  30. sealed trait PlayerNode
  31. sealed trait PlayerCameraNode
  32. sealed trait PlayerCameraPivotNode
  33. }
  34. type PlayerNode = Node @@ Tags.PlayerNode
  35. type PlayerCameraNode = CameraNode @@ Tags.PlayerCameraNode
  36. type PlayerCameraPivotNode =
  37. Node @@ Tags.PlayerCameraPivotNode
  38. class Props(
  39. gameApp: GameApp,
  40. enqueueR: Function1[() => Unit, Unit],
  41. rootNode: RootNode,
  42. loggerL: Logger[Task],
  43. physicsSpace: PhysicsSpace,
  44. initialPlayerPos: ImVector3f,
  45. playerEventBus: GameEventBus[PlayerEvent],
  46. playerPhysicsControl: BetterCharacterControl,
  47. // appScheduler: monix.execution.Scheduler,
  48. scheduler: AsyncScheduler,
  49. playerNode: PlayerNode,
  50. cameraNode: PlayerCameraNode,
  51. cameraPivotNode: PlayerCameraPivotNode,
  52. tickEventBus: GameEventBus[TickEvent],
  53. camera: Camera
  54. ) {
  55. val playerActorBehavior = {
  56. val movementActorBeh = new ImMovementActor.Props(
  57. enqueueR,
  58. camera
  59. ).behavior(playerPhysicsControl)
  60. new PlayerActorSupervisor.Props(
  61. playerEventBus,
  62. tickEventBus,
  63. movementActorBeh,
  64. scheduler
  65. ).behavior
  66. }
  67. val playerActor =
  68. gameApp.spawnGameActor(
  69. playerActorBehavior,
  70. // Some("playerActorSupervisor"),
  71. props = DispatcherSelector.default()
  72. )
  73. val create: IO[AppError, ActorRef[PlayerActorSupervisor.Command]] =
  74. (for {
  75. // playerActor <-
  76. // // AkkaUtils.spawnActorL(playerActorBehavior, "playerActorSupervisor")
  77. // gameApp.spawnGameActor(
  78. // playerActorBehavior,
  79. // Some("playerActorSupervisor"),
  80. // props = DispatcherSelector.default()
  81. // )
  82. pa <- playerActor
  83. _ <- (for {
  84. _ <- rootNode += playerNode
  85. _ <- physicsSpace += playerNode
  86. _ <- physicsSpace += playerPhysicsControl
  87. _ = cameraPivotNode += cameraNode
  88. _ <- rootNode += cameraPivotNode
  89. } yield ()).mapError(AppError.AppNodeError)
  90. } yield pa)
  91. }
  92. object Defaults {
  93. def defaultMesh = {
  94. val b = Box(1, 1, 1)
  95. val geom = Geometry("playerGeom", b)
  96. geom
  97. }
  98. def defaultCamerNode(
  99. cam: Camera,
  100. // playerNode: Node,
  101. // cameraPivotNode: Node,
  102. playerPos: ImVector3f
  103. ) =
  104. new CameraNode("CameraNode", cam)
  105. // .withControlDir(ControlDirection.SpatialToCamera)
  106. .withLocalTranslation(ImVector3f(0, 1.5f, 10))
  107. .withLookAt(playerPos, ImVector3f.UnitY)
  108. def defaultPlayerNode(
  109. playerPos: ImVector3f,
  110. playerModel: Node,
  111. // camNode: CameraNode,
  112. playerPhysicsControl: BetterCharacterControl
  113. ) =
  114. Node("PlayerNode")
  115. .withChildren(playerModel)
  116. .withLocalTranslation(playerPos)
  117. .withControl(playerPhysicsControl)
  118. .taggedWith[Tags.PlayerNode]
  119. def defaultNpcNode(
  120. // assetManager: AssetManager,
  121. npcModel: Spatial,
  122. initialPos: ImVector3f,
  123. npcPhysicsControl: BetterCharacterControl,
  124. npcName: String
  125. ) =
  126. // Either
  127. // .catchNonFatal(
  128. Node(npcName)
  129. .withChildren(
  130. // defaultMesh.withMaterial(defaultTexture(assetManager))
  131. npcModel
  132. )
  133. .withLocalTranslation(initialPos)
  134. .withControl(npcPhysicsControl)
  135. // )
  136. def defaultPlayerPhysicsControl =
  137. new BetterCharacterControl(1.5f, 6f, 1f)
  138. .withJumpForce(ImVector3f(0, 5f, 0))
  139. }
  140. }