public void Pulsate(OsbSprite sprite, bool isRing = false) { var beatDuration = Beatmap.GetTimingPointAt(StartTime).BeatDuration; var iterations = (int)(Math.Ceiling((EndTime - StartTime) / beatDuration * 2)); var baseScale = StartScale * PulseScale * (isRing ? RingMultiplier : 1); sprite.Fade(StartTime, StartTime + 100, 0, 1); sprite.Fade(EndTime - 100, EndTime, 1, 0); sprite.StartLoopGroup(StartTime, iterations); sprite.Scale(Easing, 0, beatDuration, baseScale * UpbeatMultiplier, StartScale); sprite.Scale(Easing, beatDuration, beatDuration * 2, baseScale, StartScale); sprite.EndGroup(); }
private void parseEventsSection(StreamReader reader) { OsbSprite osbSprite = null; var inCommandGroup = false; reader.ParseSectionLines(line => { if (line.StartsWith("//")) { return; } var depth = 0; while (line.Substring(depth).StartsWith(" ")) { ++depth; } var trimmedLine = applyVariables(line.Trim()); var values = trimmedLine.Split(','); if (inCommandGroup && depth < 2) { osbSprite.EndGroup(); inCommandGroup = false; } switch (values[0]) { case "Sprite": { var layerName = values[1]; var origin = (OsbOrigin)Enum.Parse(typeof(OsbOrigin), values[2]); var path = removePathQuotes(values[3]); var x = float.Parse(values[4], CultureInfo.InvariantCulture); var y = float.Parse(values[5], CultureInfo.InvariantCulture); osbSprite = GetLayer(layerName).CreateSprite(path, origin, new Vector2(x, y)); } break; case "Animation": { var layerName = values[1]; var origin = (OsbOrigin)Enum.Parse(typeof(OsbOrigin), values[2]); var path = removePathQuotes(values[3]); var x = float.Parse(values[4], CultureInfo.InvariantCulture); var y = float.Parse(values[5], CultureInfo.InvariantCulture); var frameCount = int.Parse(values[6]); var frameDelay = double.Parse(values[7], CultureInfo.InvariantCulture); var loopType = (OsbLoopType)Enum.Parse(typeof(OsbLoopType), values[8]); osbSprite = GetLayer(layerName).CreateAnimation(path, frameCount, frameDelay, loopType, origin, new Vector2(x, y)); } break; case "Sample": { var time = double.Parse(values[1], CultureInfo.InvariantCulture); var layerName = values[2]; var path = removePathQuotes(values[3]); var volume = float.Parse(values[4], CultureInfo.InvariantCulture); GetLayer(layerName).CreateSample(path, time, volume); } break; case "T": { var triggerName = values[1]; var startTime = double.Parse(values[2], CultureInfo.InvariantCulture); var endTime = double.Parse(values[3], CultureInfo.InvariantCulture); var groupNumber = values.Length > 4 ? int.Parse(values[4]) : 0; osbSprite.StartTriggerGroup(triggerName, startTime, endTime, groupNumber); inCommandGroup = true; } break; case "L": { var startTime = double.Parse(values[1], CultureInfo.InvariantCulture); var loopCount = int.Parse(values[2]); osbSprite.StartLoopGroup(startTime, loopCount); inCommandGroup = true; } break; default: { if (string.IsNullOrEmpty(values[3])) { values[3] = values[2]; } var commandType = values[0]; var easing = (OsbEasing)int.Parse(values[1]); var startTime = double.Parse(values[2], CultureInfo.InvariantCulture); var endTime = double.Parse(values[3], CultureInfo.InvariantCulture); switch (commandType) { case "F": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; osbSprite.Fade(easing, startTime, endTime, startValue, endValue); } break; case "S": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; osbSprite.Scale(easing, startTime, endTime, startValue, endValue); } break; case "V": { var startX = double.Parse(values[4], CultureInfo.InvariantCulture); var startY = double.Parse(values[5], CultureInfo.InvariantCulture); var endX = values.Length > 6 ? double.Parse(values[6], CultureInfo.InvariantCulture) : startX; var endY = values.Length > 7 ? double.Parse(values[7], CultureInfo.InvariantCulture) : startY; osbSprite.ScaleVec(easing, startTime, endTime, startX, startY, endX, endY); } break; case "R": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; osbSprite.Rotate(easing, startTime, endTime, startValue, endValue); } break; case "M": { var startX = double.Parse(values[4], CultureInfo.InvariantCulture); var startY = double.Parse(values[5], CultureInfo.InvariantCulture); var endX = values.Length > 6 ? double.Parse(values[6], CultureInfo.InvariantCulture) : startX; var endY = values.Length > 7 ? double.Parse(values[7], CultureInfo.InvariantCulture) : startY; osbSprite.Move(easing, startTime, endTime, startX, startY, endX, endY); } break; case "MX": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; osbSprite.MoveX(easing, startTime, endTime, startValue, endValue); } break; case "MY": { var startValue = double.Parse(values[4], CultureInfo.InvariantCulture); var endValue = values.Length > 5 ? double.Parse(values[5], CultureInfo.InvariantCulture) : startValue; osbSprite.MoveY(easing, startTime, endTime, startValue, endValue); } break; case "C": { var startX = double.Parse(values[4], CultureInfo.InvariantCulture); var startY = double.Parse(values[5], CultureInfo.InvariantCulture); var startZ = double.Parse(values[6], CultureInfo.InvariantCulture); var endX = values.Length > 7 ? double.Parse(values[7], CultureInfo.InvariantCulture) : startX; var endY = values.Length > 8 ? double.Parse(values[8], CultureInfo.InvariantCulture) : startY; var endZ = values.Length > 9 ? double.Parse(values[9], CultureInfo.InvariantCulture) : startZ; osbSprite.Color(easing, startTime, endTime, startX / 255f, startY / 255f, startZ / 255f, endX / 255f, endY / 255f, endZ / 255f); } break; case "P": { var type = values[4]; switch (type) { case "A": osbSprite.Additive(startTime, endTime); break; case "H": osbSprite.FlipH(startTime, endTime); break; case "V": osbSprite.FlipV(startTime, endTime); break; } } break; } } break; } }, false); if (inCommandGroup) { osbSprite.EndGroup(); inCommandGroup = false; } }
public override void Generate() { var layer = GetLayer(""); using (var pool = new OsbSpritePool(layer, "sb/sprites/toDown.png", OsbOrigin.Centre, (sprite, startTime, endTime) => { // This action runs for every sprite created from the pool, after all of them are created (AFTER the for loop below). // It is intended to set states common to every sprite: // In this exemple, this handles cases where all sprites will have the same color / opacity / scale / rotation / additive mode. // Note that the pool is in a using block, this is necessary to run this action. // Initial setup. sprite.Scale(27551, 0); })) { var timeStep = particleDuration / particleAmount; for (double startTime = 27551; startTime < 49369 - particleDuration; startTime += timeStep) { var endTime = startTime + particleDuration; // This is where sprites are created from the pool. // Commands here are specific to each sprite. var sprite = pool.Get(startTime, endTime); var x = Random(0, 640); var y = Random(0, 480); while (x > 140 && x < 500 && y > 60 && y < 420) { x = Random(0, 640); y = Random(0, 480); } var arrowCount = Random(3, 6); List <OsbSprite> arrowList = new List <OsbSprite>(); while (arrowCount >= 0) { arrowList.Add(layer.CreateSprite("sb/sprites/toDown.png", OsbOrigin.Centre)); arrowCount--; } var loopAmount = Random(2, 5); for (int i = 0; i < arrowList.Count; i++) { OsbSprite arrow = arrowList[i]; arrow.Scale(startTime, 0.2); arrow.StartLoopGroup(0, loopAmount); arrow.Fade(OsbEasing.InOutExpo, startTime, startTime + 300 + 2 * i, 0, 1); arrow.Move(OsbEasing.InOutExpo, startTime, startTime + 300 + 2 * i, x, y, x, y + 10 + i * 15); arrow.Fade(OsbEasing.InExpo, startTime + 300 + 2 * i, startTime + 600 + 2 * i, 1, 0); arrow.Move(OsbEasing.InExpo, startTime + 300 + 2 * i, startTime + 600 + 2 * i, x, y + 10 + i * 15, x, y + 20 + i * 26); arrow.EndGroup(); } } } }