Skip to content

Level 类

Level 是库的主要入口,提供加载、操作与保存 ADOFAI 关卡的方法。位于 SharpFAI.Serialization 命名空间。

构造函数

csharp
// 从文件路径加载
var level = new Level("path/to/level.adofai");

// 从关卡信息字典初始化
var level = new Level(levelInfoDict);

// 创建带有默认设置的新关卡
var level = Level.CreateNewLevel();

属性

属性说明
root关卡根 JSON 对象(angleData / settings / actions / decorations 始终同步)
settings关卡设置 JObject
angleData角度数组 JArray
actions事件列表 JArray
decorations装饰列表 JArray(版本 > 10 时存在)
angles只读角度数组 ReadOnlyCollection<double>
pathToLevel加载时的文件路径
deserializedEvents反序列化后的只读事件列表

构造函数会自动处理:存在 angleData 时直接读取;只有 pathData 时调用 InitAngleData() 转换;并预先反序列化事件。

设置管理

csharp
var bpm = level.GetSetting<double>("bpm");        // 读取
level.PutSetting("bpm", 180);                     // 写入
bool has = level.HasSetting("artist");            // 是否存在
level.RemoveSettings("offset", "pitch");          // 移除多个设置

level.SetSong("song.mp3");                        // 设置歌曲
var audioPath = level.GetAudioPath();             // 音频文件绝对路径
方法说明
GetSetting<T>(string)获取设置值
PutSetting<T>(string, T)设置设置值
HasSetting(string)检查设置是否存在
RemoveSettings(params string[])移除多个设置
SetSong(string)设置关卡歌曲
GetAudioPath()获取音频文件绝对路径

事件管理

csharp
// 在指定地板添加事件
level.AddEvent(10, EventType.Twirl);

// 用事件对象添加
var hold = new Hold(duration: 4) { Floor = 5 };
level.AddEvent(hold);

// 查询
var events = level.GetFloorEvents(10);            // 地板 10 的所有事件
var twirls = level.GetEvents(EventType.Twirl);    // 全部 Twirl
var longPauses = level.GetEventsIf(e =>
    e.EventType == EventType.Pause && e.ToEvent<Pause>().Duration > 2.0);

// 检查
bool hasAny = level.HasEvents(10);
bool hasTwirl = level.HasEvents(10, EventType.Twirl);

// 移除
level.RemoveEventsIf(e => e.EventType == EventType.MoveCamera);
level.RemoveFloorEvents(5, EventType.Twirl, 2);
方法说明
AddEvent(int floor, EventType type, JObject data)向地板添加事件
AddEvent(BaseEvent)从事件对象添加事件
GetEvents(int floor, EventType type)获取特定地板特定类型的事件
GetFloorEvents(int floor)获取地板的所有事件
GetEvents(EventType type)获取所有特定类型的事件
GetEventsIf(Func<BaseEvent, bool>)获取满足条件的事件
HasEvents(int floor) / HasEvents(int floor, EventType)检查地板是否有事件
RemoveEventsIf(Func<BaseEvent, bool>)移除满足条件的事件
RemoveFloorEvents(int floor, EventType type, int count)从地板移除事件
DeserializeEvents(bool includeDecorations)把事件反序列化为对象

装饰管理

csharp
// 添加文本装饰
level.AddTextToDecorations(10, "Hello", tag: "title", relativeToScreen: true);

// 添加装饰
level.AddDecoration(10, EventType.AddText, "title", false, null);
方法说明
AddTextToDecorations(int floor, string text, string tag, bool relativeToScreen, JObject data)添加文本装饰
AddDecoration(int floor, EventType type, string tag, bool relativeToScreen, JObject data)添加装饰

序列化

csharp
level.Save("modified-level.adofai");     // 保存到文件
string json = level.ToString();          // 转为 JSON 字符串
方法说明
Save(string newLevelPath, bool indent = true)保存关卡到文件
ToString(bool indent = true)转换为 JSON 字符串

相等比较

Level 重载了 == / !=:两者都有文件路径时按路径比较,否则按 rootdecorationssettingsangleDataactions 逐项深比较。

An organization that researches and expands the functions of ADOFAI