Catch_the_Orb / script.js
Rooni's picture
Update script.js
be5f739 verified
const player = document.getElementById('player');
const scoreDisplay = document.getElementById('score');
const gameArea = document.getElementById('game-area');
const gameOverDisplay = document.getElementById('game-over');
const pauseButton = document.getElementById('pause-button');
const pauseMenu = document.getElementById('pause-menu');
const resumeButton = document.getElementById('resume-button');
let score = 0;
let gameOver = false;
let isPaused = false;
let orbSpeed = 2;
let bonusSpeed = 4;
let intervalId;
let orbs = [];
let bonuses = [];
// Player movement (mouse control)
document.addEventListener('mousemove', (e) => {
if (isPaused || gameOver) return;
const gameAreaRect = gameArea.getBoundingClientRect();
let mouseX = e.clientX - gameAreaRect.left;
if (mouseX < 0) mouseX = 0;
if (mouseX > gameArea.offsetWidth - player.offsetWidth) mouseX = gameArea.offsetWidth - player.offsetWidth;
player.style.left = `${mouseX}px`;
});
// Player movement (touch control)
gameArea.addEventListener('touchstart', (e) => {
touchStartX = e.touches[0].clientX;
touchCurrentX = touchStartX;
});
gameArea.addEventListener('touchmove', (e) => {
touchCurrentX = e.touches[0].clientX;
if (!isPaused && !gameOver) {
const gameAreaRect = gameArea.getBoundingClientRect();
let playerLeft = touchCurrentX - gameAreaRect.left - player.offsetWidth / 2;
playerLeft = Math.max(0, Math.min(playerLeft, gameArea.offsetWidth - player.offsetWidth));
player.style.left = `${playerLeft}px`;
}
}, { passive: true });
// Pause on Esc key
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') {
togglePause();
}
});
// Pause on window blur
window.addEventListener('blur', () => {
if (!gameOver && !isPaused) {
togglePause();
}
});
// Pause button for mobile devices
pauseButton.addEventListener('click', () => {
togglePause();
});
// Resume button
resumeButton.addEventListener('click', () => {
togglePause();
});
// Create orb
function createOrb() {
if (isPaused || gameOver) return;
const orb = document.createElement('div');
orb.classList.add('orb');
orb.style.backgroundColor = `rgb(${Math.random() * 255}, ${Math.random() * 255}, ${Math.random() * 255})`;
orb.style.left = `${Math.random() * (gameArea.offsetWidth - 30)}px`;
orb.style.top = `${Math.random() * -50}px`; // Start above the top
gameArea.appendChild(orb);
// Create trail
const trail = document.createElement('div');
trail.classList.add('trail');
trail.style.background = orb.style.background;
trail.style.left = orb.style.left;
trail.style.top = orb.style.top;
gameArea.appendChild(trail);
let orbInterval = setInterval(() => {
if (isPaused || gameOver) {
clearInterval(orbInterval);
return;
}
let orbTop = parseFloat(getComputedStyle(orb).getPropertyValue('top'));
orb.style.top = `${orbTop + orbSpeed}px`;
trail.style.top = `${orbTop + orbSpeed}px`;
if (orbTop > gameArea.offsetHeight) {
clearInterval(orbInterval);
gameArea.removeChild(orb);
gameArea.removeChild(trail);
orbs = orbs.filter(o => o !== orb);
}
// Collision detection
if (checkCollision(orb, player)) {
clearInterval(orbInterval);
gameArea.removeChild(orb);
gameArea.removeChild(trail);
score += 10;
scoreDisplay.textContent = score;
increaseDifficulty();
}
}, 16);
orbs.push({ element: orb, interval: orbInterval });
}
// Create bonus
function createBonus() {
if (isPaused || gameOver) return;
const bonus = document.createElement('div');
bonus.classList.add('bonus');
bonus.style.left = `${Math.random() * (gameArea.offsetWidth - 30)}px`;
bonus.style.top = `${Math.random() * -50}px`; // Start above the top
gameArea.appendChild(bonus);
// Create trail
const trail = document.createElement('div');
trail.classList.add('trail');
trail.style.background = bonus.style.background;
trail.style.left = bonus.style.left;
trail.style.top = bonus.style.top;
gameArea.appendChild(trail);
let bonusInterval = setInterval(() => {
if (isPaused || gameOver) {
clearInterval(bonusInterval);
return;
}
let bonusTop = parseFloat(getComputedStyle(bonus).getPropertyValue('top'));
bonus.style.top = `${bonusTop + bonusSpeed}px`;
trail.style.top = `${bonusTop + bonusSpeed}px`;
if (bonusTop > gameArea.offsetHeight) {
clearInterval(bonusInterval);
gameArea.removeChild(bonus);
gameArea.removeChild(trail);
bonuses = bonuses.filter(b => b !== bonus);
}
// Collision detection
if (checkCollision(bonus, player)) {
clearInterval(bonusInterval);
gameArea.removeChild(bonus);
gameArea.removeChild(trail);
score += 50; // Bonus gives 50 points
scoreDisplay.textContent = score;
}
}, 16);
bonuses.push({ element: bonus, interval: bonusInterval });
}
// Collision detection
function checkCollision(a, b) {
const aRect = a.getBoundingClientRect();
const bRect = b.getBoundingClientRect();
return !(
aRect.bottom < bRect.top ||
aRect.top > bRect.bottom ||
aRect.right < bRect.left ||
aRect.left > bRect.right
);
}
// Increase difficulty
function increaseDifficulty() {
orbSpeed += 0.1;
bonusSpeed += 0.05;
}
// Toggle pause
function togglePause() {
if (gameOver) return;
isPaused = !isPaused;
if (isPaused) {
clearInterval(intervalId);
pauseButton.textContent = "Pause";
pauseMenu.style.display = "block";
pauseButton.style.display = "none";
// Stop all orb intervals
orbs.forEach(o => clearInterval(o.interval));
bonuses.forEach(b => clearInterval(b.interval));
} else {
intervalId = setInterval(() => {
createOrb();
if (Math.random() < 0.1) { // 10% chance to create a bonus
createBonus();
}
}, 500);
pauseMenu.style.display = "none";
pauseButton.style.display = "block";
// Resume all orb intervals
orbs.forEach(o => {
d.interval = setInterval(o.orbInterval, 16);
});
bonuses.forEach(b => {
b.interval = setInterval(b.bonusInterval, 16);
});
}
}
// Game over
function endGame() {
clearInterval(intervalId);
orbs.forEach(o => clearInterval(o.interval));
bonuses.forEach(b => clearInterval(b.interval));
gameOver = true;
gameOverDisplay.style.display = "block";
isPaused = true;
pauseButton.style.display = "none";
pauseMenu.style.display = "none";
}
// Start game
function startGame() {
score = 0;
scoreDisplay.textContent = score;
orbSpeed = 2;
bonusSpeed = 4;
gameOverDisplay.style.display = "none";
gameOver = false;
isPaused = false;
pauseButton.style.display = "none";
pauseMenu.style.display = "none";
orbs = [];
bonuses = [];
intervalId = setInterval(() => {
createOrb();
if (Math.random() < 0.1) { // 10% chance to create a bonus
createBonus();
}
}, 500);
// Show pause button on mobile devices
if (window.innerWidth <= 600) {
pauseButton.style.display = "block";
}
}
// Start the game
startGame();