MX.Movements = function (cam, viewHeight, minimap) { var moveForward, moveLeft, moveBackward, moveRight, turnLeft, turnRight, jumping = false var v = 25, vr = Math.PI * 0.015 jumpV = 30, vx = vy = vz = 0 return { init: function () { document.addEventListener('keydown', function (e) { $(".edit-image.menu,.edit-video.menu").hide() switch ( e.keyCode ) { case 38: // up case 87: // w moveForward = true break case 37: // left case 65: // a turnLeft = true break case 40: // down case 83: // s moveBackward = true break case 39: // right case 68: // d turnRight = true break case 32: // space if (!jumping) vy += jumpV jumping = true break } }) document.addEventListener('keyup', function (e) { $(".edit-image.menu,.edit-video.menu").hide() switch ( e.keyCode ) { case 38: // up case 87: // w moveForward = false break case 37: // left case 65: // a turnLeft = false break case 40: // down case 83: // s moveBackward = false break case 39: // right case 68: // d turnRight = false break } }) var mouseX, mouseY, dx, dy, rotX, rotY, dragging = false document.addEventListener('mousedown', function (e) { $(".edit-image.menu,.edit-video.menu").hide() mouseX = e.pageX mouseY = e.pageY rotX = cam.rotationX rotY = cam.rotationY dragging = true }) document.addEventListener('mousemove', function (e) { if (! dragging || app.dragging) return var dx = (e.pageX - mouseX) / window.innerWidth * Math.PI/3 var dy = (e.pageY - mouseY) / window.innerHeight * Math.PI/3 cam.rotationY = rotY + dx cam.rotationX = rotX - dy minimap.update() }) document.addEventListener('mouseup', function (e) { app.dragging = dragging = false }) window.addEventListener('blur', function(e){ $(".edit-image.menu,.edit-video.menu").hide() moveForward = moveLeft= moveBackward = moveRight = turnLeft = turnRight = jumping = dragging = false }) }, update: function () { var ry = cam.rotationY if (moveForward || moveBackward || moveRight || moveLeft || turnLeft || turnRight) { vx = vz = 0 if (moveForward) { vx += v * Math.cos(ry + Math.PI / 2) vz += v * Math.sin(ry + Math.PI / 2) } if (moveBackward) { vx -= v * Math.cos(ry + Math.PI / 2) vz -= v * Math.sin(ry + Math.PI / 2) } if (moveLeft) { vx -= v * Math.cos(ry) vz -= v * Math.sin(ry) } if (moveRight) { vx += v * Math.cos(ry) vz += v * Math.sin(ry) } if (turnLeft) { cam.rotationY += vr } if (turnRight) { cam.rotationY -= vr } cam.x += vx cam.z += vz minimap.update() } vy -= 1 // update cam cam.y += vy if (cam.y <= viewHeight) { cam.y = viewHeight vy = 0 jumping = false } } } }