forked from nova/jmonkey-test
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.
107 lines
3.4 KiB
107 lines
3.4 KiB
package wow.doge.mygame.game
|
|
|
|
import scala.concurrent.duration._
|
|
|
|
import akka.actor.typed.ActorRef
|
|
import akka.actor.typed.Props
|
|
import akka.actor.typed.Scheduler
|
|
import akka.actor.typed.SpawnProtocol
|
|
import akka.util.Timeout
|
|
import com.jme3.asset.plugins.ZipLocator
|
|
import com.jme3.bullet.BulletAppState
|
|
import com.jme3.bullet.control.BetterCharacterControl
|
|
import com.softwaremill.macwire._
|
|
import com.softwaremill.tagging._
|
|
import io.odin.Logger
|
|
import monix.bio.Task
|
|
import monix.reactive.Consumer
|
|
import wow.doge.mygame.events.EventBus
|
|
import wow.doge.mygame.events.EventsModule
|
|
import wow.doge.mygame.game.nodes.Player
|
|
import wow.doge.mygame.game.nodes.PlayerController
|
|
import wow.doge.mygame.game.subsystems.input.GameInputHandler
|
|
import wow.doge.mygame.game.subsystems.level.DefaultGameLevel
|
|
import wow.doge.mygame.implicits._
|
|
import wow.doge.mygame.subsystems.events.MovementEvent.PlayerMovementEvent
|
|
import wow.doge.mygame.subsystems.movement.ImMovementActor
|
|
import wow.doge.mygame.utils.IOUtils
|
|
|
|
class GameSystemsInitializer()(
|
|
override val spawnProtocol: ActorRef[SpawnProtocol.Command],
|
|
override implicit val akkaScheduler: Scheduler,
|
|
app: GameApp,
|
|
loggerL: Logger[Task]
|
|
) extends EventsModule {
|
|
override implicit val timeout: Timeout = Timeout(1.second)
|
|
|
|
import GameSystemsInitializer._
|
|
|
|
def init =
|
|
for {
|
|
playerMovementEventBus <- playerMovementEventBusTask
|
|
inputManager = app.inputManager
|
|
bulletAppState = new BulletAppState()
|
|
_ <- Task(app.stateManager.attach(bulletAppState))
|
|
_ <- Task(
|
|
app.assetManager.registerLocator(
|
|
// "src/main/resources/assets/town.zip",
|
|
(os.rel / "src" / "main" / "resources" / "assets" / "town.zip"),
|
|
classOf[ZipLocator]
|
|
)
|
|
)
|
|
_ <- app.enqueueL(() => DefaultGameLevel(app, bulletAppState))
|
|
playerController <- app.enqueueL(() =>
|
|
PlayerController(
|
|
app,
|
|
modelPath = os.rel / "Models" / "Jaime" / "Jaime.j3o",
|
|
cam = app.camera
|
|
)(app.assetManager, bulletAppState)
|
|
.taggedWith[Player]
|
|
)
|
|
// _ <- loggerL.debug(playerNode.getName())
|
|
// _ <- Task(app.rootNode.attachChild(playerNode))
|
|
// playerMovementActor <- wireWith(spawnMovementActor _)
|
|
// _ <-
|
|
// IOUtils
|
|
// .toIO(
|
|
// app.tickObservable
|
|
// .doOnNext { tpf =>
|
|
// IOUtils.toTask(playerMovementActor !! ImMovementActor.Tick(tpf))
|
|
// }
|
|
// .completedL
|
|
// .startAndForget
|
|
// .onErrorRestart(3)
|
|
// )
|
|
_ <- wire[GameInputHandler.Props].begin
|
|
|
|
} yield ()
|
|
}
|
|
|
|
object GameSystemsInitializer {
|
|
def spawnMovementActor(
|
|
app: GameApp,
|
|
spawnProtocol: ActorRef[SpawnProtocol.Command],
|
|
playerNode: BetterCharacterControl @@ Player,
|
|
playerMovementEventBus: ActorRef[
|
|
EventBus.Command[PlayerMovementEvent]
|
|
],
|
|
loggerL: Logger[Task]
|
|
)(implicit timeout: Timeout, scheduler: Scheduler) =
|
|
spawnProtocol.askL[ActorRef[ImMovementActor.Command]](
|
|
SpawnProtocol.Spawn(
|
|
ImMovementActor.Props(app, playerNode, playerMovementEventBus).create,
|
|
"imMovementActor",
|
|
Props.empty,
|
|
_
|
|
)
|
|
)
|
|
|
|
def playerMovementActorTickConsumer(
|
|
playerMovementActor: ActorRef[ImMovementActor.Command]
|
|
) =
|
|
Consumer
|
|
.foreachTask[Float](tpf =>
|
|
IOUtils.toTask(playerMovementActor !! ImMovementActor.Tick(tpf))
|
|
)
|
|
// .mapTask()
|
|
}
|