原生js+css实现勇者生存游戏代码
代码语言:html
所属分类:游戏
代码描述:原生js+css实现勇者生存游戏代码,移动上下左键逃避围攻,存活15秒就算赢。
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JS Survivors</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Press+Start+2P&display=swap');
body {
margin: 0;
padding: 0;
background-color: #111;
overflow: hidden;
font-family: 'Press Start 2P', cursive;
user-select: none;
}
#gameCanvas {
display: block;
}
/* UI Overlays */
.overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.8);
color: white;
z-index: 10;
text-align: center;
}
.hidden { display: none !important; }
h1 { color: #ff4444; text-shadow: 4px 4px #000; font-size: 48px; margin-bottom: 20px; }
h2 { color: #ffd700; text-shadow: 2px 2px #000; margin-bottom: 30px; }
p { line-height: 1.5; font-size: 14px; color: #ccc; max-width: 600px; margin: 10px auto; }
button {
background: #444;
color: white;
border: 4px solid #fff;
padding: 15px 30px;
font-family: 'Press Start 2P', cursive;
font-size: 16px;
cursor: pointer;
margin: 10px;
transition: all 0.2s;
image-rendering: pixelated;
box-shadow: 0 6px #222;
position: relative;
top: 0;
}
button:hover { background: #666; top: -2px; box-shadow: 0 8px #222; }
button:active { top: 4px; box-shadow: 0 2px #222; }
/* HUD */
#hud {
position: absolute;
top: 0;
left: 0;
width: 100%;
pointer-events: none;
padding: 10px;
box-sizing: border-box;
z-index: 5;
}
.xp-container {
width: 100%;
height: 20px;
background: #222;
border: 2px solid #fff;
position: relative;
}
#xpBar {
height: 100%;
background: #00bfff;
width: 0%;
transition: width 0.2s;
}
#levelText {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
color: white;
font-size: 12px;
text-shadow: 1px 1px 0 #000;
}
.top-info {
display: flex;
justify-content: space-between;
margin-top: 10px;
color: white;
font-size: 16px;
text-shadow: 2px 2px 0 #000;
}
/* Level Up Menu */
#levelUpMenu {
background: rgba(20, 20, 40, 0.95);
border: 4px solid #4466ff;
padding: 20px;
border-radius: 10px;
max-width: 800px;
}
#upgradeContainer {
display: flex;
gap: 20px;
justify-content: center;
flex-wrap: wrap;
margin-top: 20px;
}
.upgrade-card {
background: #2a2a4a;
border: 3px solid #fff;
width: 200px;
padding: 15px;
cursor: pointer;
transition: transform 0.2s, background 0.2s;
display: flex;
flex-direction: column;
align-items: center;
}
.upgrade-card:hover {
transform: scale(1.05);
background: #3a3a5a;
border-color: #ffd700;
}
.upgrade-icon {
width: 64px;
height: 64px;
margin-bottom: 10px;
background-color: #000;
display: flex;
justify-content: center;
align-items: center;
border: 2px solid #666;
}
.upgrade-title { color: #ffd700; font-size: 12px; margin-bottom: 5px; }
.upgrade-type { color: #aaa; font-size: 8px; margin-bottom: 10px; }
.upgrade-desc { color: #fff; font-size: 10px; line-height: 1.4; }
.new-tag { background: #ff4444; color: white; padding: 2px 5px; font-size: 8px; position: absolute; top: 5px; right: 5px; }
/* Canvas icons generated via CSS/Canvas later */
.icon-canvas { width: 48px; height: 48px; }
</style>
</head>
<body>
<!-- CANAVS -->
<canvas id="gameCanvas"></canvas>
<!-- HUD -->
<div id="hud">
<div class="xp-container">
<div id="xpBar"></div>
<div id="levelText">LV 1</div>
</div>
<div class="top-info">
<div id="timer">00:00</div>
<div id="killCount">💀 0</div>
</div>
</div>
<!-- MENUS -->
<div id="startScreen" class="overlay">
<h1>JS SURVIVORS</h1>
<p>Survive for 15 minutes against endless hordes.</p>
<p>WASD/Arrows to move. Attacks are automatic.</p>
<button id="btnStart">START GAME</button>
<br>
<p style="font-size: 10px; color: #666;">Enable audio for best experience</p>
</div>
<div id="pauseMenu" class="overlay hidden">
<h2>PAUSED</h2>
<div id="statsContainer" style="text-align: left; margin-bottom: 20px; font-size: 10px;"></div>
<button id="btnResume">RESUME</button>
</div>
<div id="gameOverScreen" class="overlay hidden">
<h1 id="goTitle" style="color: #ff0000;">GAME OVER</h1>
<h2 id="goTime">Survived: 00:00</h2>
<p id="goKills">Enemies Defeated: 0</p>
<p id="goLevel">Level Reached: 1</p>
<button id="btnRestart">TRY AGAIN</button>
</div>
<div id="victoryScreen" class="overlay hidden">
<h1 style="color: #ffd700;">VICTORY!</h1>
<p>You survived the night.</p>
<p id="vKills">Total Kills: 0</p>
<button id="btnRestartVic">PLAY AGAIN</button>
</div>
<div id="levelUpScreen" class="overlay hidden">
<div id="levelUpMenu">
<h2 style="color:#00bfff; margin: 0;">LEVEL UP!</h2>
<p style="margin-bottom: 0;">Choose an upgrade</p>
<div id="upgradeContainer">
<!-- dynamically populated -->
</div>
</div>
</div>
<script>
/*
=========================================================================
JS SURVIVORS - ENGINE & GAME LOGIC
=========================================================================
*/
// --- COFIGURATION & CONSTANTS ---
const C = {
WIDTH: window.innerWidth,
HEIGHT: window.innerHeight,
FPS: 60,
TARGET_TIME: 15 * 60, // 15 minutes in seconds
TILE_SIZE: 128, // For grid background
COLORS: {
bg: '#1a1a20',
grid: '#252530',
player: '#3388ff',
xpInfo: '#00bfff',
hp: '#ff3333',
hpBg: '#440000',
// Enemy Tiers
e1: '#aa5555', // Bat
e2: '#55aa55', // Zombie
e3: '#6666aa', // Skeleton
e4: '#aa55aa', // Ghost
e5: '#aa8855', // Tank
// XP Gems
xp1: '#00bfff',
xp2: '#00ff00',
xp3: '#ff00ff',
// Damage Numbers
dmgWhite: '#ffffff',
dmgCrit: '#ffff00'
}
};
// Global Game State
const GS = {
canvas: document.getElementById('gameCanvas'),
ctx: document.getElementById('gameCanvas').getContext('2d', { alpha: false }),
state: 'start', // start, running, paused, levelup, gameover, victory
// Entities
player: null,
enemies: [],
projectiles: [],
gems: [],
particles: [],
damageTexts: [],
// Systems
camera: { x: 0, y: 0 },
input: { up: false, down: false, left: false, right: false },
audio: null,
// Meta
time: 0,
kills: 0,
frameCount: 0,
lastTime: 0,
dt: 0,
screenShake: 0
};
// Resize handling
function resize() {
C.WIDTH = window.innerWidth;
C.HEIGHT = window.innerHeight;
GS.canvas.width = C.WIDTH;
GS.canvas.height = C.HEIGHT;
GS.ctx.imageSmoothingEnabled = false;
}
window.addEventListener('resize', resize);
resize();
// --- MATH UTILS ---
const M = {
dist: (x1, y1, x2, y2) => Math.hypot(x2 - x1, y2 - y1),
distSq: (x1, y1, x2, y2) => (x2-x1)**2 + (y2-y1)**2,
angle: (x1, y1, x2, y2) => Math.atan2(y2 - y1, x2 - x1),
rand: (min, max) => Math.random() * (max - min) + min,
randInt: (min, max) => Math.floor(Math.random() * (max - min + 1)) + min,
clamp: (val, min, max) => Math.min(Math.max(val, min), max),
lerp: (a, b, t) => a + (b - a) * t,
// Circle-Circle Collision
collides: (a, b) => M.distSq(a.x, a.y, b.x, b.y) < (a.r + b.r)**2,
// Rectangle-Circle (for beams)
rectCircleCollides: (rect, circle) => {
let dx .........完整代码请登录后点击上方下载按钮下载查看
















网友评论0