123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- import * as RE from 'rogue-engine';
- import * as CANNON from 'cannon-es';
- import CannonBody from '../CannonBody.re';
- export default class CannonSimpleCharacterController extends RE.Component {
- @RE.props.num() fwdSpeed = 3;
- @RE.props.num() jumpSpeed = 5;
- rigidbody: CannonBody | undefined;
- canJump = false;
- private contactNormal = new CANNON.Vec3();
- private upAxis = new CANNON.Vec3(0, 1, 0);
- private inputAngularVelocity = new CANNON.Vec3();
- private inputVelocity = new CANNON.Vec3();
- awake() {
- this.rigidbody = RE.getComponent(CannonBody, this.object3d);
- // this.stick = RE.getComponent(TouchStick, this.object3d);
- this.rigidbody?.onCollide(event => {
- event.contact.ni.negate(this.contactNormal);
- if (this.contactNormal.dot(this.upAxis) > 0.5) {
- this.canJump = true
- }
- });
- if (!this.rigidbody) return;
- this.rigidbody.body.type = CANNON.Body.DYNAMIC;
- }
- update() {
- if (!this.rigidbody) return;
- this.inputVelocity.setZero();
- if (RE.Input.keyboard.getKeyPressed("KeyW")) {
- this.inputVelocity.z = -1;
- }
- else if (RE.Input.keyboard.getKeyPressed("KeyS")) {
- this.inputVelocity.z = 1;
- }
- else {
- this.inputVelocity.z = 0;
- }
-
- if (RE.Input.keyboard.getKeyPressed("KeyA")) {
- this.inputVelocity.x = -1;
- }
- else if (RE.Input.keyboard.getKeyPressed("KeyD")) {
- this.inputVelocity.x = 1;
- }
- else {
- this.inputVelocity.x = 0;
- }
- this.inputVelocity.normalize();
- this.inputVelocity.scale(this.fwdSpeed, this.inputVelocity);
- if (this.canJump && RE.Input.keyboard.getKeyDown("Space")) {
- this.rigidbody.body.velocity.y = this.jumpSpeed;
- this.canJump = false;
- }
- this.rigidbody.body.angularVelocity.y = this.inputAngularVelocity.y;
- this.rigidbody.body.vectorToWorldFrame(this.inputVelocity, this.inputVelocity);
- if (!this.canJump) return;
- this.rigidbody.body.velocity.x = this.inputVelocity.x;
- this.rigidbody.body.velocity.z = this.inputVelocity.z;
- }
- }
- RE.registerComponent(CannonSimpleCharacterController);
|