Sonolus Wiki

04. 屏幕坐标系

在本章中,我们将学习屏幕坐标系,以及如何为我们的引擎变换它。

默认

Sonolus 使用默认屏幕坐标系,其中(0, 0)位于屏幕中心, y-1 (底部)到1 (顶部), x-1 * screen.aspectRatio (左)到screen.aspectRatio (右)。这些值在screen对象以及一个方便的属性screen.rect中提供。

变换

虽然您可以使用默认屏幕坐标系编写引擎,但要是首先对其进行变换,来适应特定引擎的需要的话会更方便一些。

在 VSRG(Vertical Scroll Rhythm Games,纵向滚动节奏游戏)中,一个常用的坐标系是y0 (音符产生的顶部)到1 (判定线),并且中心轨道位于x = 0 ,其中每个单位是一个轨道(例如,x = 2是中间轨道右侧的第二条轨道)。

计算与应用

让我们一起计算,并将这个变换逻辑应用于我们的引擎。

在默认的屏幕坐标系中,我们决定:我们的音符的半径应该是0.2 ,它从玩家视野之外产生( screen.t + radius )并落在y = -0.6的判定线上。至于x ,因为我们的引擎只有一个轨道,我们可以简单地将它缩放为与y相同。

由于我们不打算改变我们的屏幕坐标系,我们可以在初始化的preprocess中进行:

export class Initialization extends Archetype {
    preprocess() {
        const noteRadius = 0.2
        const judgeLineY = -0.6

        const t = screen.t + noteRadius
        const b = judgeLineY
        const h = t - b

        const transform = Mat.identity.scale(h, -h).translate(0, t)

        skin.transform.set(transform)
        particle.transform.set(transform)

        // ...
    }

    // ...
}
export class Initialization extends Archetype {
    preprocess() {
        const noteRadius = 0.2
        const judgeLineY = -0.6

        const t = screen.t + noteRadius
        const b = judgeLineY
        const h = t - b

        const transform = Mat.identity.scale(h, -h).translate(0, t)

        skin.transform.set(transform)
        particle.transform.set(transform)

        // ...
    }

    // ...
}