package wow.doge.mygame.game import scala.concurrent.duration._ import akka.actor.typed.SupervisorStrategy import akka.actor.typed.scaladsl.Behaviors import wow.doge.mygame.game.TickGenerator.Send import wow.doge.mygame.implicits._ import wow.doge.mygame.subsystems.events.EventBus import wow.doge.mygame.subsystems.events.EventsModule.GameEventBus import wow.doge.mygame.subsystems.events.TickEvent import wow.doge.mygame.subsystems.events.TickEvent.PhysicsTick import wow.doge.mygame.utils.GenericTimerActor object GameAppActor { sealed trait Command case object Start extends Command case object Pause extends Command case object Stop extends Command case class Props(tickEventBus: GameEventBus[TickEvent]) { def behavior = Behaviors.setup[Command] { ctx => ctx.log.infoP("Hello from GameAppActor") val renderTickGenerator = ctx.spawn( Behaviors .supervise(renderTickGeneratorBehavior) .onFailure[Exception](SupervisorStrategy.restart), "tickGeneratorActor" ) val tickGeneratorTimer = ctx.spawn( GenericTimerActor .Props(renderTickGenerator, TickGenerator.Send, 10.millis) .behavior, "tickGeneratorTimer" ) Behaviors.receiveMessage { case Start => tickGeneratorTimer ! GenericTimerActor.Start Behaviors.same case Pause => tickGeneratorTimer ! GenericTimerActor.Stop Behaviors.same case Stop => ctx.log.info("Received stop") tickGeneratorTimer ! GenericTimerActor.Stop Behaviors.stopped } } val renderTickGeneratorBehavior = Behaviors.receiveMessage[TickGenerator.Command] { case Send => tickEventBus ! EventBus.Publish( TickEvent.RenderTick, "tickGeneratorActor" ) Behaviors.same } } } object TickGenerator { sealed trait Command case object Send extends Command } object SubscribingActor { def apply() = Behaviors.receive[PhysicsTick.type] { (ctx, msg) => ctx.log.debugP(s"received event $msg") Behaviors.same } } object Methods { def old() = { // val movementActor = // ctx.spawn( // MovementActor(MovementActor.Props(app, geom)), // "movementActor" // // DispatcherSelector.fromConfig("jme-dispatcher") // ) // val movementActorTimer = ctx.spawn( // MovementActorTimer(movementActor), // "movementActorTimer" // ) } def old2() = { // ctx.log.info("here") // { // implicit val s = schedulers.async // Task // .parZip2( // loggerL.info("Test").executeOn(app.scheduler), // app // .enqueueL(() => loggerL.info("here 2").executeOn(app.scheduler)) // .flatten // ) // .runToFuture // } // app // .getRootNode() // .depthFirst(s => // // s match { // // case node: Node => // // println("node" + s.getName() + " children " + node.getChildren()) // // case g: Geometry => println(s.getName()) // // } // println(s.getName()) // ) // println("----------------") // { // app // .getRootNode() // .observableDepthFirst() // .map(s => s.getName()) // // .takeWhileInclusive(_.getName() != "level") // .onErrorHandle(e => e.getMessage()) // .foreach(println)(schedulers.async) // } // println("----------------") // { // app // .getRootNode() // .observableBreadthFirst() // .map(s => s.getName()) // // .takeWhileInclusive(_.getName() != "level") // .onErrorHandle(e => e.getMessage()) // .foreach(println)(schedulers.async) // } // app.start() // Behaviors.same } } // new PlayerMovementState( // // movementActor, // // movementActorTimer, // imMovementActor, // // geom, // // camNode, // playerNode // // ctx.self // )