Skip to content

02. 弹幕入门

H2Sxxa edited this page Aug 9, 2023 · 14 revisions

弹幕入门

既然称为弹幕核心,那么弹幕肯定是最重要的内容,本篇将会让你大概地了解一下弹幕。

弹幕构成

一个弹幕主要由ShotData里面的各个变量决定行为逻辑,颜色,渲染等等

ShotData

参考源码(也可以参考英文注释)

ShotData(弹幕数据),主要控制弹幕的表现,例如颜色,类别以及模型渲染等等

弹幕数据又包含了数个数据

  • Form (弹幕类型)-> 决定弹幕物理外观
  • renderProperties (渲染属性) -> 向弹幕渲染器传递的额外参数
  • Color (弹幕颜色)
    • edgeColor (边缘色)-> 决定 DanmakuState 的边缘色
    • coreColor (核心色)-> 决定 DanmakuState 的核心色
    • mainColor (主色)-> 最好猜测决定色彩方面的主色
    • secondaryColor (次色) -> 最好猜测决定色彩方面的次色
  • damage(伤害)
  • size(弹幕大小)
    • sizeX
    • sizeY
    • sizeZ
  • delay(延时发射/运动)-> 等待delay的时间后开始运动,例如镭射这种固定弹幕,这个值通常大于下面的end
  • end(持续时间)-> 弹幕将会在end后消失
  • subEntity(弹幕子实体)-> 较为复杂,详细看下方说明
  • subEntityProperties(弹幕子实体属性)

其他参数较不重要,自行参考源码

颜色 & 遗留问题

DanmakuCore中LibColor提供了许多两种预设颜色(VANILLA ,SATURATED),但请注意, VANILLA 颜色是通过反射获取,随着Forge的更新,这些颜色不可用,因为这个原因LibShotData提供的大多数弹幕预设会出现颜色问题,具体表现为开发环境正常,生产环境颜色变为纯白。

因此,为了解决这个问题,我在io.github.teamgensouspark.kekkai.color包下提供了一套颜色创建工具以及预设,请通过重新setMainColor()来修复你的颜色

LibShotData.SHOT_HEART_CARD.setMainColor(...)

SubEntity

SubEntity(子实体),主要是控制弹幕的行为逻辑,例如是否碰撞,实体更新都是由子实体控制。

如何自定义一个子实体,在弹幕章节会讲

发射一个弹幕

弹幕核心既然名字有弹幕,那么学会发射一个弹幕是必不可少的。

DanmakuBuilder

DanmakuTemplate.Builder

DanmakuTemplate.Builder danmaku = DanmakuTemplate.builder()
        .setUser(player)
        .setWorld(worldIn)
        .setShot(LibShotData.SHOT_LASER.setMainColor(LibColor.COLOR_SATURATED_YELLOW));

DanmakuCore.spawnDanmaku(Collections.singletonList(danmaku.build().asEntity()));

上面这段代码是DanmakuCore的实现,是不是很简单(雾

你可能会觉得setUsersetWorld...很麻烦,别担心,你可以使用io.github.teamgensouspark.kekkai.danmaku下的DanmakuBuilder.getBuilderWithEntity(...)这样你就只需要以下代码就可以实现了,也许变得简单了也不一定(?)

DanmakuTemplate.Builder danmaku = DanmakuBuilder.getBuilderWithEntity(player).setShot(LibShotData.SHOT_LASER.setMainColor(LibColor.COLOR_SATURATED_YELLOW));

DanmakuCore.spawnDanmaku(Collections.singletonList(danmaku.build().asEntity()));

DanmakuCreationHelper(DCH)的拓展

发射一个弹幕很简单,可如果发射环状的呢,你大可以自己处理,但 DanmakuCore 给了你一套解决方案,注意别引入错了,正确的包名是net.katsstuff.teamnightclipse.danmakucore.scalastuff.DanmakuCreationHelper,另外一个javastuff包内的DCH多了一个unused的Quat参数。

但请注意,由于编译问题导致了许多变量名的丢失,你需要参考 DanmakuCore 中的 DanmakuHelper 来得到原有的变量名称。

KekkaiDanmakuCreationHelper(KDCH)

要不是DanmakuCore没法编译也不会有KDCH这种东西......KDCH就是DCH的Kekkai版本,唯一的不同就是没有混淆名。

每种方法都有两种Overload,不同在于最后的spawnDanmaku,不填默认为true。

KekkaiDanmakuCreationHelper.createWideShot(...);
KekkaiDanmakuCreationHelper.createCircleShot(...);

...