Sonolus Wiki

17. 生命值

在本章中,我们将创建生命值和次要指标 UI。

生命值增长原型

对于每个原型,我们都可以奖励或惩罚获得某种判定类型的玩家。

在我们的引擎中,我们将奖励获得 Perfect 判定的玩家增加 10 点生命,并惩罚获得 Miss 判定的玩家失去 100 点生命。

export class Note extends Archetype {
    // ...

    globalPreprocess() {
        // ...

        this.life.set({
            perfect: 10,
            great: 0,
            good: 0,
            miss: -100,
        })
    }

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

    globalPreprocess() {
        // ...

        this.life.set({
            perfect: 10,
            great: 0,
            good: 0,
            miss: -100,
        })
    }

    // ...
}

基于判定类型的连击生命增长

与得分类似,我们也可以奖励或惩罚连续获得某种判定类型或以上的玩家,无论原型是什么。

在我们的引擎中,我们将奖励连续击中 10 次完美的玩家获得 50 点生命值。

export class Initialization extends Archetype {
    preprocess() {
        // ...

        life.consecutive.perfect.set({
            increment: 50,
            step: 10,
        })

        // ...
    }

    // ...
}
export class Initialization extends Archetype {
    preprocess() {
        // ...

        life.consecutive.perfect.set({
            increment: 50,
            step: 10,
        })

        // ...
    }

    // ...
}

次要指标 UI

与主要指标 UI 类似,也有次要指标栏和次要指标值 UI,一般用于展示生命值。

export class Initialization extends Archetype {
    preprocess() {
        // ...

        ui.metric.secondary.bar.set({
            anchor: screen.rect.rt
                .sub(new Vec(0.05, 0.05))
                .sub(new Vec(0, 0.15).mul(ui.configuration.metric.primary.scale))
                .sub(new Vec(0, 0.05)),
            pivot: { x: 1, y: 1 },
            size: new Vec(0.75, 0.15).mul(ui.configuration.metric.secondary.scale),
            rotation: 0,
            alpha: ui.configuration.metric.secondary.alpha,
            horizontalAlign: HorizontalAlign.Left,
            background: true,
        })
        ui.metric.secondary.value.set({
            anchor: screen.rect.rt
                .sub(new Vec(0.05, 0.05))
                .sub(new Vec(0, 0.15).mul(ui.configuration.metric.primary.scale))
                .sub(new Vec(0, 0.05))
                .sub(new Vec(0.035, 0.035).mul(ui.configuration.metric.secondary.scale)),
            pivot: { x: 1, y: 1 },
            size: new Vec(0, 0.08).mul(ui.configuration.metric.secondary.scale),
            rotation: 0,
            alpha: ui.configuration.metric.secondary.alpha,
            horizontalAlign: HorizontalAlign.Right,
            background: false,
        })

        // ...
    }

    // ...
}
export class Initialization extends Archetype {
    preprocess() {
        // ...

        ui.metric.secondary.bar.set({
            anchor: screen.rect.rt
                .sub(new Vec(0.05, 0.05))
                .sub(new Vec(0, 0.15).mul(ui.configuration.metric.primary.scale))
                .sub(new Vec(0, 0.05)),
            pivot: { x: 1, y: 1 },
            size: new Vec(0.75, 0.15).mul(ui.configuration.metric.secondary.scale),
            rotation: 0,
            alpha: ui.configuration.metric.secondary.alpha,
            horizontalAlign: HorizontalAlign.Left,
            background: true,
        })
        ui.metric.secondary.value.set({
            anchor: screen.rect.rt
                .sub(new Vec(0.05, 0.05))
                .sub(new Vec(0, 0.15).mul(ui.configuration.metric.primary.scale))
                .sub(new Vec(0, 0.05))
                .sub(new Vec(0.035, 0.035).mul(ui.configuration.metric.secondary.scale)),
            pivot: { x: 1, y: 1 },
            size: new Vec(0, 0.08).mul(ui.configuration.metric.secondary.scale),
            rotation: 0,
            alpha: ui.configuration.metric.secondary.alpha,
            horizontalAlign: HorizontalAlign.Right,
            background: false,
        })

        // ...
    }

    // ...
}