上一篇
html小鸟游戏源码
- 行业动态
- 2025-05-10
- 7
基于HTML/CSS/JS开发的轻量级小鸟飞行游戏源码,包含重力模拟、障碍物生成、碰撞检测等核心功能,适合前端学习
游戏结构分析
游戏基于HTML5 Canvas实现,核心文件包含:
- HTML:定义画布容器
- CSS:设置画布尺寸和页面样式
- JavaScript:实现游戏逻辑
核心元素说明表
元素类型 | 说明 | 代码示例 |
---|---|---|
HTML | 创建游戏画布 | <canvas id="gameCanvas"></canvas> |
CSS | 设置画布尺寸和位置 | #gameCanvas { width: 400px; height: 600px; } |
JavaScript | 获取画布上下文 | const ctx = canvas.getContext('2d') |
核心对象 | 存储小鸟和障碍物数据 | const bird = {x: 50, y: 200, vy: 0} |
核心逻辑解析
重力与飞行控制
// 重力加速度 const gravity = 0.3; // 小鸟垂直速度 bird.vy += gravity; // 更新垂直位置 bird.y += bird.vy;
障碍物生成机制
// 每150帧生成新障碍物 if(frameCount % 150 === 0){ obstacles.push(new Obstacle()); } // 障碍物移动速度 obstacles.forEach(obs => obs.x -= 5);
碰撞检测原理
// 检测碰撞条件 function checkCollision(){ const birdRect = { top: bird.y, bottom: bird.y + 20, left: bird.x, right: bird.x + 20 }; obstacles.forEach(obs => { if(birdRect.right > obs.x && birdRect.left < obs.x + obs.width && birdRect.bottom > obs.y && birdRect.top < obs.y + obs.height){ gameOver(); } }); }
动画与渲染机制
动画方法 | 作用 | 实现方式 |
---|---|---|
requestAnimationFrame | 平滑动画循环 | requestAnimationFrame(gameLoop) |
帧率控制 | 保持60FPS稳定运行 | frameCount++ |
双缓冲技术 | 防止画面闪烁 | ctx.clearRect(0,0,canvas.width,canvas.height) |
事件处理系统
// 点击事件监听 canvas.addEventListener('click', () => { // 重置垂直速度实现上升 bird.vy = -7; }); // 键盘控制(可选扩展) window.addEventListener('keydown', e => { if(e.code === 'Space'){ bird.vy = -7; } });
得分系统设计
// 计分规则 function calculateScore(){ const passedObstacles = obstacles.filter(obs => obs.x + obs.width < 0); score = passedObstacles.length; } // 显示得分 function renderScore(){ ctx.fillText(`Score: ${score}`, 20, 30); }
常见问题与解答
Q1:如何调整游戏难度?
A1:可通过修改以下参数:
- 重力值(
gravity
)越大下落越快 - 障碍物生成间隔(
frameCount % 150
中的数值) - 障碍物移动速度(
obs.x -= 5
中的速度值) - 小鸟上升力度(
bird.vy = -7
中的数值)
Q2:为什么使用requestAnimationFrame而不是setInterval?
A2:主要优势对比:
| 特性 | setInterval | requestAnimationFrame |
|———————|——————————–|——————————-|
| 时间精度 | 固定时间间隔执行 | 浏览器同步刷新率执行 |
| 性能表现 | 强制执行可能影响性能 | 浏览器优化渲染时机 |
| 动画流畅度 | 可能出现丢帧 | 与显示器刷新率同步 |
| 节能效果 | 持续执行消耗资源 | 页面不可见时