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.
142 lines
4.5 KiB
142 lines
4.5 KiB
package wow.doge.mygame.game
|
|
|
|
import com.jme3.app.SimpleApplication
|
|
|
|
import com.jme3.app.state.AppState
|
|
import com.jme3.bullet.BulletAppState
|
|
import com.jme3.bullet.collision.shapes.CapsuleCollisionShape
|
|
import com.jme3.bullet.control.CharacterControl
|
|
import com.jme3.bullet.control.RigidBodyControl
|
|
import com.jme3.bullet.util.CollisionShapeFactory
|
|
import com.jme3.scene.Spatial
|
|
import com.jme3.syntax._
|
|
import com.jme3.asset.plugins.ZipLocator
|
|
import com.jme3.math.ColorRGBA
|
|
import wow.doge.mygame.implicits._
|
|
|
|
class GameApp(
|
|
// actorSystem: ActorSystem[SpawnProtocol.Command],
|
|
appStates: AppState*
|
|
) extends SimpleApplication(appStates: _*) {
|
|
// implicit val timeout = Timeout(10.seconds)
|
|
// implicit val scheduler = actorSystem.scheduler
|
|
private lazy val sceneModel: Spatial = assetManager.loadModel("main.scene")
|
|
private lazy val bulletAppState: BulletAppState = new BulletAppState()
|
|
// bulletAppState.setThreadingType(ThreadingType.SEQUENTIAL)
|
|
|
|
// We set up collision detection for the scene by creating a
|
|
// compound collision shape and a static RigidBodyControl with mass zero.
|
|
private lazy val sceneShape = CollisionShapeFactory.createMeshShape(
|
|
sceneModel.toNode match {
|
|
case util.Right(node) => node
|
|
case util.Left(ex) =>
|
|
throw new NotImplementedError("No fallback sceneshape")
|
|
}
|
|
)
|
|
private lazy val landscape: RigidBodyControl =
|
|
new RigidBodyControl(sceneShape, 0)
|
|
|
|
// We set up collision detection for the player by creating
|
|
// a capsule collision shape and a CharacterControl.
|
|
// The CharacterControl offers extra settings for
|
|
// size, stepheight, jumping, falling, and gravity.
|
|
// We also put the player in its starting position.
|
|
protected lazy val capsuleShape = new CapsuleCollisionShape(1.5f, 6f, 1)
|
|
|
|
private lazy val player: CharacterControl =
|
|
new CharacterControl(capsuleShape, 0.05f)
|
|
|
|
override def simpleInitApp(): Unit = {
|
|
discard { stateManager.attach(bulletAppState) }
|
|
assetManager.registerLocator(
|
|
// "src/main/resources/assets/town.zip",
|
|
(os.rel / "src" / "main" / "resources" / "assets" / "town.zip"),
|
|
classOf[ZipLocator]
|
|
)
|
|
viewPort.setBackgroundColor(new ColorRGBA(0.7f, 0.8f, 1f, 1f))
|
|
sceneModel.setLocalScale(2f)
|
|
sceneModel.addControl(landscape)
|
|
discard { rootNode.attachChild(sceneModel) }
|
|
bulletAppState.getPhysicsSpace.add(landscape)
|
|
bulletAppState.getPhysicsSpace.add(player)
|
|
|
|
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))
|
|
|
|
}
|
|
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()
|
|
}
|
|
|
|
// override def stop(): Unit = {
|
|
// actorSystem.terminate()
|
|
// super.stop()
|
|
// }
|
|
|
|
// override def start(): Unit = {
|
|
// monix.eval.Task(super.start()).runToFuture(Scheduler(JMEExecutorService))
|
|
// }
|
|
|
|
// def start(system: ActorRef[RootActor.Command]) = {
|
|
// // system ! RootActor.Start
|
|
// super.start()
|
|
|
|
// }
|
|
// override def stop(): Unit = {
|
|
// println("stopping")
|
|
// }
|
|
def stop[T](cb: () => T): Unit = {
|
|
println("destroy")
|
|
cb()
|
|
super.stop()
|
|
}
|
|
|
|
// override def stop(): Unit = {}
|
|
}
|