diff --git a/index.html b/index.html index c972a8f..718dfae 100644 --- a/index.html +++ b/index.html @@ -1,6 +1,7 @@ Minecraft + diff --git a/src/js/net/minecraft/client/GameWindow.js b/src/js/net/minecraft/client/GameWindow.js index 3b3055a..e39b74f 100644 --- a/src/js/net/minecraft/client/GameWindow.js +++ b/src/js/net/minecraft/client/GameWindow.js @@ -9,6 +9,8 @@ window.GameWindow = class { this.mouseLocked = false; this.actualMouseLocked = false; + this.isMobile = this.detectTouchDevice(); + // Get canvas wrapper this.wrapper = document.getElementById(this.canvasWrapperId); @@ -63,12 +65,14 @@ window.GameWindow = class { // Mouse buttons document.addEventListener('click', function (event) { // Create sound engine (It has to be created after user interaction) - if(!minecraft.soundManager.isCreated()) { + if (!minecraft.soundManager.isCreated()) { minecraft.soundManager.create(minecraft.worldRenderer); } // Handle in-game mouse click - minecraft.onMouseClicked(event.button); + if (!scope.isMobile) { + minecraft.onMouseClicked(event.button); + } // Handle mouse click on screen if (!(minecraft.currentScreen === null)) { @@ -84,6 +88,11 @@ window.GameWindow = class { // Keyboard interaction with screen window.addEventListener('keydown', function (event) { + if (event.code === "F11") { + return; // Toggle fullscreen + } + + // Prevent key event.preventDefault(); if (!(minecraft.currentScreen === null)) { @@ -96,18 +105,139 @@ window.GameWindow = class { } }); + // Touch interaction + let touchStart; + window.addEventListener('touchstart', function (event) { + for (let i = 0; i < event.touches.length; i++) { + let touch = event.touches[i]; + + let x = touch.pageX; + let y = touch.pageY; + + let isRightHand = x > scope.wrapper.offsetWidth / 2; + + if (isRightHand) { + touchStart = Date.now(); + } else { + let tileSize = scope.wrapper.offsetWidth / 8; + + let tileX = 0; + let tileY = scope.wrapper.offsetHeight - tileSize * 3; + + let relX = x - tileX; + let relY = y - tileY; + + let tileIndex = Math.floor(relX / tileSize) + Math.floor(relY / tileSize) * 3; + + // Walk buttons + switch (tileIndex) { + case 0: + case 1: + case 2: + Keyboard.setState("KeyW", true); + break; + case 3: + Keyboard.setState("KeyA", true); + break; + case 4: + Keyboard.setState("Space", true); + break; + case 5: + Keyboard.setState("KeyD", true); + break; + case 6: + case 7: + case 8: + Keyboard.setState("KeyS", true); + break; + } + } + } + + // Create sound engine (It has to be created after user interaction) + if (!minecraft.soundManager.isCreated()) { + minecraft.soundManager.create(minecraft.worldRenderer); + } + }); + + // Touch movement + let prevTouch; + window.addEventListener('touchmove', function (event) { + for (let i = 0; i < event.touches.length; i++) { + let touch = event.touches[i]; + + let x = touch.pageX; + let y = touch.pageY; + + // Right hand + let isRightHand = x > scope.wrapper.offsetWidth / 2; + + if (isRightHand) { + // Player movement + if (prevTouch) { + scope.mouseMotionX = (x - prevTouch.pageX) * 10; + scope.mouseMotionY = -(y - prevTouch.pageY) * 10; + } + + prevTouch = touch; + } + } + }); + window.addEventListener('touchend', function (event) { + // Break block + if (!prevTouch && touchStart && (Date.now() - touchStart) < 1000) { + minecraft.onMouseClicked(2); + } + + prevTouch = null; + touchStart = null; + + // Stop pressing keys + for (let i = 0; i < event.changedTouches.length; i++) { + let touch = event.changedTouches[i]; + + // Left hand + let isLeftHand = touch.pageX < scope.wrapper.offsetWidth / 2; + + // Release all keys + if (isLeftHand) { + Keyboard.unPressAll(); + break; + } + } + }); + + // Break block listener + if (this.isMobile) { + setInterval(() => { + if (touchStart && (Date.now() - touchStart) > 1000) { + touchStart = Date.now(); + minecraft.onMouseClicked(0); + } + }, 200); + } + // Create keyboard Keyboard.create(); } requestFocus() { - window.focus(); - this.canvas.requestPointerLock(); - document.body.style.cursor = 'none'; + if (this.isMobile) { + document.body.requestFullscreen(); + } else { + window.focus(); + this.canvas.requestPointerLock(); + document.body.style.cursor = 'none'; + } + this.mouseLocked = true; } exitFocus() { + if (this.isMobile) { + return; + } + document.exitPointerLock(); document.body.style.cursor = 'default'; } @@ -180,4 +310,13 @@ window.GameWindow = class { } } + detectTouchDevice() { + let match = window.matchMedia || window.msMatchMedia; + if (match) { + let mq = match("(pointer:coarse)"); + return mq.matches; + } + return false; + } + } \ No newline at end of file diff --git a/src/js/net/minecraft/util/Keyboard.js b/src/js/net/minecraft/util/Keyboard.js index 6cadf9d..83003bb 100644 --- a/src/js/net/minecraft/util/Keyboard.js +++ b/src/js/net/minecraft/util/Keyboard.js @@ -4,7 +4,7 @@ window.Keyboard = class { static create() { window.addEventListener('keydown', function (event) { - event.preventDefault(); + //event.preventDefault(); Keyboard.state[event.code] = true; //console.log("Key " + event.code + " down"); }); @@ -15,6 +15,14 @@ window.Keyboard = class { }); }; + static setState(key, state) { + Keyboard.state[key] = state; + } + + static unPressAll() { + Keyboard.state = {}; + } + static isKeyDown(key) { return Keyboard.state[key]; }