|
<!DOCTYPE html> |
|
<html lang="en"> |
|
<head> |
|
<meta charset="UTF-8"> |
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
<title>Mario-like Platform Game</title> |
|
<script src="https://cdn.tailwindcss.com"></script> |
|
<style> |
|
|
|
#game-container { |
|
position: relative; |
|
width: 800px; |
|
height: 500px; |
|
background: linear-gradient(to bottom, #87CEEB 50%, #228B22 50%); |
|
overflow: hidden; |
|
border: 4px solid #333; |
|
border-radius: 8px; |
|
box-shadow: 0 0 20px rgba(0, 0, 0, 0.3); |
|
} |
|
|
|
#player { |
|
position: absolute; |
|
width: 50px; |
|
height: 50px; |
|
background-color: #FF0000; |
|
border-radius: 50%; |
|
border: 2px solid #000; |
|
z-index: 10; |
|
transition: transform 0.1s; |
|
} |
|
|
|
.platform { |
|
position: absolute; |
|
background-color: #8B4513; |
|
border: 2px solid #5D2906; |
|
border-radius: 5px; |
|
z-index: 5; |
|
} |
|
|
|
.coin { |
|
position: absolute; |
|
width: 20px; |
|
height: 20px; |
|
background-color: #FFD700; |
|
border-radius: 50%; |
|
border: 2px solid #DAA520; |
|
z-index: 8; |
|
animation: spin 2s linear infinite; |
|
} |
|
|
|
@keyframes spin { |
|
0% { transform: rotateY(0deg); } |
|
100% { transform: rotateY(360deg); } |
|
} |
|
|
|
.cloud { |
|
position: absolute; |
|
background-color: white; |
|
border-radius: 50%; |
|
opacity: 0.8; |
|
} |
|
|
|
#score-display { |
|
position: absolute; |
|
top: 10px; |
|
right: 10px; |
|
background-color: rgba(255, 255, 255, 0.7); |
|
padding: 5px 10px; |
|
border-radius: 5px; |
|
font-weight: bold; |
|
z-index: 20; |
|
} |
|
|
|
#game-over { |
|
position: absolute; |
|
top: 0; |
|
left: 0; |
|
width: 100%; |
|
height: 100%; |
|
background-color: rgba(0, 0, 0, 0.7); |
|
display: flex; |
|
flex-direction: column; |
|
justify-content: center; |
|
align-items: center; |
|
color: white; |
|
font-size: 24px; |
|
z-index: 30; |
|
display: none; |
|
} |
|
</style> |
|
</head> |
|
<body class="bg-gray-100 flex flex-col items-center justify-center min-h-screen"> |
|
<h1 class="text-4xl font-bold mb-4 text-red-600">Super Adventure Game</h1> |
|
|
|
<div id="game-container" class="relative"> |
|
<div id="score-display">Score: <span id="score">0</span></div> |
|
|
|
<div id="player"></div> |
|
|
|
<div id="game-over"> |
|
<h2 class="text-3xl font-bold mb-4">Game Over!</h2> |
|
<p class="mb-6">Final Score: <span id="final-score">0</span></p> |
|
<button id="restart-btn" class="bg-green-500 hover:bg-green-600 text-white font-bold py-2 px-4 rounded"> |
|
Play Again |
|
</button> |
|
</div> |
|
</div> |
|
|
|
<div class="mt-6 flex space-x-4"> |
|
<button id="left-btn" class="bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded"> |
|
← Left |
|
</button> |
|
<button id="right-btn" class="bg-blue-500 hover:bg-blue-600 text-white font-bold py-2 px-4 rounded"> |
|
Right → |
|
</button> |
|
<button id="jump-btn" class="bg-green-500 hover:bg-green-600 text-white font-bold py-2 px-4 rounded"> |
|
Jump ↑ |
|
</button> |
|
</div> |
|
|
|
<p class="mt-4 text-gray-600">Use buttons or arrow keys to move and jump</p> |
|
|
|
<script> |
|
document.addEventListener('DOMContentLoaded', () => { |
|
|
|
const gameContainer = document.getElementById('game-container'); |
|
const player = document.getElementById('player'); |
|
const scoreDisplay = document.getElementById('score'); |
|
const finalScoreDisplay = document.getElementById('final-score'); |
|
const gameOverScreen = document.getElementById('game-over'); |
|
const restartBtn = document.getElementById('restart-btn'); |
|
|
|
|
|
const leftBtn = document.getElementById('left-btn'); |
|
const rightBtn = document.getElementById('right-btn'); |
|
const jumpBtn = document.getElementById('jump-btn'); |
|
|
|
|
|
let score = 0; |
|
let isJumping = false; |
|
let isGameOver = false; |
|
let playerX = 100; |
|
let playerY = 400; |
|
let velocityY = 0; |
|
let gravity = 0.5; |
|
let moveSpeed = 5; |
|
let jumpForce = -12; |
|
let platforms = []; |
|
let coins = []; |
|
let clouds = []; |
|
|
|
|
|
initGame(); |
|
|
|
function initGame() { |
|
|
|
score = 0; |
|
isJumping = false; |
|
isGameOver = false; |
|
playerX = 100; |
|
playerY = 400; |
|
velocityY = 0; |
|
scoreDisplay.textContent = score; |
|
gameOverScreen.style.display = 'none'; |
|
|
|
|
|
document.querySelectorAll('.platform').forEach(el => el.remove()); |
|
document.querySelectorAll('.coin').forEach(el => el.remove()); |
|
document.querySelectorAll('.cloud').forEach(el => el.remove()); |
|
|
|
platforms = []; |
|
coins = []; |
|
clouds = []; |
|
|
|
|
|
createPlatform(0, 450, 800, 50); |
|
|
|
|
|
createPlatform(100, 350, 150, 20); |
|
createPlatform(300, 300, 150, 20); |
|
createPlatform(500, 250, 150, 20); |
|
createPlatform(200, 200, 150, 20); |
|
createPlatform(400, 150, 150, 20); |
|
createPlatform(600, 100, 150, 20); |
|
|
|
|
|
createCoin(150, 320); |
|
createCoin(350, 270); |
|
createCoin(550, 220); |
|
createCoin(250, 170); |
|
createCoin(450, 120); |
|
createCoin(650, 70); |
|
|
|
|
|
createCloud(100, 50, 60, 30); |
|
createCloud(300, 30, 80, 40); |
|
createCloud(500, 60, 70, 35); |
|
createCloud(700, 40, 90, 45); |
|
|
|
|
|
updatePlayerPosition(); |
|
|
|
|
|
requestAnimationFrame(gameLoop); |
|
} |
|
|
|
function createPlatform(x, y, width, height) { |
|
const platform = document.createElement('div'); |
|
platform.className = 'platform'; |
|
platform.style.left = `${x}px`; |
|
platform.style.top = `${y}px`; |
|
platform.style.width = `${width}px`; |
|
platform.style.height = `${height}px`; |
|
gameContainer.appendChild(platform); |
|
|
|
platforms.push({ |
|
x, y, width, height, element: platform |
|
}); |
|
} |
|
|
|
function createCoin(x, y) { |
|
const coin = document.createElement('div'); |
|
coin.className = 'coin'; |
|
coin.style.left = `${x}px`; |
|
coin.style.top = `${y}px`; |
|
gameContainer.appendChild(coin); |
|
|
|
coins.push({ |
|
x, y, collected: false, element: coin |
|
}); |
|
} |
|
|
|
function createCloud(x, y, width, height) { |
|
const cloud = document.createElement('div'); |
|
cloud.className = 'cloud'; |
|
cloud.style.left = `${x}px`; |
|
cloud.style.top = `${y}px`; |
|
cloud.style.width = `${width}px`; |
|
cloud.style.height = `${height}px`; |
|
gameContainer.appendChild(cloud); |
|
|
|
clouds.push({ |
|
x, y, width, height, element: cloud |
|
}); |
|
} |
|
|
|
function updatePlayerPosition() { |
|
player.style.left = `${playerX}px`; |
|
player.style.top = `${playerY}px`; |
|
} |
|
|
|
function checkCollision() { |
|
|
|
let onPlatform = false; |
|
|
|
for (const platform of platforms) { |
|
if ( |
|
playerX + 50 > platform.x && |
|
playerX < platform.x + platform.width && |
|
playerY + 50 >= platform.y && |
|
playerY + 50 <= platform.y + 20 && |
|
velocityY >= 0 |
|
) { |
|
onPlatform = true; |
|
playerY = platform.y - 50; |
|
velocityY = 0; |
|
isJumping = false; |
|
} |
|
} |
|
|
|
|
|
if (!onPlatform) { |
|
velocityY += gravity; |
|
isJumping = true; |
|
} |
|
|
|
|
|
for (const coin of coins) { |
|
if (!coin.collected && |
|
playerX + 50 > coin.x && |
|
playerX < coin.x + 20 && |
|
playerY + 50 > coin.y && |
|
playerY < coin.y + 20) { |
|
coin.collected = true; |
|
coin.element.style.display = 'none'; |
|
score += 10; |
|
scoreDisplay.textContent = score; |
|
} |
|
} |
|
|
|
|
|
if (playerY > gameContainer.clientHeight) { |
|
gameOver(); |
|
} |
|
} |
|
|
|
function gameLoop() { |
|
if (isGameOver) return; |
|
|
|
|
|
playerY += velocityY; |
|
|
|
|
|
updatePlayerPosition(); |
|
|
|
|
|
checkCollision(); |
|
|
|
|
|
for (const cloud of clouds) { |
|
cloud.x -= 0.2; |
|
if (cloud.x + cloud.width < 0) { |
|
cloud.x = gameContainer.clientWidth; |
|
} |
|
cloud.element.style.left = `${cloud.x}px`; |
|
} |
|
|
|
requestAnimationFrame(gameLoop); |
|
} |
|
|
|
function gameOver() { |
|
isGameOver = true; |
|
finalScoreDisplay.textContent = score; |
|
gameOverScreen.style.display = 'flex'; |
|
} |
|
|
|
|
|
leftBtn.addEventListener('mousedown', () => { |
|
if (!isGameOver) playerX -= moveSpeed; |
|
if (playerX < 0) playerX = 0; |
|
updatePlayerPosition(); |
|
}); |
|
|
|
rightBtn.addEventListener('mousedown', () => { |
|
if (!isGameOver) playerX += moveSpeed; |
|
if (playerX > gameContainer.clientWidth - 50) playerX = gameContainer.clientWidth - 50; |
|
updatePlayerPosition(); |
|
}); |
|
|
|
jumpBtn.addEventListener('click', () => { |
|
if (!isJumping && !isGameOver) { |
|
velocityY = jumpForce; |
|
isJumping = true; |
|
} |
|
}); |
|
|
|
|
|
document.addEventListener('keydown', (e) => { |
|
if (isGameOver) return; |
|
|
|
switch (e.key) { |
|
case 'ArrowLeft': |
|
playerX -= moveSpeed; |
|
if (playerX < 0) playerX = 0; |
|
break; |
|
case 'ArrowRight': |
|
playerX += moveSpeed; |
|
if (playerX > gameContainer.clientWidth - 50) playerX = gameContainer.clientWidth - 50; |
|
break; |
|
case 'ArrowUp': |
|
case ' ': |
|
if (!isJumping) { |
|
velocityY = jumpForce; |
|
isJumping = true; |
|
} |
|
break; |
|
} |
|
|
|
updatePlayerPosition(); |
|
}); |
|
|
|
|
|
restartBtn.addEventListener('click', initGame); |
|
}); |
|
</script> |
|
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=Dhdb/ball-demo" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body> |
|
</html> |