04. 屏幕坐标系
在本章中,我们将学习屏幕坐标系,以及如何为我们的引擎变换它。
默认
Sonolus 使用默认屏幕坐标系,其中(0, 0)
位于屏幕中心, y
从-1
(底部)到1
(顶部), x
从-1 * screen.aspectRatio
(左)到screen.aspectRatio
(右)。这些值在screen
对象以及一个方便的属性screen.rect
中提供。
变换
虽然您可以使用默认屏幕坐标系编写引擎,但要是首先对其进行变换,来适应特定引擎的需要的话会更方便一些。
在 VSRG(Vertical Scroll Rhythm Games,纵向滚动节奏游戏)中,一个常用的坐标系是y
从0
(音符产生的顶部)到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)
// ...
}
// ...
}