public override void Generate() { var hitobjectLayer = GetLayer(""); OsuHitObject prevObject = null; var hSprite = hitobjectLayer.CreateSprite(SpritePath, OsbOrigin.Centre); hSprite.Scale(StartTime, SpriteScale); hSprite.Fade(OsbEasing.In, StartTime - 200, StartTime + 200, 0, 1); if (Additive) { hSprite.Additive(StartTime, EndTime + FadeTime); } foreach (var hitobject in Beatmap.HitObjects) { if ((StartTime != 0 || EndTime != 0) && (hitobject.StartTime < StartTime - 5 || EndTime - 5 <= hitobject.StartTime)) { continue; } if (prevObject != null) { hSprite.Move(OsbEasing.Out, prevObject.EndTime, hitobject.StartTime, prevObject.PositionAtTime(prevObject.EndTime), hitobject.PositionAtTime(hitobject.StartTime)); if (Colorize) { hSprite.Color(prevObject.EndTime, hitobject.StartTime, prevObject.Color, hitobject.Color); } } else { if (Colorize) { hSprite.Color(hitobject.StartTime, hitobject.Color); } } if (hitobject is OsuSlider) { var timestep = Beatmap.GetTimingPointAt((int)hitobject.StartTime).BeatDuration / BeatDivisor; var startTime = hitobject.StartTime; while (true) { var endTime = startTime + timestep; var complete = hitobject.EndTime - endTime < 5; if (complete) { endTime = hitobject.EndTime; } var startPosition = hSprite.PositionAt(startTime); hSprite.Move(startTime, endTime, startPosition, hitobject.PositionAtTime(endTime)); if (complete) { break; } startTime += timestep; } } prevObject = hitobject; } }