HTML5 + CSS3 + JavaScript 实现高木同学圣诞树 GalGame 完整开发指南
《擅长捉弄的高木同学》(Teasing Master Takagi-san)是一部受欢迎的动漫,高木同学以调皮可爱著称。本教程将指导你使用纯前端技术(HTML5、CSS3、JavaScript)实现一个简单的 GalGame(视觉小说游戏),主题为“高木同学与圣诞树”。游戏场景:玩家在圣诞树下与高木同学互动,通过对话和选择推进剧情,最终解锁不同结局(如浪漫告白或搞笑结局)。
项目概述:
- 功能:背景音乐、角色动画、对白显示、玩家选择分支、多个结局。
- 难度:入门级,适合初学者。
- 所需工具:代码编辑器(如 VS Code)、现代浏览器(Chrome/Firefox)。
- 预览效果:圣诞树闪烁,高木同学出现,对话框弹出,玩家点击选择。
- 时间估算:1-2 小时完成基础版。
我们将分步构建:HTML 结构 → CSS 样式 → JavaScript 逻辑。最后提供完整代码和扩展建议。
步骤 1: 准备项目文件
- 创建文件夹
takagi-christmas-galgame。 - 在文件夹中创建三个文件:
index.html、style.css、script.js。 - 下载资源(可选,自行准备或用占位符):
- 高木同学图片(e.g.,
takagi.png)。 - 圣诞树背景(e.g.,
christmas-tree-bg.jpg)。 - 背景音乐(e.g.,
bgm.mp3)。
步骤 2: HTML 结构(基础布局)
HTML 负责页面骨架:包括游戏容器、对白框、选择按钮、音频元素。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>高木同学圣诞树 GalGame</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="game-container">
<!-- 背景圣诞树 -->
<div class="christmas-tree"></div>
<!-- 高木同学角色 -->
<img src="takagi.png" alt="高木同学" class="character" id="takagi">
<!-- 对白框 -->
<div class="dialog-box" id="dialog">
<p id="dialog-text">欢迎来到圣诞树下!我是高木同学~</p>
</div>
<!-- 选择按钮容器 -->
<div class="choices" id="choices"></div>
</div>
<!-- 背景音乐 -->
<audio id="bgm" src="bgm.mp3" loop></audio>
<script src="script.js"></script>
</body>
</html>
- 解释:
.game-container:包裹整个游戏区域。.christmas-tree:用 CSS 动画模拟闪烁圣诞树。.character:角色图片,支持动画。.dialog-box:显示对白。.choices:动态生成选择按钮。<audio>:HTML5 音频元素,用于 BGM。
步骤 3: CSS 样式(视觉效果)
CSS 负责美化:背景、动画、布局。使用 CSS3 动画让圣诞树闪烁,角色淡入。
body {
margin: 0;
padding: 0;
background: #000; /* 深色背景突出圣诞氛围 */
font-family: 'Arial', sans-serif;
color: #fff;
overflow: hidden;
}
.game-container {
position: relative;
width: 100vw;
height: 100vh;
background: url('christmas-tree-bg.jpg') no-repeat center/cover; /* 圣诞树背景图 */
}
/* 圣诞树闪烁动画 */
.christmas-tree {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 255, 0, 0.2); /* 绿色叠加层 */
animation: twinkle 2s infinite alternate;
}
@keyframes twinkle {
0% { opacity: 0.5; }
100% { opacity: 1; }
}
/* 高木同学角色 */
.character {
position: absolute;
bottom: 10%;
right: 10%;
width: 300px;
animation: fadeIn 1s ease-in;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(50px); }
to { opacity: 1; transform: translateY(0); }
}
/* 对白框 */
.dialog-box {
position: absolute;
bottom: 20%;
left: 10%;
width: 70%;
background: rgba(0, 0, 0, 0.7);
padding: 20px;
border-radius: 10px;
text-align: center;
font-size: 1.2em;
}
/* 选择按钮 */
.choices {
position: absolute;
bottom: 5%;
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
gap: 10px;
}
.choice-btn {
background: #ff0000; /* 圣诞红 */
color: #fff;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 1em;
}
.choice-btn:hover {
background: #cc0000;
}
- 解释:
- 使用
position: absolute定位元素,实现叠加效果。 @keyframes创建动画:twinkle让树闪烁,fadeIn让角色渐现。- 响应式:用
vw/vh单位适应屏幕。 - 如果没有背景图,用纯 CSS 画圣诞树(三角形 + 星星)扩展。
步骤 4: JavaScript 逻辑(交互与剧情)
JS 负责游戏核心:剧情数据、对话推进、选择处理、音乐播放。使用数组存储剧情节点,支持分支。
// 剧情数据(简单脚本,节点格式:{text: '对白', choices: [{text: '选项', next: 节点ID}], next: 默认下一节点}
const story = [
{ id: 0, text: '高木同学:圣诞快乐!你要和我一起装饰圣诞树吗?', choices: [
{ text: '当然!(浪漫路线)', next: 1 },
{ text: '不了,我要捉弄你!(搞笑路线)', next: 2 }
]},
{ id: 1, text: '高木同学:太好了!我们来挂星星吧~(浪漫结局)', choices: [], end: '浪漫结局:高木同学开心笑了!' },
{ id: 2, text: '高木同学:哈哈,你上当了!树上已经有礼物了~(搞笑结局)', choices: [], end: '搞笑结局:你被高木捉弄了!' }
];
let currentNode = 0; // 当前剧情节点
// DOM 元素
const dialogText = document.getElementById('dialog-text');
const choicesContainer = document.getElementById('choices');
const bgm = document.getElementById('bgm');
// 初始化游戏
function initGame() {
bgm.play(); // 播放背景音乐
loadNode(currentNode);
}
// 加载剧情节点
function loadNode(nodeId) {
const node = story.find(n => n.id === nodeId);
if (!node) return;
dialogText.textContent = node.text;
choicesContainer.innerHTML = ''; // 清空选项
if (node.choices.length > 0) {
node.choices.forEach(choice => {
const btn = document.createElement('button');
btn.classList.add('choice-btn');
btn.textContent = choice.text;
btn.onclick = () => {
currentNode = choice.next;
loadNode(currentNode);
};
choicesContainer.appendChild(btn);
});
} else if (node.end) {
alert(node.end); // 结局弹窗
// 可扩展:重玩按钮
}
}
// 启动游戏
window.onload = initGame;
- 解释:
story数组:定义剧情树,支持无限扩展(添加更多节点、图片切换)。loadNode:更新对白和选项,处理点击事件。- 事件:
onclick实现分支选择。 - 音频:HTML5
<audio>+play()方法。 - 扩展:添加角色表情变化(换
src属性)、音效。
步骤 5: 测试与运行
- 在浏览器打开
index.html。 - 检查:背景音乐播放、树闪烁、角色出现、对白显示、点击选项切换剧情。
- 调试:用浏览器控制台(F12)查看错误。
- 常见问题:
- 图片/音乐不加载:检查路径,确保文件存在。
- 跨域问题:用本地服务器(如 VS Code Live Server)运行。
- 兼容性:现代浏览器支持良好。
完整代码预览与扩展
以上代码即可运行基础版。完整项目可上传 GitHub 或扩展:
- 高级功能:添加保存进度(localStorage)、多角色、多背景切换、粒子效果(Canvas API 画雪花)。
- 性能优化:用 CSS3 过渡平滑动画,避免 JS 过多 DOM 操作。
- 部署:上传到 GitHub Pages 或 Vercel 免费托管。
- 学习资源:MDN Web Docs(HTML/CSS/JS)、Canvas API 教程。
这个 GalGame 展示了前端三剑客的强大!如果想添加更多剧情或具体代码修改,欢迎提供反馈。享受开发过程吧~ 🎄