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.

160 lines
4.5 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. package wow.doge.mygame.launcher
  2. import cats.effect.Resource
  3. import cats.effect.concurrent.Deferred
  4. import cats.kernel.Eq
  5. import javafx.application.Platform
  6. import javafx.beans.value.ObservableValue
  7. import monix.bio.Task
  8. import monix.catnap.CancelableF
  9. import monix.execution.CancelablePromise
  10. import monix.reactive.Observable
  11. import monix.{eval => me}
  12. import scalafx.Includes._
  13. import scalafx.application.JFXApp
  14. import scalafx.application.JFXApp.PrimaryStage
  15. import scalafx.beans.property.StringProperty
  16. import scalafx.scene.control.Button
  17. import scalafx.stage.StageStyle
  18. import wow.doge.mygame.executors.Schedulers
  19. import wow.doge.mygame.implicits.JavaFXMonixObservables._
  20. import wow.doge.mygame.utils.IOUtils._
  21. object Launcher {
  22. sealed trait LauncherResult
  23. object LauncherResult {
  24. case object LaunchGame extends LauncherResult
  25. case object Exit extends LauncherResult
  26. implicit val eqForLR = Eq.fromUniversalEquals[LauncherResult]
  27. }
  28. class Props(
  29. val schedulers: Schedulers,
  30. val signal: Deferred[Task, LauncherResult]
  31. ) {
  32. val create = Task(new Launcher(this))
  33. }
  34. }
  35. class Launcher private (props: Launcher.Props) {
  36. import Launcher._
  37. private lazy val launchButton = new Button {
  38. text = "Launch"
  39. }
  40. private lazy val launchAction =
  41. launchButton
  42. .observableAction()
  43. .doOnNext(_ => toTask(props.signal.complete(LauncherResult.LaunchGame)))
  44. def testChangeObs(
  45. obs: Observable[(ObservableValue[_ <: String], String, String)]
  46. ) =
  47. obs
  48. .doOnNext {
  49. case (x, y, z) => monix.eval.Task.unit
  50. }
  51. // .subscribe()
  52. private lazy val exitButton = new Button {
  53. text = "Exit"
  54. // text <-- testChangeObs
  55. }
  56. // exitButton.text.bind
  57. StringProperty("") addListener ((_, _, _) => ())
  58. private lazy val exitAction =
  59. exitButton
  60. .observableAction()
  61. .doOnNext(_ => toTask(props.signal.complete(LauncherResult.Exit)))
  62. private lazy val _scene =
  63. DefaultUI.scene(launchButton, exitButton)
  64. private lazy val _stage = new PrimaryStage {
  65. scene = _scene
  66. }
  67. private def internal(startSignal: CancelablePromise[Unit]) =
  68. new JFXApp {
  69. stage = _stage
  70. stage.initStyle(StageStyle.Undecorated)
  71. // ResizeHelper.addResizeListener(stage)
  72. startSignal.success(())
  73. }
  74. private lazy val sceneDragObservable = {
  75. val mpo = _scene.observableMousePressed()
  76. val mdo = _scene.observableMouseDragged()
  77. mpo.concatMap(pressEvent =>
  78. mdo.doOnNext(dragEvent =>
  79. me.Task(pprint.log("emitted")) >>
  80. me.Task(
  81. _stage.setX(dragEvent.screenX - pressEvent.sceneX)
  82. ) >>
  83. me.Task(
  84. _stage.setY(
  85. dragEvent.screenY - pressEvent.sceneY
  86. )
  87. )
  88. )
  89. )
  90. }
  91. // import cats.syntax.all._
  92. // def init(delay: FiniteDuration = 2000.millis) =
  93. // for {
  94. // _ <- Task(Platform.setImplicitExit(false))
  95. // x <- (Task.unit.start, Task.unit.start).parTupled
  96. // fxAppStartFib <- Task(internal.main(Array.empty)).start
  97. // _ <- Task.sleep(500.millis)
  98. // sceneDragFib <- toIO(sceneDragObservable.completedL).start
  99. // buttonActionsComposedFib <- toIO(
  100. // Observable(launchAction, exitAction).merge
  101. // .doOnNext(_ =>
  102. // me.Task(internal.stage.close()).executeOn(props.schedulers.fx)
  103. // )
  104. // .completedL
  105. // ).start
  106. // c <- CancelableF[Task](
  107. // fxAppStartFib.cancel >> buttonActionsComposedFib.cancel >> sceneDragFib.cancel
  108. // )
  109. // } yield (c)
  110. def init =
  111. Resource.make(for {
  112. _ <- Task(Platform.setImplicitExit(false))
  113. startSignal <- Task(CancelablePromise[Unit]())
  114. delegate <- Task(internal(startSignal))
  115. combinedFib <-
  116. Task
  117. .parZip2(
  118. Task(delegate.main(Array.empty)),
  119. Task.fromCancelablePromise(startSignal) >> toIO(
  120. me.Task.parSequence(
  121. List(
  122. sceneDragObservable.completedL,
  123. Observable(launchAction, exitAction).merge
  124. .doOnNext(_ =>
  125. me.Task(delegate.stage.close())
  126. .executeOn(props.schedulers.fx)
  127. )
  128. .completedL
  129. )
  130. )
  131. )
  132. )
  133. .start
  134. c <- CancelableF[Task](
  135. // Task(println("Cancelling")) >>
  136. // combinedFib.cancel >>
  137. // fxAppStartFib.cancel
  138. // Task.unit
  139. combinedFib.cancel
  140. )
  141. } yield c)(_.cancel)
  142. }