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.

190 lines
4.8 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
  1. package wow.doge.mygame.game
  2. import akka.actor.typed.scaladsl.Behaviors
  3. import wow.doge.mygame.state.PlayerMovementState
  4. import com.jme3.scene.Geometry
  5. import wow.doge.mygame.events.EventBus
  6. import wow.doge.mygame.events.Events
  7. import wow.doge.mygame.state.ImMovementActor
  8. import com.jme3.scene.CameraNode
  9. import com.jme3.scene.Node
  10. import com.jme3.renderer.Camera
  11. import wow.doge.mygame.executors.Schedulers
  12. import wow.doge.mygame.game.nodes.PlayerNode
  13. import com.softwaremill.macwire._
  14. import wow.doge.mygame.implicits._
  15. object GameAppActor {
  16. import Methods._
  17. sealed trait Command
  18. case object XD extends Command
  19. case object Stop extends Command
  20. def apply(app: GameApp, schedulers: Schedulers) =
  21. Behaviors.setup[Command] { ctx =>
  22. ctx.log.info("Hello from GameAppActor")
  23. // lazy val b = new Box(1, 1, 1)
  24. // lazy val geom = new Geometry("Box", b)
  25. // lazy val playerNode = new Node("PlayerNode")
  26. // lazy val camNode = new CameraNode("CameraNode", app.getCamera())
  27. // lazy val players = createPlayer(geom, app.getCamera())
  28. // ctx.pipeToSelf(
  29. // app.enqueueF(() => ())(monix.execution.Scheduler.io("aege"))
  30. // ) {
  31. // case x =>
  32. // println("SENDEDEEEEEd")
  33. // XD
  34. // }
  35. // ctx.pipeToSelf(
  36. // createPlayer(
  37. // geom,
  38. // app.getCamera(),
  39. // schedulers.jme
  40. // )
  41. // ) {
  42. // case x =>
  43. // println(x)
  44. // XD
  45. // }
  46. val subscribingActor = ctx.spawn(SubscribingActor(), "subscriber-1")
  47. val tickEventBus =
  48. ctx.spawn(Behaviors.logMessages(EventBus[Events.Tick]()), "eventBus1")
  49. tickEventBus ! EventBus.Subscribe(subscribingActor)
  50. tickEventBus ! EventBus.Publish(Events.PhysicsTick, ctx.self)
  51. // {
  52. // app
  53. // .getInputManager()
  54. // .observableAction("Left")
  55. // .map { action =>
  56. // action.binding.name match {
  57. // case "Left" => Task(println("Pressed left"))
  58. // }
  59. // }
  60. // }
  61. // binding match {
  62. // case "Left" =>
  63. def playerNodeFactory =
  64. PlayerNode(
  65. modelPath = os.rel / "Models" / "Jaime" / "Jaime.j3o",
  66. cam = app.camera
  67. ) _
  68. // (assetManager = app.assetManager)
  69. {
  70. lazy val playerNode = playerNodeFactory(app.assetManager)
  71. lazy val actor = ctx.spawn(
  72. ImMovementActor(ImMovementActor.Props(app, playerNode)),
  73. "imMovementActor"
  74. )
  75. lazy val state = wire[PlayerMovementState]
  76. app.stateManager.attach(state)
  77. }
  78. Thread.sleep(2000)
  79. app
  80. .getRootNode()
  81. .depthFirst(s =>
  82. // s match {
  83. // case node: Node =>
  84. // println("node" + s.getName() + " children " + node.getChildren())
  85. // case g: Geometry => println(s.getName())
  86. // }
  87. println(s.getName())
  88. )
  89. println("----------------")
  90. {
  91. app
  92. .getRootNode()
  93. .observableDepthFirst()
  94. .map(s => s.getName())
  95. // .takeWhileInclusive(_.getName() != "level")
  96. .onErrorHandle(e => e.getMessage())
  97. .foreach(println)(schedulers.async)
  98. }
  99. println("----------------")
  100. {
  101. app
  102. .getRootNode()
  103. .observableBreadthFirst()
  104. .map(s => s.getName())
  105. // .takeWhileInclusive(_.getName() != "level")
  106. .onErrorHandle(e => e.getMessage())
  107. .foreach(println)(schedulers.async)
  108. }
  109. // app.start()
  110. // Behaviors.same
  111. Behaviors.receiveMessage { msg =>
  112. msg match {
  113. case XD =>
  114. ctx.log.info("RECEEEEEIVED")
  115. ctx.log.info(app.camera.toString())
  116. Behaviors.same
  117. case Stop =>
  118. ctx.log.info("Received stop")
  119. Behaviors.stopped
  120. }
  121. }
  122. }
  123. }
  124. object Methods {
  125. def createPlayer(
  126. geom: Geometry,
  127. cam: Camera
  128. ): Node = {
  129. val playerNode = new Node("PlayerNode")
  130. lazy val camNode = new CameraNode("CameraNode", cam)
  131. playerNode
  132. .child(camNode)
  133. .child(geom)
  134. playerNode
  135. }
  136. def old() = {
  137. // val movementActor =
  138. // ctx.spawn(
  139. // MovementActor(MovementActor.Props(app, geom)),
  140. // "movementActor"
  141. // // DispatcherSelector.fromConfig("jme-dispatcher")
  142. // )
  143. // val movementActorTimer = ctx.spawn(
  144. // MovementActorTimer(movementActor),
  145. // "movementActorTimer"
  146. // )
  147. }
  148. }
  149. object SubscribingActor {
  150. def apply() =
  151. Behaviors.receive[Events.PhysicsTick.type] { (ctx, msg) =>
  152. ctx.log.debug(s"received event $msg")
  153. Behaviors.same
  154. }
  155. }
  156. // new PlayerMovementState(
  157. // // movementActor,
  158. // // movementActorTimer,
  159. // imMovementActor,
  160. // // geom,
  161. // // camNode,
  162. // playerNode
  163. // // ctx.self
  164. // )