Sonolus Wiki

16. 街机得分

在本章中,我们将创建街机得分和主要指标 UI。

基于判定类型的基础得分倍数

每种判定类型都可以有自己的基本分数乘数,通常用1表示 Perfect,更小的值表示 Great 和 Good:

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

        score.base.set({
            perfect: 1,
            great: 0.75,
            good: 0.5,
        })

        // ...
    }

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

        score.base.set({
            perfect: 1,
            great: 0.75,
            good: 0.5,
        })

        // ...
    }

    // ...
}

基于判定类型的连击得分倍数

判定连击得分倍数是指,如果连击数大于等于某个值,判定时累乘的得分倍数。

举例来说,假设我们让连续 Great 得分倍数为每10次累积0.01 ,上限为50 。这意味着每连续取得 10 个 Great,您将获得0.01的额外得分倍数,最多计算到50 Great 连击(因此最多可以获得最多0.05的得分倍数)。

export class Initialization extends Archetype {
    preprocess() {
        // ...
        score.consecutive.great.set({
            multiplier: 0.01,
            step: 10,
            cap: 50,
        })

        // ...
    }

    // ...
}
export class Initialization extends Archetype {
    preprocess() {
        // ...
        score.consecutive.great.set({
            multiplier: 0.01,
            step: 10,
            cap: 50,
        })

        // ...
    }

    // ...
}

主要指标 UI

界面上的主要指标栏和主要指标值 UI,用于显示玩家选择的主要指标,一般是街机分数。主要指标栏显示显示的是百分比的进度条,主要指标值显示的则是原始值。

建议把它们堆叠在一起,以同时显示这两种信息:

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

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

        // ...
    }

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

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

        // ...
    }

    // ...
}