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.

97 lines
2.9 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
  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 get2: 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 get: 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. /**
  47. * disables the launcher
  48. * We'll be making our own launcher anyway
  49. */
  50. app.setShowSettings(false)
  51. app.setSettings(settings)
  52. // JMERunner.runner = app
  53. new GameApp2(app)
  54. }
  55. // fib <- app2.start.executeOn(jmeScheduler).start
  56. } yield (app2)
  57. )(_ => logger.info("Closing game app"))
  58. }
  59. trait GameModule {
  60. def gameAppResource(
  61. logger: Logger[Task],
  62. jmeScheduler: Scheduler,
  63. schedulers: Schedulers
  64. ): Resource[Task, (GameApp, Fiber[Throwable, Unit])] =
  65. Resource.make(
  66. (for {
  67. _ <- logger.info("Creating game app")
  68. app <- Task(new GameApp(schedulers))
  69. _ <- Task {
  70. val settings = new AppSettings(true)
  71. settings.setVSync(true)
  72. // settings.setFrameRate(250)
  73. app.setSettings(settings)
  74. // JMERunner.runner = app
  75. app
  76. }
  77. fib <- Task(app.start()).executeOn(jmeScheduler).start
  78. } yield (app -> fib))
  79. )(_._2.cancel)
  80. def inputHandlerSystemResource(
  81. props: GameInputHandler.Props
  82. ): Resource[Task, Task[Unit]] =
  83. Resource.liftF {
  84. Task.evalAsync(props.begin)
  85. }
  86. def gameSystemsResource(
  87. spawnProtocol: ActorRef[SpawnProtocol.Command],
  88. gameSystems: Task[Unit]*
  89. ): Resource[Task, List[Unit]] =
  90. Resource.liftF(IO.defer(Task.parSequence(gameSystems)))
  91. }