Score: 0
💥 Game Over 💥
8) fingerPositions.shift(); checkFingerCut(); } }); window.addEventListener("pointerup", () => { cuttingActive = false; knife.material.color.set(0xffffff); fingerPositions = []; }); function updateKnifePosition(e) { let ndcX = (e.clientX / window.innerWidth) * 2 - 1; let ndcY = -(e.clientY / window.innerHeight) * 2 + 1; knife.position.x = ndcX * 5; knife.position.y = ndcY * 3; } function checkFingerCut() { if (fingerPositions.length < 2) return; let lastPos = fingerPositions[fingerPositions.length - 1]; let prevPos = fingerPositions[fingerPositions.length - 2]; let speed = lastPos.distanceTo(prevPos); if (speed < 0.05) return; // Ignore slow movement for (let i = fruits.length - 1; i >= 0; i--) { let fruit = fruits[i]; for (let j = 0; j < fingerPositions.length - 1; j++) { const pointA = fingerPositions[j]; const pointB = fingerPositions[j + 1]; if (pointToLineDistance(fruit.position, pointA, pointB) < 0.7) { if (fruit.userData.isBomb) { endGame(); return; } else { score++; document.getElementById("score").textContent = "Score: " + score; spawnJuice(fruit.position); } scene.remove(fruit); fruits.splice(i, 1); break; } } } } let clock = new THREE.Clock(); function animate() { requestAnimationFrame(animate); let delta = clock.getDelta(); if (!gameOver) { fruits.forEach(fruit => { fruit.userData.velocity.y -= 9.8 * delta; fruit.position.add(fruit.userData.velocity.clone().multiplyScalar(delta)); }); } for (let i = particles.length - 1; i >= 0; i--) { let p = particles[i]; p.userData.life -= delta; p.position.add(p.userData.velocity.clone().multiplyScalar(delta)); if (p.userData.life <= 0) { scene.remove(p); particles.splice(i, 1); } } renderer.render(scene, camera); } animate(); window.addEventListener("resize", () => { camera.aspect = window.innerWidth / window.innerHeight; camera.updateProjectionMatrix(); renderer.setSize(window.innerWidth, window.innerHeight); });