|
|
package wow.doge.mygame.game
import scala.collection.immutable.Queue
import com.jme3.app.SimpleApplication import com.jme3.app.state.AppState import monix.bio.Task import monix.execution.CancelableFuture import monix.execution.Scheduler import monix.execution.atomic.Atomic import monix.execution.{CancelablePromise => Promise} import monix.reactive.MulticastStrategy import monix.reactive.Observable import monix.reactive.subjects.ConcurrentSubject import wow.doge.mygame.executors.GUIExecutorService import wow.doge.mygame.executors.Schedulers
class GameApp( // actorSystem: ActorSystem[SpawnProtocol.Command],
schedulers: Schedulers, appStates: AppState* ) extends SimpleApplication(appStates: _*) { import GameApp._ // implicit val timeout = Timeout(10.seconds)
// implicit val scheduler = actorSystem.scheduler
// private lazy val taskQueueS = new ConcurrentLinkedQueue[MyTask[_]]()
private lazy val taskQueue2 = Atomic(Queue.empty[MyTask[_]])
private val tickSubject = ConcurrentSubject[Float](multicast = MulticastStrategy.publish)( schedulers.async ) // (scheduler)
override def simpleInitApp(): Unit = {
println("gameapp" + Thread.currentThread().getName())
// val ship = ed.createEntity()
// val mbState = stateManager().state[EntityDataState]().map(_.getEntityData())
// val mbState = Try(
// stateManager()
// .state[TestAppState]()
// .entity
// ).toOption.flatten.toRight(println("empty"))
// // .flatMap(_.entity)
// val x = mbState.flatMap(
// _.query
// .filter[TestComponent]("name", new Object())
// // .filterOr[TestEntity](
// // Filters
// // .fieldEquals(classOf[TestEntity], "", null)
// // )
// .component[Tag]()
// .component[TestComponent]()
// .result
// .toRight(println("failed"))
// )
// rootNode
// .child(geom)
// .child(geom)
// .child(geom)
// .child(geom)
// .child(geom)
// .child(geom)
// .child(geom)
// .child(geom)
// Future(println("hello"))(jmeEC(this))
// val wbActor: Future[ActorRef[Greeter.Greet]] = actorSystem.ask(
// SpawnProtocol.Spawn(
// behavior = Greeter(),
// name = "listener",
// DispatcherSelector.fromConfig("jme-dispatcher"),
// _
// )
// )
// wbActor.map(a => a.ask(Greeter.Greet("hello", _)).map(println))
}
def tickObservable: Observable[Float] = tickSubject
override def simpleUpdate(tpf: Float): Unit = { // val rot2 = rot.fromAngleAxis(FastMath.PI, new Vector3f(0, 0, 1))
// val rotation = geom.getLocalRotation()
// rotation.add(rot2)
// geom.rotate(rot2)
// geom.updateModelBound()
// geom.updateGeometricState()
tickSubject.onNext(tpf) }
override def stop(): Unit = { tickSubject.onComplete() super.stop() }
def enqueueScala[T](cb: () => T): CancelableFuture[T] = { val p = Promise[T]() // p.success(cb())
// taskQueueS.add(MyTask(p, cb))
taskQueue2.transform(_ :+ MyTask(p, cb)) p.future } // taskQueue2.transform(_ :+ MyTask(p, cb))
// p
def enqueueL[T](cb: () => T): Task[T] = // Task(Promise[T]()).flatMap { p =>
// Task(taskQueue2.transform(_ :+ MyTask(p, cb))) >>
// Task.fromCancelablePromise(p)
// }
// Task.fromCancelablePromise {
// val p = Promise[T]()
// taskQueue2.transform(_ :+ MyTask(p, cb))
// p
// }
Task.deferFuture(enqueueScala(cb))
// taskQueueS.add(MyTask(p, cb))
override protected def runQueuedTasks(): Unit = { // Option(taskQueueS.poll()).foreach {
// case MyTask(p, cb) =>
// p.success(cb())
// }
taskQueue2.transform { current => current.dequeueOption.fold(current) { case (MyTask(p, cb), updated) => p.success(cb()) updated } }
super.runQueuedTasks() }
object JMEExecutorService extends GUIExecutorService { override def execute(command: Runnable) = enqueue(command) // new SingleThreadEventExecutor()
// sys.addShutdownHook(JMEExecutorService.shutdown())
}
lazy val scheduler = Scheduler(JMEExecutorService) } object GameApp { private[game] case class MyTask[T](p: Promise[T], cb: () => T) }
|