From cfc4a915bea4a1ae5d1e4346a1ab439cbd2c42be Mon Sep 17 00:00:00 2001 From: Juan Sebastian Montoya Date: Wed, 26 Nov 2025 01:28:46 -0500 Subject: [PATCH] Implement touch controls for mobile devices and update instructions in the UI - Added touch event listeners to enable movement via touch gestures. - Updated the instructions to include mobile controls. - Adjusted CSS for better readability on smaller screens. --- index.html | 123 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 122 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index f1c3950..be499cd 100644 --- a/index.html +++ b/index.html @@ -72,6 +72,11 @@ text-align: center; text-shadow: 2px 2px 4px rgba(0,0,0,0.5); } + @media (max-width: 768px) { + #instructions { + font-size: 14px; + } + } @@ -87,7 +92,7 @@
-

Controls: WASD or Arrow Keys to move | Collect yellow coins | Avoid red obstacles!

+

Controls: WASD or Arrow Keys to move | Touch and drag to move (mobile) | Collect yellow coins | Avoid red obstacles!

@@ -319,6 +324,12 @@ this.keys = {}; this.coins = []; this.obstacles = []; + this.touchActive = false; + this.touchStartX = 0; + this.touchStartY = 0; + this.touchCurrentX = 0; + this.touchCurrentY = 0; + this.touchId = null; this.init(); this.setupEventListeners(); @@ -427,6 +438,111 @@ }); window.addEventListener('resize', () => this.onWindowResize()); document.getElementById('restartBtn').addEventListener('click', () => this.restart()); + + // Touch event listeners + this.setupTouchControls(); + } + + setupTouchControls() { + const canvas = this.renderer.domElement; + + // Prevent default touch behaviors + canvas.addEventListener('touchstart', (e) => { + e.preventDefault(); + this.handleTouchStart(e); + }, { passive: false }); + + canvas.addEventListener('touchmove', (e) => { + e.preventDefault(); + this.handleTouchMove(e); + }, { passive: false }); + + canvas.addEventListener('touchend', (e) => { + e.preventDefault(); + this.handleTouchEnd(e); + }, { passive: false }); + + canvas.addEventListener('touchcancel', (e) => { + e.preventDefault(); + this.handleTouchEnd(e); + }, { passive: false }); + } + + handleTouchStart(e) { + if (this.touchActive) return; + + const touch = e.touches[0]; + const rect = this.renderer.domElement.getBoundingClientRect(); + + // Use center of screen as reference point + this.touchStartX = rect.left + rect.width / 2; + this.touchStartY = rect.top + rect.height / 2; + + this.touchId = touch.identifier; + this.touchCurrentX = touch.clientX; + this.touchCurrentY = touch.clientY; + this.touchActive = true; + } + + handleTouchMove(e) { + if (!this.touchActive) return; + + const touch = Array.from(e.touches).find(t => t.identifier === this.touchId); + if (!touch) return; + + this.touchCurrentX = touch.clientX; + this.touchCurrentY = touch.clientY; + + this.updateTouchMovement(); + } + + handleTouchEnd(e) { + if (!this.touchActive) return; + + // Check if the touch that ended is our tracked touch + const touch = Array.from(e.changedTouches).find(t => t.identifier === this.touchId); + if (!touch) return; + + this.touchActive = false; + this.touchId = null; + this.touchCurrentX = this.touchStartX; + this.touchCurrentY = this.touchStartY; + this.updateTouchMovement(); + } + + updateTouchMovement() { + if (!this.touchActive) { + // Reset all movement keys + this.keys['w'] = false; + this.keys['s'] = false; + this.keys['a'] = false; + this.keys['d'] = false; + return; + } + + const deltaX = this.touchCurrentX - this.touchStartX; + const deltaY = this.touchCurrentY - this.touchStartY; + const distance = Math.sqrt(deltaX * deltaX + deltaY * deltaY); + + // Normalize movement direction + const threshold = 10; // Minimum movement to register + if (distance < threshold) { + this.keys['w'] = false; + this.keys['s'] = false; + this.keys['a'] = false; + this.keys['d'] = false; + return; + } + + // Calculate direction + const normalizedX = deltaX / distance; + const normalizedY = deltaY / distance; + + // Update movement keys based on direction + this.keys['w'] = normalizedY < -0.3; + this.keys['s'] = normalizedY > 0.3; + this.keys['a'] = normalizedX < -0.3; + this.keys['d'] = normalizedX > 0.3; } updatePlayer() { @@ -516,6 +632,11 @@ animate() { requestAnimationFrame(() => this.animate()); + // Update touch movement if active + if (this.touchActive) { + this.updateTouchMovement(); + } + this.updatePlayer(); this.updateCoins(); this.updateObstacles();