方形规则 (The Square Rule)
战术思路分析:每帧决策
我们需要实现一个“石头剪刀布”式的战斗逻辑。这次不用 `while True`,而是使用全新的 **`update` 事件**。
Update 事件 vs While True
`unit.on("update", fn)`:该函数每秒运行约 30 次(每帧),这比 `while True` 更加精确和高效。
双重逻辑:攻击或移动
`if shouldAttack(...): attack() else: move()`。单位需要不断检查是否应该攻击它的“克星”,否则就向边界移动(最终销毁,避免性能浪费)。
Game Loop: game.on("update")
Unit Logic: unit.on("update")
Python 程序解法
大家伙 (Big Guy)
战术思路分析:遇强则强
英雄是一个巨人,当他受伤越重时(血量低于 1/3),他就会越愤怒,变得更强大!
Update 事件的另一个用法
`player.on("update", onUpdatePlayer)`:这个事件处理器用于持续检查英雄的**内在状态**(生命值)。
关键:状态增强
判断条件:`if unit.health < unit.maxHealth / 3:`
如果满足,英雄的 `maxHealth`,`health`,`scale`,`attackDamage` 都会增加(*遇强则强*)。
IF HP < 1/3:
Scale *= 1.2
Python 程序解法
量子跃迁 (Quantum Leap)
战术思路分析:瞬移控制
我们不使用 `moveXY`,而是直接修改单位的 `pos.x` 和 `pos.y` 属性来实现**即时定位**,甚至可以瞬移围栏!
修改位置属性
- **连续移动(每帧):** `unit.pos.y += 5`
- **瞬间传送:** `unit.pos.y = 0` (当单位超出屏幕时)
- **碰撞跳跃:** `unit.pos.x += 6` (英雄碰到围栏时横向瞬移)
unit.pos.y = 0
unit.pos.x += 6
Python 程序解法
循环森林 (The Looping Forest)
战术思路分析:地图折回
食人魔逃跑时可能会跑出地图。我们需要实现一个 **地图折回(Wraparound)** 机制:单位跑到一边,就从对面的另一边出现。
四向传送逻辑
对 X 和 Y 坐标都需要进行检查和重置。
- `if unit.pos.x < 10`: `unit.pos.x = 68` (左边 → 传送到右边)
- `if unit.pos.y > 58`: `unit.pos.y = 12` (顶边 → 传送到底边)
IF X < 10: X = 68
IF Y > 58: Y = 12
Python 程序解法
平稳移动 (Smooth Moving)
战术思路分析:米每帧
要让物体平滑移动,需要在每帧(`update`)中只移动一个非常小的距离。
关键公式:位置 + (速度 * 方向)
`unit.pos.y += fenceSpeed * unit.dir`
其中 `fenceSpeed` 是一个小数(米/帧),`unit.dir` 是 `1` 或 `-1`(方向)。当物体碰到边界时,将 `unit.dir *= -1` 来实现方向反转。
pos.y += speed * dir
IF Boundary: dir *= -1
Python 程序解法
发狂的宝石 (Crazy Gems)
战术思路分析:台球运动
宝石会像台球一样在地图上反弹。我们需要分别管理 X 轴和 Y 轴的运动。
X/Y 独立控制
1. **计算位移:** `diffX = item.dirX * gemSpeed`
2. **更新位置:** `item.pos.x += diffX`
3. **边界反弹:** 当 X 坐标超出边界时,`item.dirX *= -1`
对 Y 轴进行完全相同的处理。
X-Axis AND Y-Axis
Independent Bounce
Python 程序解法
跑酷第1步:环境 (Runner Environment)
战术思路分析:制作无尽地图
要制作无尽跑酷游戏,玩家不动,但**整个世界都在向后移动**。
关键:背景折回
1. **背景移动:** 每帧 `thing.pos.x -= 0.8`。
2. **背景重生:** 当森林图块移出左边界 (`pos.x < -4`) 时,将其传送到右边界 (`pos.x = 84`),形成无缝循环。
3. **障碍物销毁:** 围栏移出边界后直接 `thing.destroy()`,等待重生。
IF X < -4: X = 84
Python 程序解法
跑酷步骤2:得分 (Runner Scoring)
战术思路分析:动态计分
分数系统由两部分组成:**生存时间** 和 **收集宝石**。
关键:`event.deltaTime`
在 `onUpdateGame(event)` 中,使用 `game.score += event.deltaTime` 可以确保分数根据游戏流逝的**实际时间**准确增加,而不是每帧固定增加。
Score += event.deltaTime
Gem Collect: Score += 5
Python 程序解法
跑酷步骤3:敌人 (Runner Enemies)
战术思路分析:追逐与引诱
玩家不能停下,但敌人会追上来。玩家必须将敌人**引诱**到移动的围栏上,才能消灭它们。
关键:锁定位置 (`unit.baseX`)
敌人追击玩家,但不能跑得太靠前。我们使用自定义属性 `unit.baseX` 来跟踪敌人应有的 X 轴位置,然后每帧让它向玩家靠近一点:
`unit.baseX += 0.1`,并确保 `unit.pos.x = unit.baseX`。
Ogre.X += 0.1
Goal X: Player.BaseX - 2
Python 程序解法
跑酷步骤4:平衡 (Runner Balance)
战术思路分析:参数调优
游戏功能已完成,现在进入最后的**平衡阶段**。所有影响难度的数值都被抽象为顶部的**常量**(大写字母)。
通过常量控制难度
例如:`GAME_SPEED = 0.6`,`OGRE_SPEED_INC = 0.1`。调整这些常量可以改变玩家和世界的相对速度、得分奖励和生成频率,从而找到游戏的最佳挑战点。
CONSTANTS at Top
Clean Global Control
Python 程序解法
游戏开发3最终的项目 (Final Project)
项目分析:整合与创意
这是你自己的舞台!学生应运用所有学过的概念(函数、事件、`and`/`or`/`not`、`break`/`continue`、`pos.x`修改、状态检查)来创建一个独特的游戏体验。
- **挑战:** 创造一个独特的目标或机制(例如:一个只有在夜晚才出现的 Boss,一个只有用特定顺序才能收集的物品)。
- **目标:** 代码的清晰度和创造力是评估的重点。
GO BUILD YOUR GAME!