Skip to main content

Bullet Dodger

·62 words·1 min
Author
Konpaku Youming

Ciallo~(∠・ω< )⌒★

Bullet Dodger 其实就是之前做的自动避弹 AI ,今天把它彻底优化了一下,看上去像个有趣的小项目了。目前算是做了初版,不过后面也不知道会不会再优化(笑),最近精力不佳,可能跟我睡觉变早有关,反正特别容易累。

目前仓库还没公开,后面做完了会把代码全部放出来,还包括我几张符卡的代码。

Before Reading
#

本期弹幕的主题就是这首歌。想做出 “梦境”“神秘” 的感觉来着,但是最后呈现反而更像是庄严感。

原篇好像是小说来着,原谅我没看过(估计看过的多是玩贴吧和喵玉殿的老资历了)。歌是真的很好听,两位歌姬的声线也很符合我想象中的莲子和梅莉,不过原曲却跟秘封没什么关系呢。

话说原曲和竹之花是同一首,真有人听的出来吗…

现梦 -genmu-
#

主要想法就是画五角星(致敬传奇风祝东风谷早苗),小巧思是在下一波弹幕中,在之前散开的五角星的每个角的位置(出界了就取刚画好时角的位置)各画一个五角星。最后弹幕效果还是挺好看的,依据五角星画的方向正反,形成两波交替的形状不同的固定弹。

由于纯固定很容易出安定点,就加了一点蝶弹的自机狙,带点曲线,但是比较稀疏,弹速也还好。还加了向 Boss 移动的大玉,想体现出吸收法力的感觉,但看起来有点抽象…

直接看效果吧,传送门

Bullet Dodger
#

之前的避弹逻辑中,很抽象的一点在于,它完全没有考虑弹幕是有判定大小的。之前的斥力全是按点做的,也就是说,对于大玉之类的弹幕,自机只会在离它的中心点足够近的时候才感觉危险,这明显是不合理的。

今天仔细扒了一下 THlib 的文件夹,最后找到一个 bullet.lua 文件,在里面有所有基础弹幕类型的判定范围,拿去喂给 AI 修了避弹逻辑,给所有子弹添加了一个 equiv_radius 属性。

现在避弹的核心逻辑也很简单,一共八个方向 + 留在原地,分别计算每种情况的代价(通过一个代价函数),之后选取最佳的那个方向即可。当然,难点集中在怎么设计这个代价函数。

我们可以动用一下人类智慧,想想应该怎么避弹。

  • 首先我们不希望自机主动往版边跑,因为被封死的可能会变高。所以加入边界惩罚,在到边界距离小于某值时开始生效。离边界越近,惩罚越重。 需要注意的是:版顶的危险度是更高的,大量弹幕会在上方生成,因此我们还设了对上方区域的额外惩罚。

  • 一般来说,在版面下方的中部,相对安全的同时也便于根据弹幕做后续的响应。我们设定在无威胁情况下,向着这个位置移动。

  • 对于弹幕,如果位置落在某个子弹的碰撞范围内,会得到一个极大的代价。否则会依据距离给一个指数级衰减的代价。对于 Boss 的体术同理。

  • 为了让避弹看上去更连贯丝滑,还要加一个对方向突变的惩罚,这个惩罚在完全反向时最大。主要用来防止 AI 避弹中常见的 “抽搐” 现象。

  • 当然,需要考虑到弹幕的速度与方向的影响。我们会根据当前的速度与方向预测后面 $5$ 帧内子弹的位置,并把每一帧的代价累加。

思路就是这样,效果很显著,机体没有明显抽动,对大玉的躲避也很成功,遇到密集的下压弹能够选择上穿,也是轻松通过了之前的符卡。所以今天又做了一张符,也是测试一下避弹效果,还是很成功的。

现在还是没能解决的一点在于 AI 避弹的视野太差了,不会自动寻找弹幕密度低的位置。之后看看能不能从这一点上着手优化吧。

Bye~