Sonolus Wiki

07. 音符和实体数据

在本章中,我们将编写音符并学习如何将实体数据集成至其中。

音符原型

让我们先写好音符原型:

export class Note extends Archetype {}
export class Note extends Archetype {}
export const archetypes = defineArchetypes({
    // ...
    Note,
})
export const archetypes = defineArchetypes({
    // ...
    Note,
})

实体数据

到目前为止,我们只有初始化和舞台这两个原型,两者在所有关卡中的行为应该都相同。

然而,对于音符来说情况并非如此:在一个关卡中,第一个音符可能在 5 秒处,而在另一个关卡中,它可能在 2 秒处;一个关卡可能有 200 个音符,而另一个关卡可能有 30 个。

引擎如何来处理关卡,来提供的具有不同信息、不同数量的音符?这就是实体数据发挥作用的地方。每个关卡都可以详细地规定所有实体,并向它们注入数据。

让我们为音符定义一个叫做time的数据,表示以秒为单位的音符时间。我们可以使用它的名称来导入数据:

export class Note extends Archetype {
    import = this.defineImport({
        time: { name: 'time', type: Number },
    })
}
export class Note extends Archetype {
    import = this.defineImport({
        time: { name: 'time', type: Number },
    })
}

现在我们可以很轻易地访问它。为了测试效果,让我们打印一些日志:

export class Note extends Archetype {
    // ...

    updateParallel() {
        debug.log(this.import.time)
    }
}
export class Note extends Archetype {
    // ...

    updateParallel() {
       debug.log(this.import.time)
    }
}

最后,让我们在关卡中添加一个音符实体,同时为其提供时间数据:

export const data: LevelData = {
    // ...
    entities: [
        // ...
        {
            archetype: 'Note',
            data: [
                {
                    name: 'time',
                    value: 2,
                },
            ],
        },
    ],
}
export const data = {
    // ...
    entities: [
        // ...
        {
            archetype: 'Note',
            data: [
                {
                    name: 'time',
                    value: 2,
                },
            ],
        },
    ],
}