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.

103 lines
2.9 KiB

4 years ago
  1. package wow.doge.mygame.executors
  2. import akka.dispatch.{
  3. DispatcherPrerequisites,
  4. ExecutorServiceFactory,
  5. ExecutorServiceConfigurator
  6. }
  7. import com.typesafe.config.Config
  8. import java.util.concurrent.{
  9. ExecutorService,
  10. AbstractExecutorService,
  11. ThreadFactory,
  12. TimeUnit
  13. }
  14. import java.util.Collections
  15. import javax.swing.SwingUtilities
  16. import javafx.application.Platform
  17. import monix.execution.Scheduler
  18. import scala.concurrent.ExecutionContext
  19. import java.util.concurrent.Executor
  20. import wow.doge.mygame.Main
  21. // First we wrap invokeLater/runLater as an ExecutorService
  22. trait GUIExecutorService extends AbstractExecutorService {
  23. def execute(command: Runnable): Unit
  24. def shutdown(): Unit = ()
  25. def shutdownNow() = Collections.emptyList[Runnable]
  26. def isShutdown = false
  27. def isTerminated = false
  28. def awaitTermination(l: Long, timeUnit: TimeUnit) = true
  29. }
  30. object JavaFXExecutorService extends GUIExecutorService {
  31. override def execute(command: Runnable) = Platform.runLater(command)
  32. }
  33. object SwingExecutorService extends GUIExecutorService {
  34. override def execute(command: Runnable) = SwingUtilities.invokeLater(command)
  35. }
  36. object JMEExecutorService extends GUIExecutorService {
  37. override def execute(command: Runnable) = Main.gameApp.enqueue(command)
  38. }
  39. class JavaFXEventThreadExecutorServiceConfigurator(
  40. config: Config,
  41. prerequisites: DispatcherPrerequisites
  42. ) extends ExecutorServiceConfigurator(config, prerequisites) {
  43. private val f = new ExecutorServiceFactory {
  44. def createExecutorService: ExecutorService = JavaFXExecutorService
  45. }
  46. def createExecutorServiceFactory(
  47. id: String,
  48. threadFactory: ThreadFactory
  49. ): ExecutorServiceFactory = f
  50. }
  51. class JMEThreadExecutorServiceConfigurator(
  52. config: Config,
  53. prerequisites: DispatcherPrerequisites
  54. ) extends ExecutorServiceConfigurator(config, prerequisites) {
  55. private val f = new ExecutorServiceFactory {
  56. def createExecutorService: ExecutorService = JMEExecutorService
  57. }
  58. def createExecutorServiceFactory(
  59. id: String,
  60. threadFactory: ThreadFactory
  61. ): ExecutorServiceFactory = f
  62. }
  63. // Then we create an ExecutorServiceConfigurator so that Akka can use our SwingExecutorService for the dispatchers
  64. class SwingEventThreadExecutorServiceConfigurator(
  65. config: Config,
  66. prerequisites: DispatcherPrerequisites
  67. ) extends ExecutorServiceConfigurator(config, prerequisites) {
  68. private val f = new ExecutorServiceFactory {
  69. def createExecutorService: ExecutorService = SwingExecutorService
  70. }
  71. def createExecutorServiceFactory(
  72. id: String,
  73. threadFactory: ThreadFactory
  74. ): ExecutorServiceFactory = f
  75. }
  76. object JFXExecutionContexts {
  77. val javaFxExecutionContext: ExecutionContext =
  78. ExecutionContext.fromExecutor(new Executor {
  79. def execute(command: Runnable): Unit = {
  80. Platform.runLater(command)
  81. }
  82. })
  83. val fxScheduler =
  84. Scheduler(javaFxExecutionContext)
  85. }