Sonolus Wiki

08. 节拍刻度线

在本章中,我们将实现节拍刻度线绘制。

刻度线

刻度线可以让玩家更精确地测量音符的位置。

就像打印一样,让我们使用一个实用函数来绘制刻度线:

// ...

export const line = (sprite: SkinSprite, beat: number, a: number) => {
    const pos = panel.getPos(bpmChanges.at(beat).time)

    sprite.draw(Rect.one.scale(1.5, 0.005).add(pos), 1, a)
}
// ...

export const line = (sprite, beat, a) => {
    const pos = panel.getPos(bpmChanges.at(beat).time)

    sprite.draw(Rect.one.scale(1.5, 0.005).add(pos), 1, a)
}

声明

标准方格精灵可以被用来绘制刻度线:

export const skin = defineSkin({
    sprites: {
        // ...

        beatLine: SkinSpriteName.GridNeutral,
    },
})
export const skin = defineSkin({
    sprites: {
        // ...

        beatLine: SkinSpriteName.GridNeutral,
    },
})

节拍刻度线

现在我们可以循环节拍,并在每一拍绘制一条刻度线来强调当前刻度:

export class Stage extends Archetype {
    // ...

    render() {
        // ...

        this.renderBeats()

        // ...
    }

    // ...

    renderBeats() {
        for (let i = 0; i <= Math.floor(chart.beats); i++) {
            line(skin.sprites.beatLine, i, i % 4 === 0 ? 0.25 : 0.125)
        }
    }

    // ...
}
export class Stage extends Archetype {
    // ...

    render() {
        // ...

        this.renderBeats()

        // ...
    }

    // ...

    renderBeats() {
        for (let i = 0; i <= Math.floor(chart.beats); i++) {
            line(skin.sprites.beatLine, i, i % 4 === 0 ? 0.25 : 0.125)
        }
    }

    // ...
}