diff --git a/VPet.ModMaker/Models/Expansions.cs b/VPet.ModMaker/Models/Expansions.cs
index 41160bf..8f8208d 100644
--- a/VPet.ModMaker/Models/Expansions.cs
+++ b/VPet.ModMaker/Models/Expansions.cs
@@ -40,4 +40,43 @@ public static class Extensions
dictionary.Add(key, value);
return true;
}
+
+ ///
+ /// 流内容对比
+ ///
+ /// 原始流
+ /// 目标流
+ /// 缓冲区大小 (越大速度越快(流内容越大效果越明显), 但会提高内存占用 (bufferSize = bufferLength * sizeof(long) * 2))
+ /// 内容相同为 否则为
+ public static bool ContentsEqual(this Stream source, Stream target, int bufferLength = 8)
+ {
+ int bufferSize = bufferLength * sizeof(long);
+ var sourceBuffer = new byte[bufferSize];
+ var targetBuffer = new byte[bufferSize];
+ while (true)
+ {
+ int sourceCount = ReadFullBuffer(source, sourceBuffer);
+ int targetCount = ReadFullBuffer(target, targetBuffer);
+ if (sourceCount != targetCount)
+ return false;
+ if (sourceCount == 0)
+ return true;
+
+ for (int i = 0; i < sourceCount; i += sizeof(long))
+ if (BitConverter.ToInt64(sourceBuffer, i) != BitConverter.ToInt64(targetBuffer, i))
+ return false;
+ }
+ static int ReadFullBuffer(Stream stream, byte[] buffer)
+ {
+ int bytesRead = 0;
+ while (bytesRead < buffer.Length)
+ {
+ int read = stream.Read(buffer, bytesRead, buffer.Length - bytesRead);
+ if (read == 0)
+ return bytesRead;
+ bytesRead += read;
+ }
+ return bytesRead;
+ }
+ }
}
diff --git a/VPet.ModMaker/Models/ModModel/AnimeModel.cs b/VPet.ModMaker/Models/ModModel/AnimeModel.cs
new file mode 100644
index 0000000..a675e42
--- /dev/null
+++ b/VPet.ModMaker/Models/ModModel/AnimeModel.cs
@@ -0,0 +1,16 @@
+using HKW.HKWViewModels.SimpleObservable;
+using System;
+using System.Collections.Generic;
+using System.Collections.ObjectModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace VPet.ModMaker.Models.ModModel;
+
+public class AnimeModel
+{
+ public ObservableValue CurrentImageModel { get; } = new();
+ public ObservableCollection ImageModels { get; } = new();
+}
diff --git a/VPet.ModMaker/Models/ModModel/ImageModel.cs b/VPet.ModMaker/Models/ModModel/ImageModel.cs
new file mode 100644
index 0000000..657572d
--- /dev/null
+++ b/VPet.ModMaker/Models/ModModel/ImageModel.cs
@@ -0,0 +1,21 @@
+using HKW.HKWViewModels.SimpleObservable;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media.Imaging;
+
+namespace VPet.ModMaker.Models.ModModel;
+
+public class ImageModel
+{
+ public ObservableValue Image { get; } = new();
+
+ public ObservableValue Duration { get; } = new(100);
+
+ public ImageModel(BitmapImage image)
+ {
+ Image.Value = image;
+ }
+}
diff --git a/VPet.ModMaker/VPet.ModMaker.csproj b/VPet.ModMaker/VPet.ModMaker.csproj
index 5111afb..7b06b7c 100644
--- a/VPet.ModMaker/VPet.ModMaker.csproj
+++ b/VPet.ModMaker/VPet.ModMaker.csproj
@@ -98,11 +98,13 @@
+
+
@@ -114,6 +116,7 @@
+
@@ -129,6 +132,9 @@
+
+ AnimeEditWindow.xaml
+
ClickTextPage.xaml
@@ -227,6 +233,10 @@
Designer
MSBuild:Compile
+
+ Designer
+ MSBuild:Compile
+
Designer
MSBuild:Compile
diff --git a/VPet.ModMaker/ViewModels/ModEdit/AnimeEdit/AnimeEditWindowVM.cs b/VPet.ModMaker/ViewModels/ModEdit/AnimeEdit/AnimeEditWindowVM.cs
new file mode 100644
index 0000000..a20a45f
--- /dev/null
+++ b/VPet.ModMaker/ViewModels/ModEdit/AnimeEdit/AnimeEditWindowVM.cs
@@ -0,0 +1,61 @@
+using HKW.HKWViewModels.SimpleObservable;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using VPet.ModMaker.Models;
+using VPet.ModMaker.Models.ModModel;
+
+namespace VPet.ModMaker.ViewModels.ModEdit.AnimeEdit;
+
+public class AnimeEditWindowVM
+{
+ public AnimeModel OldAnime { get; set; }
+ public ObservableValue Anime { get; } = new(new());
+ #region Command
+ public ObservableCommand PlayCommand { get; } = new();
+ public ObservableCommand PauseCommand { get; } = new();
+ #endregion
+
+ public bool _pause = false;
+ public Task _playerTask;
+
+ public AnimeEditWindowVM()
+ {
+ foreach (
+ var file in Directory.EnumerateFiles(
+ @"C:\Users\HKW\Desktop\TestPicture\0000_core\pet\vup\Default\Happy\1"
+ )
+ )
+ {
+ Anime.Value.ImageModels.Add(new(Utils.LoadImageToMemoryStream(file)));
+ }
+ _playerTask = new(Play);
+ PlayCommand.ExecuteEvent += PlayCommand_ExecuteEvent;
+ PauseCommand.ExecuteEvent += PauseCommand_ExecuteEvent;
+ }
+
+ private void PauseCommand_ExecuteEvent()
+ {
+ _pause = true;
+ }
+
+ private void PlayCommand_ExecuteEvent()
+ {
+ _playerTask.Start();
+ }
+
+ private void Play()
+ {
+ while (_pause is false)
+ {
+ foreach (var model in Anime.Value.ImageModels)
+ {
+ Anime.Value.CurrentImageModel.Value = model;
+ Task.Delay(model.Duration.Value).Wait();
+ }
+ }
+ }
+}
diff --git a/VPet.ModMaker/Views/ModEdit/AnimeEdit/AnimeEditWindow.xaml b/VPet.ModMaker/Views/ModEdit/AnimeEdit/AnimeEditWindow.xaml
new file mode 100644
index 0000000..007087c
--- /dev/null
+++ b/VPet.ModMaker/Views/ModEdit/AnimeEdit/AnimeEditWindow.xaml
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/VPet.ModMaker/Views/ModEdit/AnimeEdit/AnimeEditWindow.xaml.cs b/VPet.ModMaker/Views/ModEdit/AnimeEdit/AnimeEditWindow.xaml.cs
new file mode 100644
index 0000000..ec79224
--- /dev/null
+++ b/VPet.ModMaker/Views/ModEdit/AnimeEdit/AnimeEditWindow.xaml.cs
@@ -0,0 +1,66 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+using VPet.ModMaker.ViewModels.ModEdit.AnimeEdit;
+
+namespace VPet.ModMaker.Views.ModEdit.AnimeEdit;
+
+///
+/// AnimeEditWindow.xaml 的交互逻辑
+///
+public partial class AnimeEditWindow : Window
+{
+ public AnimeEditWindow()
+ {
+ InitializeComponent();
+ DataContext = new AnimeEditWindowVM();
+ }
+
+ public AnimeEditWindowVM ViewModel => (AnimeEditWindowVM)DataContext;
+
+ public bool IsCancel { get; private set; } = true;
+
+ private void Button_Cancel_Click(object sender, RoutedEventArgs e)
+ {
+ Close();
+ }
+
+ private void Button_Yes_Click(object sender, RoutedEventArgs e)
+ {
+ //if (string.IsNullOrEmpty(ViewModel.Work.Value.Id.Value))
+ //{
+ // MessageBox.Show("Id不可为空".Translate(), "", MessageBoxButton.OK, MessageBoxImage.Warning);
+ // return;
+ //}
+ //if (string.IsNullOrEmpty(ViewModel.Work.Value.Graph.Value))
+ //{
+ // MessageBox.Show(
+ // "指定动画Id不可为空".Translate(),
+ // "",
+ // MessageBoxButton.OK,
+ // MessageBoxImage.Warning
+ // );
+ // return;
+ //}
+ //if (
+ // ViewModel.OldWork?.Id.Value != ViewModel.Work.Value.Id.Value
+ // && ViewModel.CurrentPet.Works.Any(i => i.Id.Value == ViewModel.Work.Value.Id.Value)
+ //)
+ //{
+ // MessageBox.Show("此Id已存在".Translate(), "", MessageBoxButton.OK, MessageBoxImage.Warning);
+ // return;
+ //}
+ IsCancel = false;
+ Close();
+ }
+}
diff --git a/VPet.ModMaker/Views/ModMakerWindow.xaml.cs b/VPet.ModMaker/Views/ModMakerWindow.xaml.cs
index 5952ca3..10d2654 100644
--- a/VPet.ModMaker/Views/ModMakerWindow.xaml.cs
+++ b/VPet.ModMaker/Views/ModMakerWindow.xaml.cs
@@ -18,6 +18,7 @@ using System.Windows.Shapes;
using VPet.ModMaker.Models;
using VPet.ModMaker.ViewModels;
using VPet.ModMaker.Views.ModEdit;
+using VPet.ModMaker.Views.ModEdit.AnimeEdit;
using VPet.ModMaker.Views.ModEdit.PetEdit;
namespace VPet.ModMaker.Views;
@@ -35,6 +36,7 @@ public partial class ModMakerWindow : Window
{
InitializeComponent();
DataContext = new ModMakerWindowVM(this);
+ new AnimeEditWindow().Show();
}
private void ListBoxItem_MouseDoubleClick(object sender, MouseButtonEventArgs e)