armory/Sources/cycles/trait/FirstPersonController.hx
2016-03-28 23:02:42 +02:00

157 lines
4.1 KiB
Haxe

package cycles.trait;
import lue.math.Mat4;
import lue.math.Vec4;
import lue.trait.Trait;
import lue.sys.Input;
import lue.sys.Time;
import lue.node.Transform;
import cycles.trait.RigidBody;
import lue.node.CameraNode;
class FirstPersonController extends Trait {
var transform:Transform;
var body:RigidBody;
var camera:CameraNode;
var moveForward = false;
var moveBackward = false;
var moveLeft = false;
var moveRight = false;
var jump = false;
public function new() {
super();
requestInit(init);
requestUpdate(update);
kha.input.Keyboard.get().notify(onDown, onUp);
}
function init() {
transform = node.transform;
body = node.getTrait(RigidBody);
camera = lue.node.RootNode.cameras[0];
}
function onDown(key: kha.Key, char: String) {
if (char == "w") moveForward = true;
else if (char == "d") moveRight = true;
else if (char == "s") moveBackward = true;
else if (char == "a") moveLeft = true;
else if (char == "x") jump = true;
}
function onUp(key: kha.Key, char: String) {
if (char == "w") moveForward = false;
else if (char == "d") moveRight = false;
else if (char == "s") moveBackward = false;
else if (char == "a") moveLeft = false;
else if (char == "x") jump = false;
}
var locked = true;
public function update() {
// Unlock
// if (locked &&
// Input.x > lue.App.w / 2 - 20 && Input.x < lue.App.w / 2 + 20 &&
// Input.y > lue.App.h / 2 - 20 && Input.y < lue.App.h / 2 +20) {
// locked = false;
// }
// Look
// if (!locked) {
if (Input.touch) {
camera.rotate(new Vec4(1, 0, 0), Input.deltaY / 100);
transform.rotate(new Vec4(0, 0, 1), -Input.deltaX / 100);
body.syncTransform();
}
// Move
var dir = new Vec4();
if (moveForward) {
var mat = Mat4.identity();
transform.rot.saveToMatrix(mat);
var force = new Vec4(0, 1, 0);
force.applyProjection(mat);
dir.add(force);
}
if (moveBackward) {
var mat = Mat4.identity();
transform.rot.saveToMatrix(mat);
var force = new Vec4(0, -1, 0);
force.applyProjection(mat);
dir.add(force);
}
if (moveLeft) {
var mat = Mat4.identity();
transform.rot.saveToMatrix(mat);
var force = new Vec4(-1, 0, 0);
force.applyProjection(mat);
dir.add(force);
}
if (moveRight) {
var mat = Mat4.identity();
transform.rot.saveToMatrix(mat);
var force = new Vec4(1, 0, 0);
force.applyProjection(mat);
dir.add(force);
}
if (jump) {
var mat = Mat4.identity();
transform.rot.saveToMatrix(mat);
var force = new Vec4(0, 0, 1);
force.applyProjection(mat);
force = force.mult(Time.delta * 70);
body.applyImpulse(force);
}
if (!moveForward && !moveBackward && !moveLeft && !moveRight && !jump) {
var mat = Mat4.identity();
transform.rot.saveToMatrix(mat);
var force = new Vec4(0, 0, -1);
force.applyProjection(mat);
force = force.mult(Time.delta * 3000);
body.applyImpulse(force);
}
else {
body.activate();
dir = dir.mult(Time.delta * 250);
body.setLinearVelocity(dir.x, dir.y, dir.z);
}
// if (Input.touch) {
// // Look
// camera.rotate(camera.right(), Input.deltaY / 100);
// transform.rotate(new Vec4(0, 0, 1), -Input.deltaX / 100);
// body.syncTransform();
// // Move
// var mat = Mat4.identity();
// transform.rot.saveToMatrix(mat);
// var force = new Vec4(0, 1, 0);
// force.applyProjection(mat);
// force = force.mult(Time.delta * 200);
// body.applyImpulse(force);
// }
body.setAngularFactor(0, 0, 0);
camera.updateMatrix();
}
}