private void Window_Loaded(object sender, RoutedEventArgs e) { _canvasHost = new StoryboardCanvasHost(MainCanvas); //_bitmaps.Add(new BitmapImage(new Uri("C:\\Program Files (x86)\\osu!\\Songs\\1241412 Ariabl'eyeS - Kegare naki Bara Juuji\\SB\\firefly2.png"))); //_bitmaps.Add(new BitmapImage(new Uri("C:\\Program Files (x86)\\osu!\\Songs\\1241412 Ariabl'eyeS - Kegare naki Bara Juuji\\SB\\waht.png"))); //_bitmaps.Add(new BitmapImage(new Uri("D:\\游戏资料\\osu thing\\sb\\SB素材\\123.jpg"))); Stopwatch sw = Stopwatch.StartNew(); int r = 400; int deg = 5; double interval = 16.666667 * 3; //for (int i = 0; i < 1200; i++) //{ // var bitmap = _bitmaps[_rnd.Next(_bitmaps.Count)]; // var uii = new Image { Source = bitmap }; // var ele = _canvasHost.CreateElement(uii, Origins.Center, bitmap.Width, bitmap.Height); // double i1 = i; // ele.ApplyAnimation(k => // { // //k.Flip(0, 0, FlipMode.FlipX); // k.Blend(0 + interval * i1, 0 + interval * i1, BlendMode.Normal); // k.Color(Easing.Linear, // 0 + interval * i1, 1000 + interval * i1, // (255, 255, 128), (128, 128, 128)); // k.Color(Easing.Linear, // 1000 + interval * i1, 2000 + interval * i1, // (128, 128, 128), (0, 0, 0)); // k.ScaleVec(Easing.Linear, // 0 + interval * i1, 2000 + interval * i1, // (1, 1), (1.2, 1.2) // ); // k.Move(Easing.Linear, // 0 + interval * i1, 2000 + interval * i1, // (-107 + (Math.Sin(i1 / 30) + 1) / 2 * 854, 240), // (-107 + (Math.Sin(i1 / 30) + 1) / 2 * 854 + r * Math.Sin(i1 * deg / 180 * Math.PI), 240 + r * Math.Cos(i1 * deg / 180 * Math.PI)) // ); // //k.Rotate(0, 0, 2000 + _rnd.Next(300), // // 0, // // Math.PI * 4 * _rnd.NextDouble() - Math.PI * 2); // // // }); // _list.Add(ele); //} //var bitmap = _bitmaps[_rnd.Next(_bitmaps.Count)]; //var uii = new Image { Source = bitmap }; //var ele = _canvasHost.CreateElement(uii, Origins.TopLeft, bitmap.Width, bitmap.Height); //ele.ApplyAnimation(k => //{ // k.Flip(0, 1000, FlipMode.FlipY); // k.Flip(1000, 2000, FlipMode.FlipX); // k.Move(Easing.Linear, // 0, 10000, // (-107, 240), // (854, 240) // ); //}); //_list.Add(ele); var file = @"D:\Games\osu!\Songs\161089 Tamura Yukari - MERRY MERRY MERRY MENU Ne!\Tamura Yukari - MERRY MERRY MERRY MENU... Ne! (moonlightleaf).osb"; var folder = System.IO.Path.GetDirectoryName(file); _group = _canvasHost.CreateStoryboardGroup(); //var folder = @"D:\Games\osu!\Songs\ok"; var eg = ElementGroup.ParseFromFile(file); var min = eg.ElementList.Min(k => k.MinTime); if (min > 0) { min = 0; } int i = int.MinValue; foreach (var ec in eg.ElementList) { if (ec is AnimatedElement) { continue; } if (!(ec is Element element)) { continue; } var imagePath = System.IO.Path.Combine(folder, element.ImagePath); if (!element.ImagePath.Contains(".")) { imagePath += ".jpg"; } var origin = ParseOrigin(element.Origin); var x = element.DefaultX; var y = element.DefaultY; if (!System.IO.File.Exists(imagePath)) { var withoutExt = System.IO.Path.GetFileNameWithoutExtension(imagePath); var ext = System.IO.Path.GetExtension(imagePath); var newFolder = System.IO.Path.GetDirectoryName(imagePath); if (ext.ToLower() == ".jpg") { imagePath = System.IO.Path.Combine(newFolder, $"{withoutExt}.png"); } else if (ext.ToLower() == ".png") { imagePath = System.IO.Path.Combine(newFolder, $"{withoutExt}.jpg"); } } if (!System.IO.File.Exists(imagePath)) { continue; } var bitmap = new BitmapImage(new Uri(imagePath)); _bitmaps.Add(bitmap); var container = new Border() { Width = bitmap.PixelWidth, Height = bitmap.PixelHeight, Child = new Image { Source = bitmap, Height = bitmap.PixelHeight, Width = bitmap.PixelWidth, RenderTransformOrigin = new Point(0.5, 0.5), RenderTransform = new ScaleTransform(1, 1) } }; var ele = _group.CreateElement(container, origin, bitmap.PixelWidth, bitmap.PixelHeight, i, x, y); ele.ApplyAnimation(k => { foreach (var commonEvent in element.EventList) { double startT = commonEvent.StartTime - min, endT = commonEvent.EndTime - min; if (commonEvent.EventType == EventTypes.Move) { var evt = (Move)commonEvent; k.Move((Easing)evt.Easing, startT, endT, new Vector2 <double>(evt.StartX, evt.StartY), new Vector2 <double>(evt.EndX, evt.EndY)); } else if (commonEvent.EventType == EventTypes.Fade) { var evt = (Fade)commonEvent; k.Fade((Easing)evt.Easing, startT, endT, evt.StartOpacity, evt.EndOpacity); } else if (commonEvent.EventType == EventTypes.Scale) { var evt = (Scale)commonEvent; k.ScaleVec((Easing)evt.Easing, startT, endT, new Vector2 <double>(evt.StartScale, evt.StartScale), new Vector2 <double>(evt.EndScale, evt.EndScale)); } else if (commonEvent.EventType == EventTypes.Rotate) { var evt = (Rotate)commonEvent; k.Rotate((Easing)evt.Easing, startT, endT, evt.StartRotate, evt.EndRotate); } else if (commonEvent.EventType == EventTypes.Color) { var evt = (Storyboard.Events.Color)commonEvent; k.Color((Easing)evt.Easing, startT, endT, new Vector3 <double>(evt.StartR, evt.StartG, evt.StartB), new Vector3 <double>(evt.EndR, evt.EndG, evt.EndB)); } else if (commonEvent.EventType == EventTypes.MoveX) { var evt = (MoveX)commonEvent; k.MoveX((Easing)evt.Easing, startT, endT, evt.StartX, evt.EndX); } else if (commonEvent.EventType == EventTypes.MoveY) { var evt = (MoveY)commonEvent; k.MoveY((Easing)evt.Easing, startT, endT, evt.StartY, evt.EndY); } else if (commonEvent.EventType == EventTypes.Vector) { var evt = (Storyboard.Events.Vector)commonEvent; k.ScaleVec((Easing)evt.Easing, startT, endT, new Vector2 <double>(evt.StartScaleX, evt.StartScaleY), new Vector2 <double>(evt.EndScaleX, evt.EndScaleY)); } else if (commonEvent.EventType == EventTypes.Parameter) { var evt = (Parameter)commonEvent; switch (evt.Type) { case ParameterType.Horizontal: k.Flip(startT, endT, FlipMode.FlipX); break; case ParameterType.Vertical: k.Flip(startT, endT, FlipMode.FlipY); break; case ParameterType.Additive: //k.Blend(startT, endT, BlendMode.Normal); break; default: throw new ArgumentOutOfRangeException(); } } else if (commonEvent.EventType == EventTypes.Loop) { } else if (commonEvent.EventType == EventTypes.Trigger) { } } }); _list.Add(ele); i++; } Console.WriteLine(sw.ElapsedMilliseconds); }