下载 App
开发者日志
修改于10/168 浏览综合
【开发者日志】第一篇:让规则自己连招
我们是 EmbersStudio,三个人:两个程序 CrimsonSeraph 和 King,一个美术 Angvannor。这是第一篇开发者日志。
本期进展
游戏叫 RogueDungeon(暂定,正式名字还未确定),2D 自动战斗 Roguelike,Godot 4.7 加 GDScript。
玩家的手不碰战斗。玩家要做的事只有一件:选规则牌。规则牌订阅战斗事件,条件命中就触发动作,动作又可能触发别的牌,一层层连锁下去。战斗全自动跑完,决策全部压在「选牌」这一步上。
这个想法来自玩这类构筑游戏时最上瘾的那个瞬间:几张本来平平无奇的牌凑到一起,突然变成一个谁也没设计过的循环。我们想把这个「组合爆炸」从附加乐趣提成核心玩法,看看它到底能涌现出多有意思的东西,也顺便看看能涌现出多少我们没预料到的 bug。
Day 1 到 Day 3 是灰盒阶段,只验证四件事:玩家能自动打最近的敌人、敌人能追上来造成伤害、死亡掉落拾取重开的闭环成立、事件总线能稳定广播后面规则系统要用的 7 个核心事件。商店、多层房间、正式美术、音效、安卓适配这些,当前决策是不做。
三天下来四条都过了。主场景跑 900 帧测试:ON_HURT 触发 12 次,敌人死亡 2 次并掉出 2 枚金币,2 枚全部被吸附拾取;7 个核心事件里观察到 6 个,暴击也出现了 1 次。剩下的 ON_DODGE 按设计预留,闪避率还没定数值,事件先躺着不触发。
问题与风险
这几天最大的坑出在一个我们没预料的地方:我们一度看不见自己的游戏。
一开始玩家是全图射程,跑起来挺爽,子弹自动飞出去把敌人点掉。问题是我们要验证的三件事,接触伤害、死亡重开、金币吸附,一个都没被触发过。敌人永远走不到跟前,屏幕上打得热闹,我们要验证的那部分代码是死的。
后来把索敌范围压到 8 格(256 像素),又给了固定出生点,这几条链路才在主场景里真的跑起来。这件事让我们改了个习惯:每加一个机制,先想清楚它会在哪一帧、哪个界面上被亲眼看到。
紧接着是另一个 bug。敌人终于贴上来了,接触伤害却一次都没发出。
判定写的是「中心距大于 32 像素就跳过」。实测敌人被玩家挡住之后,稳定停在 32.002 像素,差值小于阈值,判定永远为假。中途我们换成读数值表里的 contact_range,看起来好了,但很快就意识到同一个坑会随碰撞体尺寸变化重新出现。最后把判定改成直接看 move_and_slide() 的真实碰撞结果,contact_range 这个字段整个退役。
同类的问题还有两个。body_entered 是在物理查询刷新期触发的,回调里 add_child 掉金币、queue_free 销毁子弹,都会报 Can't change this state while flushing queries,我们把命中结算推迟到了帧末。死亡暂停一开始也不生效,Main 设成 PROCESS_MODE_ALWAYS 之后子节点继承了同一个模式,get_tree().paused = true 冻不住战斗;改成只让 World 是 PAUSABLE,Main、HUD、结算界面保持 ALWAYS,结算计时和遮罩才正常跑。
风险有两个,我们清楚但还没解决。
一是「连锁」当时只是个接口,HUD 上那个数字一直是 0,因为规则牌虽然挂上去了,却没有订阅任何事件。写这篇日志的时候规则牌的订阅和连锁已经跑通,最新截图里连锁能冲到 17,这部分下一期细讲。
二是数值全靠手填,灰盒阶段的平衡完全没测过。规则牌一旦能连锁,数值之间会互相放大,这里的风险比单个数值写错大得多。
下期计划
- 把规则牌的事件订阅、动作执行和连锁计数完整落地,接进 HUD
- 开始内容与数值框架:补齐规则牌,设计房间与多层结构
- 平衡验证:连锁能不能被「玩坏」,有没有必死组合或者永远连不起来的废牌
- 继续补自测,把新机制都纳入能自动跑的用例
- 逐步替换、使用美术素材
开发过程截图

开局。无限网格地图,中间白色方块是玩家。灰盒阶段所有美术都是占位色块,左上角三行分别是血量、金币、连锁。

战斗中。左下角红圈里的 1.2 是出生预警的倒计时,那个位置一会儿会冒出一只敌人,现在还没出现;右边几只史莱姆正在包夹玩家;事件日志里 ON_KILL 到 ON_GOLD_DROP 再到 ON_BULLET_HIT 和 ON_PICKUP_GOLD,一次击杀的完整链路全在。

连锁。这是最近跑的版本,左上角连锁已经能到 17,确定规则牌有效,但目前缺乏明显的特效等反馈。

结算。死亡界面和重开按钮,左上角连锁归 0,重开时事件队列和历史会一起清空。









