Day 5 · 共 10 节
做出最小战斗闭环:一键攻击、命中扣血、击败敌人。冲突,让故事有代价。
承接 Day3 移动与 Day4 对话。攻击键避开 E。先单测 HP,再接命中,最后排练演示线。
店小二说竹林不太平。今天我们把「不太平」做成可玩规则:出现一个敌人,你能攻击它,它会掉血,血量归零后消失或倒下。完成定义请置顶:按攻击键命中敌人至少一次并扣血;连续攻击可击败;过程中输入不与对话严重冲突。
明确不做:华丽连招树、技能冷却 UI 墙、装备数值表、AI 行为树巡逻包抄。那些是扩展包。今天只要一键攻击闭环。贪复杂战斗,是独立游戏坟场最常见墓碑文。
导演视角:战斗是「规则表演」。玩家要立刻读懂因果——我按了,所以它掉血。读不懂因果,特效再炫也是噪声。所以我们用清晰的 Hitbox/Hurtbox 与 print/数字反馈,而不是先做粒子。
最小战斗 = 生命值 + 命中判定 + 死亡处理。三条齐了就是游戏;缺一条就只是动画表演。
承接检查:移动稳、对话可关。若对话占用同一按键,先把攻击键设为不同键(如 J 或鼠标左键),写进口令本。
把「打得到、打得死」贴在完成定义旁。任何新想法先过这两句。过不了,就不是今天的活。
战斗课最容易情绪化:打空会烦。烦的时候停手,开碰撞可见,看盒子,不要重写世界。
今日禁止清单再读一次:技能树、装备、多人联机。看见就砍需求,不要砍时间。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
写下攻击键与今日 Done。键位冲突先仲裁——没键位,就没有战斗。
敌人最小结构建议:根 CharacterBody2D(或 Node2D 静止怪)命名 Enemy → Sprite2D → CollisionShape2D(身体挡路/被推)→ Hurtbox(Area2D,专用于受伤)→ 可选 HP 标签。今天敌人可以站桩,不必追人。站桩怪更利于验收命中。
为什么单独 Hurtbox?因为「身体碰撞」和「受伤判定」常要分开调。身体可以较小防卡墙;受伤区可以略大更好打中。混在一个盒子里,手感会又卡又难受。
把敌人做成 enemy_bandit.tscn 独立场景,再拖进竹林或村外。复制第二个敌人只改数值/贴图即可。模板思维延续 Day4。
外观:AI 生成「古风山贼」小图,或用色块。占位敌人完全合格。先通规则,再换皮。
放到村口外或单独 bamboo_test.tscn 测试场也行。测试场的好处是干扰少:没有 NPC 对话抢输入。
站桩怪不是偷懒,是实验控制变量。等命中稳定,再加追逐也不迟。变量越少,真相越快。
敌人加到组 enemy,方便检测与未来群体处理。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
纸上画出敌人节点树。Hurtbox 必须单独标出——分不清挨打盒,就分不清 Bug。
给敌人脚本加 hp 与 max_hp,再加 take_damage(amount):扣血、夹紧到 0、打印剩余血量;到 0 调用 die()。视觉上可用 Label 显示数字,或改 Sprite 颜色闪一下。今天数字 print 也算合格反馈,但有 Label 更直观。
extends CharacterBody2D
@export var max_hp: int = 3
var hp: int
func _ready() -> void:
hp = max_hp
func take_damage(amount: int) -> void:
hp = max(hp - amount, 0)
print("敌人剩余 HP: ", hp)
if hp == 0:
die()
func die() -> void:
queue_free()
max_hp=3、每次伤害 1,便于手动点三下验收。数值过大难测,过小一碰就没,都不利于学习反馈。
先单独测 HP:不靠攻击,直接调用扣血。确认能打印并死亡。这样后面若「打了不掉血」,你就知道问题在命中,不在 HP。
HP 用整数即可。浮点血量今天没有收益。简单数值,换来清晰验收。
die 里先 print 再释放,避免「无声无息消失」让你怀疑是否真的死了。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
不攻击,用测试手段把敌人扣到消失。HP 模块独立通过——先证明会死,再证明打得到。
在玩家下加 Hitbox(Area2D + CollisionShape2D),默认 monitoring = false 或形状禁用。按下攻击键时,短时间开启(例如 0.15 秒),检测进入的 Hurtbox/敌人,然后关闭。这样攻击是「挥砍窗口」,不是常开电锯。
Input Map 添加 attack,绑定 J 或鼠标左键,避开 E(对话)。脚本 is_action_just_pressed("attack") 触发攻击,并加简单冷却,防止连打穿透逻辑。
Hitbox 位置应在角色朝向一侧。左右翻转时,同步翻转或偏移 Hitbox。只改 Sprite 不改 Hitbox,会出现「看着往左砍,打到右边」的鬼畜。
开启时 print「挥砍」。先证明攻击动作发生,再接伤害。分段验收继续生效。
攻击可加极短前摇(Timer),但不要超过 0.1s 学习成本。先同步命中,再追求动作感。
Hitbox 形状用矩形就够。多边形完美描边留给以后。
若使用鼠标攻击,记得游戏窗口要有焦点。编辑器焦点问题会伪装成「攻击坏了」。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
按攻击键有打印/可见 Hitbox 闪一下。窗口存在,本节过——没有窗口,就没有命中。
当攻击 Hitbox 检测到敌人 Hurtbox(或敌人 body),调用对方的 take_damage(1)。注意同一挥砍不要连续扣血十次:用「本段攻击已击中集合」或挥砍期间只结算一次。连扣是新手战斗最冤的 Bug,玩家会以为数值炸了。
var hit_targets := {}
func _on_attack_hitbox_area_entered(area: Area2D) -> void:
var enemy := area.get_parent()
if enemy and enemy.has_method("take_damage"):
if hit_targets.has(enemy):
return
hit_targets[enemy] = true
enemy.take_damage(1)
层/掩码必须让 Hitbox 能扫到 Hurtbox。扫不到时,优先检查层,而不是重写伤害公式。层是水管阀门,阀门关着,水(信号)不会来。
成功标准:一刀 -1 HP 的打印。看见数字,战斗才从想象变成事实。
若信号用 area_entered 却触发 body,或相反,核对你连的是 Area 还是 Body。连错信号家族,会沉默或乱触发。
命中成功时也可让敌人 knockback 一点,非必须。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。
命中一次,HP 明确减少。减了,才谈击杀——先有伤害,才有胜负。
die() 里 queue_free() 是最小死亡。可加:短暂闪白/变红、禁用碰撞、播放一句 print「山贼倒下」。不要一上来做死亡动画状态机与掉落表。
可选:敌人也能碰玩家扣血(接触伤害)。若做,请给玩家同样 take_damage,并加无敌帧(0.5s),否则会一帧扣光。今天时间紧可只做「玩家打怪」,怪不反击——单边战斗仍可验证系统。
死亡后确保 Hitbox 不再继续结算。对象释放后仍持有引用会报错。用 is_instance_valid 或在集合里小心清理。
三刀打死一只怪。打得死,闭环才算圆。打不死,再炫的攻击都是空气。
单向战斗(只打怪)完全可作为竖切片。反击是加分,不是及格线。及格线是因果可读的击杀。
死亡掉落物品今天禁止。掉落是另一个系统的门。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
击败一只敌人,场景树里它消失。消失即胜——胜利要可见。
攻击冷却(如 0.35s)让节奏可读,也减少信号风暴。移动可在攻击时保留,或短暂减速——选一种,写进规则。对话打开时禁止攻击;攻击时若不想对话插入,也可禁 interact。用简单布尔:talking / attacking。
手感清单:太远砍空?加大 Hitbox 或靠近再砍。太容易误伤空气?缩小窗口时间。一次只调一个参数,记下前后差异。
输入仲裁是 Demo 质量关键。同一帧又说话又砍,会制造「灵异事件」。明确优先级:对话中 > 攻击 > 移动(示例),或你自定但要一致。
把键位表写进口令本:移动 WASD、交谈 E、攻击 J(示例)。团队(未来的你)需要这份表。
冷却可用 Timer 节点或累计 delta。哪种都行,保持一种。两套冷却并存会互踩。
键位表更新后,顺便改 FAQ 式备注:攻击键不是 E。
仲裁布尔请集中放一个地方,避免 NPC、玩家、UI 各写各的 talking 标志对不上。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
对话中按攻击无效果;冷却内连按不刷伤害。规则稳,本节过。
当你节点已齐,让 AI 按真实路径输出完整脚本:玩家攻击、敌人 HP、层设置说明、冷却、防重复命中。先贴场景树与键位表,禁止 AI 瞎猜节点名。
联调顺序固定:HP 单测 → 攻击窗口 print → 命中扣血 → 三刀死亡 → 对话冲突检查。每步失败都停,不要「一起修」。
战斗 Bug 排错时,把「看见的」和「算的」对齐:开调试碰撞形状,确认盒子在砍的方向。眼睛是第一调试器。
把 AI 生成的脚本先放进空项目或备份分支心态:粘贴前复制旧文件。战斗脚本一长,更需要回滚点。
联调成功录像 10 秒,作为 Day6 演示素材雏形。
一次挥砍打中两个怪可以允许。先保证单个目标正确,再测多目标。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
完整击杀一次并保存回放截图。样片到手,才进村庄包装。
把敌人放到村外/竹林入口,做演示路线:听店小二暗示 → 走出村口 → 遇敌 → 击败。路线本身就是叙事,不必做任务引导箭头。
只放 1–2 只怪。怪多不等于内容多,系统不稳时怪多等于事故多。
演示线走两遍:你自己一遍,找朋友盲玩一遍。盲玩会暴露你习惯性绕开的坑。
若朋友找不到敌人,说明摆位太偏。敌人是内容,也要被看见。
重启后敌人要在。若你用了不会刷新的临时删除,记得用场景实例而不是只在运行时 new 一次且不保存。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
场记表全勾,备份项目。可演示,才算 Day5 杀青。
第五天,冲突落地。词典更新:
战斗系统是欲望吸尘器。AI 会不断建议连招、BUFF、暴击。你要反复问:是否服务今日完成定义?不服务就记到以后。克制的导演,才做得出 Demo。
明天 Day6 把地图、角色、NPC、战斗串成完整可玩竖切片并打磨演示。缺哪块,明天先补哪块,再谈包装。
五天骨架:地、人、话、打。明天是剪辑日:让四段变成一部可看短片。
口令本写下:攻击键、伤害值、敌人 max_hp、场景路径。数字是可重复的记忆。
标记完成前,确认口令本三行数字与两行路径已写。档案不齐不算收工。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
请把本节要点写进口令本,并用一句话告诉自己明天要带着什么现状开工。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。继续补充验收笔记。
口述:我怎样造成伤害、怎样判定死亡。说清再标记完成。
1)记录攻击键、伤害、max_hp。
2)截图:命中瞬间与敌人消失。
3)写一句:「我的防连扣策略是 ___。」
战斗 = HP + 命中窗口 + 死亡。胜利条件:打得到,打得死,按键不打架。