Sonolus Wiki

09. BPM

在本章中,我们将设置并实现 BPM 变化。

BPM 变化

在游玩模式中,我们不需要实现 BPM 变化原型,因为 BPM 变化会被相关函数自动处理,我们不需要对其坐任何事。

然而在预览模式中,我们想要通过将其打印到一边来显示 BPM 何时变化以及变化后的值。

BPM 变化原型

让我们先设置一个 BPM 变化原型:

export class BpmChange extends Archetype {}
export class BpmChange extends Archetype {}
export const archetypes = defineArchetypes({
    // ...
    [EngineArchetypeName.BpmChange]: BpmChange,
})
export const archetypes = defineArchetypes({
    // ...
    [EngineArchetypeName.BpmChange]: BpmChange,
})

数据

我们想要通过 Entity Data 区块来访问 BPM 变化的节拍和 BPM 值:

export class BpmChange extends Archetype {
    import = this.defineImport({
        beat: { name: EngineArchetypeDataName.Beat, type: Number },
        bpm: { name: EngineArchetypeDataName.Bpm, type: Number },
    })
}
export class BpmChange extends Archetype {
    import = this.defineImport({
        beat: { name: EngineArchetypeDataName.Beat, type: Number },
        bpm: { name: EngineArchetypeDataName.Bpm, type: Number },
    })
}

声明

export const skin = defineSkin({
    sprites: {
        // ...
        bpmChangeLine: SkinSpriteName.GridPurple,
    },
})
export const skin = defineSkin({
    sprites: {
        // ...
        bpmChangeLine: SkinSpriteName.GridPurple,
    },
})

打印与刻度线

现在我们可以打印 BPM 值并绘制刻度线:

export class BpmChange extends Archetype {
    // ...

    render() {
        line(skin.sprites.bpmChangeLine, this.import.beat, 0.5)

        print(
            this.import.bpm,
            bpmChanges.at(this.import.beat).time,
            PrintFormat.BPM,
            'auto',
            PrintColor.Purple,
            'right',
        )
    }
}
export class BpmChange extends Archetype {
    // ...

    render() {
        line(skin.sprites.bpmChangeLine, this.import.beat, 0.5)

        print(
            this.import.bpm,
            bpmChanges.at(this.import.beat).time,
            PrintFormat.BPM,
            'auto',
            PrintColor.Purple,
            'right',
        )
    }
}