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.

94 lines
2.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
  1. package wow.doge.mygame.game
  2. import akka.actor.typed.ActorRef
  3. import akka.actor.typed.SpawnProtocol
  4. import cats.effect.Resource
  5. import com.jme3.app.StatsAppState
  6. import com.jme3.system.AppSettings
  7. import io.odin.Logger
  8. import monix.bio.Fiber
  9. import monix.bio.IO
  10. import monix.bio.Task
  11. import monix.execution.Scheduler
  12. import wow.doge.mygame.executors.Schedulers
  13. import wow.doge.mygame.game.subsystems.input.GameInputHandler
  14. class GameAppResource(
  15. logger: Logger[Task],
  16. jmeScheduler: Scheduler,
  17. schedulers: Schedulers
  18. ) {
  19. def get: Resource[Task, (GameApp2, Fiber[Throwable, Unit])] =
  20. Resource.make(
  21. for {
  22. _ <- logger.info("Creating game app")
  23. app <- Task(new GameApp(schedulers, new StatsAppState()))
  24. app2 <- Task {
  25. val settings = new AppSettings(true)
  26. settings.setVSync(true)
  27. settings.setUseInput(true)
  28. // new FlyCamAppState
  29. // settings.setFrameRate(250)
  30. app.setSettings(settings)
  31. // JMERunner.runner = app
  32. // app
  33. new GameApp2(app)
  34. }
  35. fib <- app2.start.executeOn(jmeScheduler).start
  36. } yield (app2 -> fib)
  37. )(logger.info("Closing game app") >> _._2.cancel)
  38. def get2: Resource[Task, GameApp2] =
  39. Resource.make(
  40. for {
  41. _ <- logger.info("Creating game app")
  42. app <- Task(new GameApp(schedulers, new StatsAppState()))
  43. app2 <- Task {
  44. val settings = new AppSettings(true)
  45. settings.setVSync(true)
  46. settings.setUseInput(true)
  47. // new FlyCamAppState
  48. // settings.setFrameRate(250)
  49. app.setSettings(settings)
  50. // JMERunner.runner = app
  51. new GameApp2(app)
  52. }
  53. // fib <- app2.start.executeOn(jmeScheduler).start
  54. } yield (app2)
  55. )(_ => logger.info("Closing game app"))
  56. }
  57. trait GameModule {
  58. def gameAppResource(
  59. logger: Logger[Task],
  60. jmeScheduler: Scheduler,
  61. schedulers: Schedulers
  62. ): Resource[Task, (GameApp, Fiber[Throwable, Unit])] =
  63. Resource.make(
  64. (for {
  65. _ <- logger.info("Creating game app")
  66. app <- Task(new GameApp(schedulers))
  67. _ <- Task {
  68. val settings = new AppSettings(true)
  69. settings.setVSync(true)
  70. // settings.setFrameRate(250)
  71. app.setSettings(settings)
  72. // JMERunner.runner = app
  73. app
  74. }
  75. fib <- Task(app.start()).executeOn(jmeScheduler).start
  76. } yield (app -> fib))
  77. )(_._2.cancel)
  78. def inputHandlerSystemResource(
  79. props: GameInputHandler.Props
  80. ): Resource[Task, Task[Unit]] =
  81. Resource.liftF {
  82. Task.evalAsync(props.begin)
  83. }
  84. def gameSystemsResource(
  85. spawnProtocol: ActorRef[SpawnProtocol.Command],
  86. gameSystems: Task[Unit]*
  87. ): Resource[Task, List[Unit]] =
  88. Resource.liftF(IO.defer(Task.parSequence(gameSystems)))
  89. }