上一篇
html小游戏切木头
- 行业动态
- 2025-05-10
- 6
HTML小游戏《切木头》模拟切木动作,逼真物理反馈,动态音效加持,考验玩家手眼协调与精准操作技巧
技术栈与工具
- HTML5 Canvas:绘制游戏画面(木头、背景、特效)
- CSS:控制Canvas尺寸与页面布局
- JavaScript:实现游戏逻辑(事件监听、动画、碰撞检测)
- 可选工具:
requestAnimationFrame
(流畅动画)、Math.random()
(随机位置)
实现步骤
创建基础结构
<canvas id="gameCanvas" width="400" height="600" style="border:1px solid #ccc"></canvas> <div id="score">分数:0</div>
初始化Canvas与变量
const canvas = document.getElementById('gameCanvas'); const ctx = canvas.getContext('2d'); let score = 0; let wood = { x: 150, y: 500, width: 100, height: 30 }; // 木头初始位置与尺寸
绘制木头与背景
function drawWood() { ctx.fillStyle = '#8B4513'; // 棕色木头 ctx.fillRect(wood.x, wood.y, wood.width, wood.height); } function updateBackground() { ctx.fillStyle = '#F0EAD6'; // 浅色背景 ctx.fillRect(0, 0, canvas.width, canvas.height); }
监听点击事件
canvas.addEventListener('click', (e) => { const rect = canvas.getBoundingClientRect(); const mouseX = e.clientX rect.left; const mouseY = e.clientY rect.top; if (mouseX > wood.x && mouseX < wood.x + wood.width && mouseY > wood.y && mouseY < wood.y + wood.height) { score += 10; document.getElementById('score').textContent = `分数:${score}`; // 触发切割动画(如木头缩小或消失) wood.y -= 50; // 木头上升模拟切割 } });
动态刷新画面
function gameLoop() { updateBackground(); drawWood(); requestAnimationFrame(gameLoop); // 循环调用实现动画 } gameLoop();
代码结构表
模块 | 功能描述 | 关键代码片段 |
---|---|---|
Canvas初始化 | 获取画布与上下文 | const canvas = ... |
绘制木头 | 使用fillRect 绘制棕色矩形 | ctx.fillStyle = '#8B4513' |
事件监听 | 检测点击是否在木头范围内 | if (mouseX > wood.x && ...) |
动画循环 | 持续刷新画面与更新木头位置 | requestAnimationFrame(gameLoop) |
分数统计 | 点击命中后增加分数 | score += 10 |
优化建议
- 增加难度:使用
setInterval
定期提升木头上升速度。 - 视觉效果:添加切割音效(
Audio
对象)或粒子特效(ctx.arc
绘制木屑)。 - 移动端适配:将点击事件改为
touchstart
,兼容手机操作。
相关问题与解答
问题1:如何判断点击位置是否在木头上?
解答:
通过获取点击坐标(mouseX
, mouseY
),判断其是否在木头的矩形范围内。
if (mouseX > wood.x && mouseX < wood.x + wood.width && mouseY > wood.y && mouseY < wood.y + wood.height) { // 命中逻辑 }
问题2:如何让木头自动上升并循环生成?
解答:
使用requestAnimationFrame
在每一帧中增加木头的y
值,当木头移出屏幕后,重置其位置到底部。
function gameLoop() { wood.y -= 2; // 每帧上升2像素 if (wood.y < -wood.height) { wood.y = canvas.height; // 重置到底部 score += 5; // 未切割的木头扣分或加分 } updateBackground(); drawWood(); requestAnimationFrame(gameLoop);