🎮 游戏开发入门
第 1-2 关
👾

C++ 游戏开发

事件处理与单位控制

🔔 Spawn 事件
📝 行为逻辑
🐣

什么是 "Spawn" 事件?

在游戏开发中,我们不需要每时每刻都盯着单位。

我们只需要告诉系统:"当这个单位出生(Spawn)时,它应该做什么。"

"Spawn" = 生成 / 出生 / 登场

这就像给演员剧本:只有当聚光灯亮起(事件发生),演员才开始表演(执行代码)。

✨🤖✨

Spawn!

🔗

绑定事件处理器

我们需要将单位事件行为函数绑定在一起。

// 1. 定义行为函数 (剧本) void soldierLogic() { // ... 士兵要做的事 ... } int main() { // 2. 绑定事件 // 当 soldier 触发 "spawn" 时,运行 soldierLogic soldier.on("spawn", soldierLogic); return 0; }
soldier (单位)
⬇️ .on()
"spawn" (事件)
⬇️ 触发
soldierLogic (函数)
🛡️

Level 1: 守卫的职责

任务: 创建一个士兵,并给他下达防守指令。

如果看到敌人就攻击,否则回到防守点。

auto soldier = game.spawnXY("soldier", 42, 48); void soldierLogic() { while(true) { auto enemy = soldier.findNearestEnemy(); if(enemy) { soldier.attack(enemy); } else { soldier.moveXY(42, 48); } } } int main() { soldier.on("spawn", soldierLogic); return 0; }
👮‍♂️
👀 侦查...
⚔️ / 🛡️
📢

批量控制: setActionFor

如果你有一支军队,一个一个设置 .on() 太麻烦了。

setActionFor 就像广播命令:
"所有这类单位,都听这个指令!"

game.setActionFor("类型", "事件", 函数)

这需要一个更通用的函数,能处理任何单位,而不仅仅是特定的 soldier 变量。

📣
🏹🏹🏹

全体弓箭手听令!

🎯

主角是谁? event.target

在通用函数中,我们不知道具体是哪个士兵在执行。

event.target 代表"触发事件的那个单位"

auto fightEnemies(auto event) { while(true) { // 谁触发了事件,friendUnit 就是谁 auto friendUnit = event.target; auto enemy = friendUnit.findNearestEnemy(); if(enemy) { friendUnit.attack(enemy); } } }
event.target
⬇️
👈 我!
⚔️

Level 2: 军事训练 2

任务: 创建士兵和弓箭手,并统一指挥他们战斗。

auto fightEnemies(auto event) { while(true) { auto unit = event.target; // 获取当前单位 auto enemy = unit.findNearestEnemy(); if(enemy) { unit.attack(enemy); } } } int main() { // 生成单位... game.spawnXY("soldier", 35, 20); game.spawnXY("archer", 35, 10); // 批量设置行为 game.setActionFor("soldier", "spawn", fightEnemies); game.setActionFor("archer", "spawn", fightEnemies); return 0; }
👮‍♂️
Soldier
🏹
Archer
都使用 fightEnemies 逻辑
💾

开发日志总结

  • 🔔 Event (事件)
    游戏中的触发信号,如 "spawn" (出生)。
  • 🔗 .on()
    为单个单位绑定事件处理器。
  • 📢 game.setActionFor()
    为某种类型的所有单位批量绑定事件。
  • 🎯 event.target
    在通用函数中引用当前执行的单位。
🏆