|
@@ -96,6 +96,7 @@
|
|
|
|
|
|
if ( document.pointerLockElement === element || document.mozPointerLockElement === element || document.webkitPointerLockElement === element ) {
|
|
|
|
|
|
+ controlsEnabled = true;
|
|
|
controls.enabled = true;
|
|
|
|
|
|
blocker.style.display = 'none';
|
|
@@ -174,6 +175,16 @@
|
|
|
init();
|
|
|
animate();
|
|
|
|
|
|
+ var controlsEnabled = false;
|
|
|
+
|
|
|
+ var moveForward = false;
|
|
|
+ var moveBackward = false;
|
|
|
+ var moveLeft = false;
|
|
|
+ var moveRight = false;
|
|
|
+
|
|
|
+ var prevTime = performance.now();
|
|
|
+ var velocity = new THREE.Vector3();
|
|
|
+
|
|
|
function init() {
|
|
|
|
|
|
camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 1, 1000 );
|
|
@@ -188,6 +199,69 @@
|
|
|
controls = new THREE.PointerLockControls( camera );
|
|
|
scene.add( controls.getObject() );
|
|
|
|
|
|
+ var onKeyDown = function ( event ) {
|
|
|
+
|
|
|
+ switch ( event.keyCode ) {
|
|
|
+
|
|
|
+ case 38: // up
|
|
|
+ case 87: // w
|
|
|
+ moveForward = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 37: // left
|
|
|
+ case 65: // a
|
|
|
+ moveLeft = true; break;
|
|
|
+
|
|
|
+ case 40: // down
|
|
|
+ case 83: // s
|
|
|
+ moveBackward = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 39: // right
|
|
|
+ case 68: // d
|
|
|
+ moveRight = true;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 32: // space
|
|
|
+ if ( canJump === true ) velocity.y += 350;
|
|
|
+ canJump = false;
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ var onKeyUp = function ( event ) {
|
|
|
+
|
|
|
+ switch( event.keyCode ) {
|
|
|
+
|
|
|
+ case 38: // up
|
|
|
+ case 87: // w
|
|
|
+ moveForward = false;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 37: // left
|
|
|
+ case 65: // a
|
|
|
+ moveLeft = false;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 40: // down
|
|
|
+ case 83: // s
|
|
|
+ moveBackward = false;
|
|
|
+ break;
|
|
|
+
|
|
|
+ case 39: // right
|
|
|
+ case 68: // d
|
|
|
+ moveRight = false;
|
|
|
+ break;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+ document.addEventListener( 'keydown', onKeyDown, false );
|
|
|
+ document.addEventListener( 'keyup', onKeyUp, false );
|
|
|
+
|
|
|
raycaster = new THREE.Raycaster( new THREE.Vector3(), new THREE.Vector3( 0, - 1, 0 ), 0, 10 );
|
|
|
|
|
|
// floor
|
|
@@ -274,20 +348,50 @@
|
|
|
|
|
|
requestAnimationFrame( animate );
|
|
|
|
|
|
- controls.isOnObject( false );
|
|
|
+ if ( controlsEnabled ) {
|
|
|
+ raycaster.ray.origin.copy( controls.getObject().position );
|
|
|
+ raycaster.ray.origin.y -= 10;
|
|
|
|
|
|
- raycaster.ray.origin.copy( controls.getObject().position );
|
|
|
- raycaster.ray.origin.y -= 10;
|
|
|
+ var intersections = raycaster.intersectObjects( objects );
|
|
|
|
|
|
- var intersections = raycaster.intersectObjects( objects );
|
|
|
+ var isOnObject = intersections.length > 0;
|
|
|
|
|
|
- if ( intersections.length > 0 ) {
|
|
|
+ var time = performance.now();
|
|
|
+ var delta = ( time - prevTime ) / 1000;
|
|
|
|
|
|
- controls.isOnObject( true );
|
|
|
+ velocity.x -= velocity.x * 10.0 * delta;
|
|
|
+ velocity.z -= velocity.z * 10.0 * delta;
|
|
|
|
|
|
- }
|
|
|
+ velocity.y -= 9.8 * 100.0 * delta; // 100.0 = mass
|
|
|
+
|
|
|
+ if ( moveForward ) velocity.z -= 400.0 * delta;
|
|
|
+ if ( moveBackward ) velocity.z += 400.0 * delta;
|
|
|
+
|
|
|
+ if ( moveLeft ) velocity.x -= 400.0 * delta;
|
|
|
+ if ( moveRight ) velocity.x += 400.0 * delta;
|
|
|
+
|
|
|
+ if ( isOnObject === true ) {
|
|
|
+ velocity.y = Math.max( 0, velocity.y );
|
|
|
+
|
|
|
+ canJump = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ controls.getObject().translateX( velocity.x * delta );
|
|
|
+ controls.getObject().translateY( velocity.y * delta );
|
|
|
+ controls.getObject().translateZ( velocity.z * delta );
|
|
|
+
|
|
|
+ if ( controls.getObject().position.y < 10 ) {
|
|
|
+
|
|
|
+ velocity.y = 0;
|
|
|
+ controls.getObject().position.y = 10;
|
|
|
+
|
|
|
+ canJump = true;
|
|
|
|
|
|
- controls.update();
|
|
|
+ }
|
|
|
+
|
|
|
+ prevTime = time;
|
|
|
+
|
|
|
+ }
|
|
|
|
|
|
renderer.render( scene, camera );
|
|
|
|