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.

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