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 @@ + + + + + + + + + + + + + + + + + + + + + + +