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.

71 lines
2.0 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. package wow.doge.mygame.game
  2. import cats.effect.concurrent.Ref
  3. import com.jme3.app.state.AppStateManager
  4. import com.jme3.asset.AssetManager
  5. import com.jme3.input.InputManager
  6. import monix.bio.IO
  7. import monix.bio.Task
  8. import com.jme3.scene.Node
  9. import monix.catnap.Semaphore
  10. import com.jme3.scene.Spatial
  11. import wow.doge.mygame.game.GameApp2.SynchedObject
  12. import wow.doge.mygame.game.subsystems.ui.JFxUI
  13. sealed trait Error
  14. case object FlyCamNotExists extends Error
  15. class GameApp2(val app: GameApp) {
  16. def stateManager: Task[AppStateManager] = Task(app.getStateManager())
  17. def inputManager: Task[InputManager] = Task(app.getInputManager())
  18. def assetManager: Task[AssetManager] = Task(app.getAssetManager())
  19. def guiNode = Ref[Task].of(app.getGuiNode())
  20. def flyCam =
  21. IO(app.getFlyByCamera()).onErrorHandleWith(_ =>
  22. IO.raiseError(FlyCamNotExists)
  23. )
  24. def camera = Task(app.getCamera())
  25. def viewPort = Task(app.getViewPort())
  26. def rootNode = Ref[Task].of(app.getRootNode())
  27. def rootNode2 = SynchedObject(app.getRootNode())
  28. def enqueue(cb: () => Unit) =
  29. app.enqueue(new Runnable {
  30. override def run() = cb()
  31. })
  32. def enqueueL[T](cb: () => T): Task[T] = app.enqueueL(cb)
  33. def start = Task(app.start())
  34. def stop = Task(app.stop())
  35. def scheduler = app.scheduler
  36. def jfxUI = JFxUI(app)
  37. }
  38. object GameApp2 {
  39. class WrappedNode(node: Node, lock: Semaphore[Task]) {
  40. def +=(spat: Spatial) = lock.withPermit(Task(node.attachChild(spat)))
  41. }
  42. /**
  43. * Synchronization wrapper for a mutable object
  44. *
  45. * @param obj the mutable object
  46. * @param lock lock for synchronization
  47. */
  48. class SynchedObject[A](obj: A, lock: Semaphore[Task]) {
  49. def modify(f: A => Unit): Task[Unit] =
  50. lock.withPermit(Task(f(obj)))
  51. def flatModify(f: A => Task[Unit]): Task[Unit] =
  52. lock.withPermit(f(obj))
  53. def get: Task[A] = lock.withPermit(Task(obj))
  54. }
  55. object SynchedObject {
  56. def apply[A](obj: A) =
  57. Semaphore[Task](1).flatMap(lock => Task(new SynchedObject(obj, lock)))
  58. }
  59. }