import * as THREE from 'https://unpkg.com/three@0.166.1/build/three.module.js'; const scene = new THREE.Scene(); scene.background = new THREE.Color(0x87ceeb); const camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 ); const renderer = new THREE.WebGLRenderer({ antialias:true }); renderer.setSize( window.innerWidth, window.innerHeight ); document.body.appendChild(renderer.domElement); const light = new THREE.HemisphereLight( 0xffffff, 0x444444, 3 ); scene.add(light); const floor = new THREE.Mesh( new THREE.PlaneGeometry(200,200), new THREE.MeshStandardMaterial({ color:0x3f7d32 }) ); floor.rotation.x = -Math.PI/2; scene.add(floor); camera.position.set(0,1.7,10); const player = { hp:100, score:0 }; const hpText = document.getElementById("hp"); const scoreText = document.getElementById("score"); const enemies = []; function createEnemy(){ const enemy = new THREE.Mesh( new THREE.BoxGeometry(1,1,1), new THREE.MeshStandardMaterial({ color:0xff3333 }) ); enemy.position.set( (Math.random()-0.5)*80, 0.5, (Math.random()-0.5)*80 ); scene.add(enemy); enemies.push(enemy); } for(let i=0;i<15;i++){ createEnemy(); } const keys = {}; document.addEventListener("keydown",e=>{ keys[e.key.toLowerCase()] = true; }); document.addEventListener("keyup",e=>{ keys[e.key.toLowerCase()] = false; }); const start = document.getElementById("start"); start.addEventListener("click",()=>{ document.body.requestPointerLock(); start.style.display="none"; }); document.addEventListener("mousemove",e=>{ if(document.pointerLockElement!==document.body) return; camera.rotation.y -= e.movementX * 0.002; }); document.addEventListener("mousedown",()=>{ if(document.pointerLockElement!==document.body) return; const raycaster = new THREE.Raycaster(); raycaster.setFromCamera( new THREE.Vector2(0,0), camera ); const hits = raycaster.intersectObjects(enemies); if(hits.length){ const enemy = hits[0].object; scene.remove(enemy); enemies.splice( enemies.indexOf(enemy), 1 ); player.score += 10; scoreText.textContent = player.score; createEnemy(); } }); function updatePlayer(){ const speed = 0.15; if(keys["w"]) camera.position.z -= speed; if(keys["s"]) camera.position.z += speed; if(keys["a"]) camera.position.x -= speed; if(keys["d"]) camera.position.x += speed; } function updateEnemies(){ enemies.forEach(enemy=>{ enemy.lookAt(camera.position); enemy.position.lerp( camera.position, 0.0009 ); if( enemy.position.distanceTo( camera.position ) < 1.5 ){ player.hp -= 0.05; hpText.textContent = Math.floor(player.hp); } }); if(player.hp <= 0){ alert( "GAME OVER\nPuntuación: " + player.score ); location.reload(); } } function animate(){ requestAnimationFrame(animate); updatePlayer(); updateEnemies(); renderer.render( scene, camera ); } animate(); window.addEventListener( "resize", ()=>{ camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize( window.innerWidth, window.innerHeight ); } );