GAME_DEV_3.cpp
🎮

游戏开发 3:终极指南

Game Development 3 · C++ Edition

🔴 事件驱动 · 函数 · 条件 · 循环
🔵 变量 · 对象属性 · 数据持久化
🟡 坐标系 · 运动 · 碰撞检测
🟢 游戏循环 · 随机数 · 平衡设计
共10个关卡 + 1个创意项目 · 按 ← → 翻页
🔔

关卡1:方形规则

update事件
Logic
核心概念:"update"事件 — 每帧触发一次(约30次/秒),替代 while-true 循环!

石头剪刀布:每种单位只攻击特定类型的敌人。

// 判断 who 是否应该攻击 target auto shouldAttack(auto who, auto target) { if (who.type == "scout" && target.type == "soldier") { return true; } if (who.type == "soldier" && target.type == "thrower") { return true; } // ... thrower→archer, archer→scout }
克制链 🔄
🏃 scout
⚔️ soldier
🏹 archer
💣 thrower
每种单位只攻击自己克制的类型
遇到其他敌人?→ 反方向撤退!
🔔

关卡1:update事件处理

事件绑定
Logic

单位的update处理器:每帧检查并行动。

auto onUpdateUnit(auto event) { auto unit = event.target; auto enemy = unit.findNearestEnemy(); if (enemy && shouldAttack(unit, enemy)) { unit.attack(enemy); } else { // 没有合适目标就反向移动 if (unit.team == "ogres") { unit.moveXY(unit.pos.x - 3, unit.pos.y); } else { unit.moveXY(unit.pos.x + 3, unit.pos.y); } } // 屏幕外的单位直接销毁 if (unit.pos.x > 80 || unit.pos.x < 0) unit.destroy(); }
绑定事件:
game.setActionFor("scout", "update", onUpdateUnit);
⚡ update事件 vs while循环
❌ 旧方式
while(true) {
  checkEnemy();
}
✅ 新方式
game.setActionFor(
  "scout",
  "update",
  onUpdateUnit);
优势:
✅ 可以按需添加/移除处理器
✅ 更好的性能控制
✅ 代码更清晰
💪

关卡2:大家伙

状态追踪
Data
核心:用update事件追踪生命值,低血时触发"变身"!
auto onUpdatePlayer(auto event) { auto unit = event.target; // 生命值低于1/3时触发变身 if (unit.health < unit.maxHealth / 3) { unit.maxHealth *= 1.2; unit.health = unit.maxHealth; unit.scale *= 1.2; // 变大! unit.attackDamage *= 1.2; // 变强! unit.say("粉碎!"); } }
// 主循环中检查目标完成度 auto checkGoals() { if (player.scale >= 2) game.setGoalState(scaleGoal, true); if (game.ogresDefeated >= 5) game.setGoalState(ogreGoal, true); }
生命值变化过程
🧑
HP 满
⬇️ 受到攻击
🧑
HP < 1/3
⚡ 触发变身!
🦸
满血+变大!
×1.2 三连:maxHealth · scale · attackDamage

关卡3:量子跃迁

pos修改
Phys
核心发现:直接修改 pos.xpos.y 可以瞬间改变位置!

两种修改方式:

// 方式1:相对移动(加减) unit.pos.y -= 10; // 向下移动10 unit.pos.x += 5; // 向右移动5 // 方式2:绝对定位(直接设值) unit.pos.x = 40; // 传送到x=40
性能技巧:不销毁+重生,而是直接传送回起点!
// 食人魔移出屏幕后传送回来 if (unit.pos.x > 80) { unit.pos.x = 0; // 回到左边重来 }
点击传送!
🌲

关卡4:循环森林

折回机制
Phys
Wraparound(折回):走出左边 → 出现在右边!常用游戏技巧。
auto onUpdate(auto event) { auto unit = event.target; // 左边太远 → 传送到右边 if (unit.pos.x < 10) unit.pos.x = 68; // 右边太远 → 传送到左边 if (unit.pos.x > 70) unit.pos.x = 12; // 上下方向同理! if (unit.pos.y < 10) unit.pos.y = 56; if (unit.pos.y > 58) unit.pos.y = 12; }
同一处理器复用:玩家和食人魔都绑定 onUpdate!
player.on("update", onUpdate);
game.setActionFor("munchkin", "update", onUpdate);
🌲 森林地图 🌲
走出边界→传送!
🏃

关卡5:平稳移动

逐帧运动
Phys
平滑移动 = 每帧移动一点点
速度 × 方向 = 每帧位移量
// 移动围栏(上下弹跳) auto onUpdateFence(auto event) { auto fence = event.target; // speed × direction = 位移 float dist = fenceSpeed * fence.dir; fence.pos.y += dist; // 到达边界就反弹 if (fence.pos.y > 56 || fence.pos.y < 10) { fence.dir *= -1; // 反转方向! } }
dir 方向值:
dir = 1 → 向上/右移动
dir = -1 → 向下/左移动
dir *= -1 → 反转方向(弹跳!)
💎

关卡6:发狂的宝石

2D运动
Game
X + Y 两个方向同时移动 = 对角线!像台球一样弹跳。
auto onUpdate(auto event) { auto item = event.target; // X轴和Y轴分别移动 auto diffX = item.dirX * gemSpeed; auto diffY = item.dirY * gemSpeed; item.pos.x += diffX; item.pos.y += diffY; // X方向弹跳 if (item.pos.x > 70 || item.pos.x < 10) item.dirX *= -1; // Y方向弹跳 if (item.pos.y > 58 || item.pos.y < 10) item.dirY *= -1; }
随机方向:dirX/dirY 可取 -1、0、1
0 = 该方向不动 → 纯水平/垂直运动
🌳

关卡7:跑酷·环境

步骤1/4
Game
跑酷核心技巧:玩家不动,让场景向左滚动!
// 场景向左滚动 auto onUpdateStatic(auto event) { auto thing = event.target; thing.pos.x -= 0.8; // 每帧左移 if (thing.pos.x < -4) { if (thing.type == "forest") { thing.pos.x = 84; // 森林回收重用! } else { thing.destroy(); // 围栏直接销毁 } } } // 玩家锁定X轴 player.pos.x = 20; // 只能上下移动

围栏生成:右侧随机Y位置生成,随时间增加数量。

auto spawnFences() { auto n = 1 + (game.time / 10); while (n >= 1) { spawnRandomY("fence"); n -= 1; } }
🌲🌲🌲🌲🌲🌲🌲🌲
🌲🌲🌲🌲🌲🌲🌲🌲
🏃
🚧
🚧
🏆

关卡8:跑酷·得分

步骤2/4
Game
两种得分来源:①时间存活 ②收集宝石
// 宝石得分 auto onCollect(auto event) { if (event.other.type == "gem") { game.score += 5; } } // 时间得分(在游戏循环中) game.score += event.deltaTime; // 数据持久化 - 最高分 game.topScore = db.get("topScore") || 0; if (game.score > game.topScore) { db.set("topScore", game.score); }
deltaTime:上次update到这次的时间间隔,用它计分更精确!
手动目标:存活20秒即可获胜,但可以继续挑战最高分!
SCORE: 00000
TIME: 00:00
TOP: 00950
⏱️ 存活 +deltaTime
💎 宝石 +5分
💾 db 最高分
👹

关卡9:跑酷·敌人

步骤3/4
Game
新挑战:食人魔从左边慢慢逼近,引诱它们撞围栏!
// 食人魔慢慢靠近玩家 auto onUpdateOgre(auto event) { auto unit = event.target; if (unit.health > 0) { unit.baseX += 0.1; // 缓慢靠近 if (unit.baseX > 18) unit.baseX = 18; // 最近距离 unit.pos.x = unit.baseX; } } // 食人魔被围栏击败后变成场景物体 auto onDefeatOgre(auto event) { game.score += 10; event.target.on("update", onUpdateStatic); }
策略选择:
🏃 安全躲避围栏 → 时间分
💎 冒险收宝石 → 额外分
👹 引诱食人魔撞栏 → 10分/只
食人魔追逐示意
🏃
👹
🚧
👹 缓慢逼近 🏃 只能上下躲 🚧 引诱撞栏!
baseX 属性:独立于AI行为追踪X位置
behavior = "AttacksNearest":AI控制Y轴追击
⚖️

关卡10:跑酷·平衡

步骤4/4
Design
游戏平衡:把所有"魔法数字"提取成常量,方便调试!
// 所有参数集中管理 auto GAME_SPEED = 0.6; auto PLAYER_SPEED = 20; auto OGRE_SPEED_INC = 0.1; auto PLAYER_BASE_X = 20; auto GEM_SCORE = 5; auto DEFEATED_OGRE_SCORE = 10; auto WIN_TIME = 20; auto FENCE_INTERVAL = 1; auto GEM_INTERVAL = 1; auto OGRE_INTERVAL = 2;
调参技巧:
太难?→ 降低 GAME_SPEED,增加 PLAYER_SPEED
太简单?→ 缩短间隔,加快食人魔
🎚️ 平衡参数面板
🏃 GAME_SPEED 0.6
👤 PLAYER_SPEED 20
👹 OGRE_INC 0.1
📍 PLAYER_X 20
💎 GEM_SCORE 5
💀 OGRE_SCORE 10
⏱️ WIN_TIME 20
🚧 FENCE_INT 1
💎 GEM_INT 1
👹 OGRE_INT 2
💡 设计哲学:没有"标准答案"!
实验不同数值,让游戏有趣且有挑战
好游戏 = 难度曲线恰到好处
🎨

关卡11:创意项目

自由创作
Project
🚀 是时候创建你自己的游戏了!结合所有学过的技能,发挥创造力!

你已经掌握的工具箱:

🔔 update事件 💥 collide碰撞 📦 collect收集 💀 defeat击败 📍 pos位置修改 🔄 折回传送 🏃 平滑移动 🏆 计分系统 🎯 目标设置 💾 数据持久化 🎲 随机生成 ⚖️ 参数平衡
创作建议:
1. 先确定游戏类型(跑酷/射击/收集)
2. 添加英雄和目标
3. 增加挑战(敌人/障碍/时间限制)
4. 调整平衡,让朋友测试!
5. 分享你的游戏给全世界! 🌍
🎮
你的游戏,你做主!
🏰
🚀
🐉
⚔️
🧩
🏎️
🎉

恭喜通关!知识地图

🔴 事件驱动
关卡1 update事件 替代while循环
关卡1 setActionFor 批量绑定
关卡2 状态追踪 (health/scale)
关卡8 collide/collect/defeat事件
🟡 物理与空间
关卡3 pos.x/pos.y 直接修改位置
关卡4 折回机制 (Wraparound)
关卡5 逐帧平滑移动 + dir方向
关卡6 2D运动 (dirX + dirY)
🟢 游戏设计
关卡7 场景滚动 + 对象回收
关卡8 计分系统 + 数据持久化
关卡9 AI敌人 + 策略玩法
关卡10 参数提取 + 平衡调试
🟣 C++ 代码技能
auto 自动类型推断
函数 封装可复用逻辑
条件/循环 if-else, while
对象属性 obj.prop 读写
🌟 🚀 🎮
你已经是真正的游戏开发者了!去创造属于你的世界吧!