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.

70 lines
2.1 KiB

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 com.jme3.app.FlyCamAppState
  14. // import wow.doge.mygame.executors.JMERunner
  15. class GameAppResource(logger: Logger[Task], jmeScheduler: Scheduler) {
  16. def make: Resource[Task, (GameApp, Fiber[Throwable, Unit])] =
  17. Resource.make(
  18. for {
  19. _ <- logger.info("Creating game app")
  20. app <- Task(new GameApp(new StatsAppState()))
  21. _ <- Task {
  22. val settings = new AppSettings(true)
  23. settings.setVSync(true)
  24. settings.setUseInput(true)
  25. // new FlyCamAppState
  26. // settings.setFrameRate(250)
  27. app.setSettings(settings)
  28. // JMERunner.runner = app
  29. app
  30. }
  31. fib <- Task(app.start()).executeOn(jmeScheduler).start
  32. } yield (app -> fib)
  33. )(logger.info("Closing game app") >> _._2.cancel)
  34. }
  35. trait GameModule {
  36. def gameAppResource(
  37. logger: Logger[Task],
  38. jmeScheduler: Scheduler
  39. ): Resource[Task, (GameApp, Fiber[Throwable, Unit])] =
  40. Resource.make(
  41. (for {
  42. _ <- logger.info("Creating game app")
  43. app <- Task(new GameApp())
  44. _ <- Task {
  45. val settings = new AppSettings(true)
  46. settings.setVSync(true)
  47. // settings.setFrameRate(250)
  48. app.setSettings(settings)
  49. // JMERunner.runner = app
  50. app
  51. }
  52. fib <- Task(app.start()).executeOn(jmeScheduler).start
  53. } yield (app -> fib))
  54. )(_._2.cancel)
  55. def inputHandlerSystemResource(
  56. props: GameInputHandler.Props
  57. ): Resource[Task, Task[Unit]] =
  58. Resource.liftF {
  59. Task.evalAsync(props.begin)
  60. }
  61. def gameSystemsResource(
  62. spawnProtocol: ActorRef[SpawnProtocol.Command],
  63. gameSystems: Task[Unit]*
  64. ): Resource[Task, List[Unit]] =
  65. Resource.liftF(IO.defer(Task.parSequence(gameSystems)))
  66. }