import GetForwardVector from 'Assets/Library/GetForwardVector'; import * as RE from 'rogue-engine'; import * as THREE from 'three' import FloorCheckComponent from './FloorCheckComponent.re'; import RAPIER from '@dimforge/rapier3d-compat'; import RapierBody from '@RE/RogueEngine/rogue-rapier/Components/RapierBody.re'; export default class RapierMovementController extends RE.Component { @RE.props.num() speed: number = 1 @RE.props.num() jumpStrength: number = 10 vectorCalculator: GetForwardVector bodyComponent: RapierBody private jumpVector: RAPIER.Vector3 = new RAPIER.Vector3(0,1,0) private scaledVelocity: THREE.Vector3 = new THREE.Vector3(0,0,0) private rapierScaledVelocity: RAPIER.Vector3 = new RAPIER.Vector3(0,0,0) awake() { this.bodyComponent = RE.getComponent(RapierBody, this.object3d) as RapierBody } start() { this.vectorCalculator = new GetForwardVector(RE.Runtime.camera) } update() { let direction = {x:0, y: 0, z: 0} if (RE.Input.keyboard.getKeyPressed("KeyW")) { direction.x += 1 } if (RE.Input.keyboard.getKeyPressed("KeyA")) { direction.y += -1 } if (RE.Input.keyboard.getKeyPressed("KeyS")) { direction.x += -1 } if (RE.Input.keyboard.getKeyPressed("KeyD")) { direction.y += 1 } if (RE.Input.keyboard.getKeyPressed("Space")) { direction.z = 1 } if(direction.x != 0) { this.moveForward(direction.x * this.speed) } if(direction.y != 0) { this.moveRight(direction.y * this.speed) } if(direction.z != 0) { const floorCheckComponent = RE.getComponent(FloorCheckComponent, this.object3d) if(floorCheckComponent) { if(floorCheckComponent.isOnFloor) { this.jumpVector.y = this.jumpStrength this.bodyComponent.body.applyImpulse(this.jumpVector, true) } } } } moveForward(distance) { this.scaledVelocity.set(0,0,0) this.scaledVelocity.addScaledVector(this.vectorCalculator.getForward(), distance) this.rapierScaledVelocity.x = this.scaledVelocity.x this.rapierScaledVelocity.y = this.scaledVelocity.y this.rapierScaledVelocity.z = this.scaledVelocity.z this.bodyComponent.body.applyImpulse(this.rapierScaledVelocity, true) } moveRight(distance) { this.scaledVelocity.set(0,0,0) this.scaledVelocity.addScaledVector(this.vectorCalculator.getRight(), distance) this.rapierScaledVelocity.x = this.scaledVelocity.x this.rapierScaledVelocity.y = this.scaledVelocity.y this.rapierScaledVelocity.z = this.scaledVelocity.z this.bodyComponent.body.applyImpulse(this.rapierScaledVelocity, true) } } RE.registerComponent(RapierMovementController);