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.
|
|
package wow.doge.mygame.game.controls
import scala.concurrent.Future
import com.jme3.math.FastMath import com.jme3.math.Quaternion import com.jme3.math.Vector3f import com.jme3.renderer.RenderManager import com.jme3.renderer.ViewPort import com.jme3.scene.Node import com.jme3.scene.Spatial import com.jme3.scene.control.AbstractControl import monix.execution.Ack import monix.execution.Cancelable import monix.execution.Scheduler import monix.reactive.Observable import monix.reactive.Observer import wow.doge.mygame.game.subsystems.input.PlayerCameraInput
/**
* A very low level (and error prone) camera movement control implementation. * Not used currently * * @param rotationBuf * @param obs * @param rotateFn * @param s */ class CameraMovementControl( rotationBuf: Quaternion, obs: Observable[PlayerCameraInput], rotateFn: Quaternion => Unit )(implicit s: Scheduler) extends AbstractControl { private var _event: PlayerCameraInput = null private var _subscriptionToken: Cancelable = null
private val sink = new Observer[PlayerCameraInput] {
override def onNext(event: PlayerCameraInput): Future[Ack] = { _event = event Ack.Continue }
override def onError(ex: Throwable): Unit = {}
override def onComplete(): Unit = {}
}
override def controlUpdate(tpf: Float): Unit = if (_event != null) { _event match { case PlayerCameraInput.CameraRotateLeft => val rot = rotationBuf .fromAngleAxis(1 * FastMath.DEG_TO_RAD, Vector3f.UNIT_Y) rotateFn(rot) case PlayerCameraInput.CameraRotateRight => val rot = rotationBuf .fromAngleAxis(-1 * FastMath.DEG_TO_RAD, Vector3f.UNIT_Y) rotateFn(rot) case PlayerCameraInput.CameraRotateUp => val rot = rotationBuf .fromAngleAxis(-1 * FastMath.DEG_TO_RAD, Vector3f.UNIT_X) rotateFn(rot) case PlayerCameraInput.CameraRotateDown => val rot = rotationBuf .fromAngleAxis(1 * FastMath.DEG_TO_RAD, Vector3f.UNIT_X) rotateFn(rot) } _event = null }
override def controlRender( x$1: RenderManager, x$2: ViewPort ): Unit = {} override def setSpatial(spatial: Spatial): Unit = { super.setSpatial(spatial) if (this.spatial != null) _subscriptionToken = obs.subscribe(sink) else { _subscriptionToken.cancel() _subscriptionToken = null } }
}
class FollowControl(playerNode: Node) extends AbstractControl { override def controlUpdate(tpf: Float): Unit = this.spatial.setLocalTranslation(playerNode.getLocalTranslation()) override def controlRender( rm: RenderManager, vp: ViewPort ): Unit = {} }
|