Untitled
Anonymous
plain_text
02/03/2026 6:27 PM
8.1 KB
9
Indexable
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dodge Pro: Chaos Edition</title>
<style>
body { margin: 0; overflow: hidden; background: #ffffff; font-family: sans-serif; }
canvas { display: block; cursor: none; }
#ui { position: absolute; top: 20px; left: 20px; pointer-events: none; user-select: none; }
.stat { font-size: 18px; font-weight: bold; color: #444; }
#shield-timer { color: #4caf50; font-size: 14px; display: none; }
</style>
</head>
<body>
<div id="ui">
<div class="stat">Score: <span id="scoreVal">0</span></div>
<div class="stat">Level: <span id="levelVal">1</span></div>
<div class="stat" style="color: #ff9800;">Best: <span id="bestVal">0</span></div>
<div id="shield-timer">SHIELD ACTIVE!</div>
</div>
<canvas id="gameCanvas"></canvas>
<script>
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
const scoreEl = document.getElementById('scoreVal');
const levelEl = document.getElementById('levelVal');
const bestEl = document.getElementById('bestVal');
const shieldEl = document.getElementById('shield-timer');
let score = 0, level = 1, gameOver = false;
let shieldActive = false, shieldTime = 0;
let savedBest = localStorage.getItem('dodgeHighScore') || 0;
bestEl.innerText = Math.floor(savedBest);
const player = { x: 0, y: 0, size: 12 };
let obstacles = [];
let powerups = [];
let baseSpeed = 4;
window.addEventListener('resize', () => {
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
});
window.dispatchEvent(new Event('resize'));
window.addEventListener('mousemove', (e) => {
player.x = e.clientX; player.y = e.clientY;
});
function spawn() {
// Normal Obstacles
if (Math.random() < 0.05 + (level * 0.005)) {
obstacles.push({
x: Math.random() * canvas.width,
y: -50,
w: 20 + Math.random() * 50,
h: 20,
speed: baseSpeed + (Math.random() * level),
rotation: 0,
rotSpeed: 0,
type: 'reg'
});
}
// Giant Rotating Block (Rare)
if (Math.random() < 0.005 + (level * 0.001)) {
obstacles.push({
x: Math.random() * canvas.width,
y: -100,
w: 120,
h: 30,
speed: baseSpeed * 0.7,
rotation: 0,
rotSpeed: 0.05 + (Math.random() * 0.05),
type: 'giant'
});
}
// Power-up
if (Math.random() < 0.003) {
powerups.push({ x: Math.random() * canvas.width, y: -20, speed: 3 });
}
}
function update() {
if (gameOver) return;
ctx.clearRect(0, 0, canvas.width, canvas.height);
score += 0.15;
scoreEl.innerText = Math.floor(score);
level = Math.floor(score / 100) + 1;
levelEl.innerText = level;
if (shieldActive) {
shieldTime--;
shieldEl.style.display = 'block';
if (shieldTime <= 0) shieldActive = false;
} else {
shieldEl.style.display = 'none';
}
spawn();
// Draw Player
ctx.shadowBlur = shieldActive ? 15 : 0;
ctx.shadowColor = "gold";
ctx.fillStyle = shieldActive ? "gold" : "#2196f3";
ctx.beginPath();
ctx.arc(player.x, player.y, player.size, 0, Math.PI * 2);
ctx.fill();
ctx.shadowBlur = 0;
// Power-ups
for (let i = powerups.length - 1; i >= 0; i--) {
let p = powerups[i];
p.y += p.speed;
ctx.fillStyle = "#4caf50";
ctx.beginPath();
ctx.arc(p.x, p.y, 10, 0, Math.PI * 2);
ctx.fill();
let dist = Math.hypot(player.x - p.x, player.y - p.y);
if (dist < player.size + 10) {
shieldActive = true;
shieldTime = 300; // ~5 seconds
powerups.splice(i, 1);
}
}
// Obstacles
for (let i = obstacles.length - 1; i >= 0; i--) {
let o = obstacles[i];
o.y += o.speed;
o.rotation += o.rotSpeed;
ctx.save();
ctx.translate(o.x + o.w / 2, o.y + o.h / 2);
ctx.rotate(o.rotation);
ctx.fillStyle = o.type === 'giant' ? "#212121" : `hsl(${200 + (level * 15)}, 70%, 50%)`;
ctx.fillRect(-o.w / 2, -o.h / 2, o.w, o.h);
ctx.restore();
// Collision (approximate for rotation)
let dx = player.x - (o.x + o.w / 2);
let dy = player.y - (o.y + o.h / 2);
let distance = Math.sqrt(dx * dx + dy * dy);
let hitBox = o.type === 'giant' ? 60 : 20;
if (!shieldActive && distance < hitBox) {
endGame();
}
if (o.y > canvas.height + 100) obstacles.splice(i, 1);
}
requestAnimationFrame(update);
}
function endGame() {
gameOver = true;
if (Math.floor(score) > savedBest) localStorage.setItem('dodgeHighScore', Math.floor(score));
alert(`Boom! Game Over.\nScore: ${Math.floor(score)}`);
location.reload();
}
update();
</script>
</body>
</html>Editor is loading...
Leave a Comment