using System.Collections.Generic; namespace DownKyi.Core.Danmaku2Ass { /// /// 创建器 /// public class Creater { public Config Config; public List Danmakus; public List Subtitles; public string Text; public Creater(Config config, List danmakus) { Config = config; Danmakus = danmakus; Subtitles = SetSubtitles(); Text = SetText(); } protected List SetSubtitles() { var scroll = new Collision(Config.LineCount); var stayed = new Collision(Config.LineCount); Dictionary collisions = new Dictionary { { "scroll", scroll }, { "top", stayed }, { "bottom", stayed } }; List subtitles = new List(); foreach (var danmaku in Danmakus) { // 丢弃不支持的 if (danmaku.Style == "none") { continue; } // 创建显示方式对象 var display = Display.Factory(Config, danmaku); var collision = collisions[danmaku.Style]; var detect = collision.Detect(display); int lineIndex = detect.Item1; float waitingOffset = detect.Item2; // 超过容忍的偏移量,丢弃掉此条弹幕 if (waitingOffset > Config.DropOffset) { continue; } // 接受偏移,更新碰撞信息 display.Relayout(lineIndex); collision.Update(display.Leave, lineIndex, waitingOffset); // 再加上自定义偏移 float offset = waitingOffset + Config.CustomOffset; Subtitle subtitle = new Subtitle(danmaku, display, offset); subtitles.Add(subtitle); } return subtitles; } protected string SetText() { string header = Config.HeaderTemplate .Replace("{title}", Config.Title) .Replace("{width}", Config.ScreenWidth.ToString()) .Replace("{height}", Config.ScreenHeight.ToString()) .Replace("{fontname}", Config.FontName) .Replace("{fontsize}", Config.BaseFontSize.ToString()); string events = string.Empty; foreach (var subtitle in Subtitles) { events += "\n" + subtitle.Text; } return header + events; } } }