diff options
Diffstat (limited to 'assets/javascripts/mx/extensions/mx.movements.js')
| -rw-r--r-- | assets/javascripts/mx/extensions/mx.movements.js | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/assets/javascripts/mx/extensions/mx.movements.js b/assets/javascripts/mx/extensions/mx.movements.js new file mode 100644 index 0000000..691ada7 --- /dev/null +++ b/assets/javascripts/mx/extensions/mx.movements.js @@ -0,0 +1,160 @@ + + +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 + } + + } + } +} |
