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.

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