VPet/VPet-Simulator.Core/Display/Main.xaml.cs

367 lines
12 KiB
C#
Raw Normal View History

2023-05-19 08:17:51 +00:00
using LinePutScript;
using Panuon.WPF.UI;
2023-02-21 11:37:01 +00:00
using System;
2022-12-13 07:10:18 +00:00
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;
2023-03-07 08:13:14 +00:00
using static VPet_Simulator.Core.GraphCore;
2022-12-13 07:10:18 +00:00
namespace VPet_Simulator.Core
{
/// <summary>
/// Main.xaml 的交互逻辑
/// </summary>
2023-02-21 11:37:01 +00:00
public partial class Main : ContentControlX, IDisposable
2022-12-13 07:10:18 +00:00
{
2023-01-08 16:57:10 +00:00
/// <summary>
/// 游戏核心
/// </summary>
2022-12-13 07:10:18 +00:00
public GameCore Core;
2023-01-08 16:57:10 +00:00
/// <summary>
/// 菜单栏
/// </summary>
2023-01-11 13:10:18 +00:00
public ToolBar ToolBar;
/// <summary>
2023-05-22 20:18:59 +00:00
/// 消息栏
2023-01-11 13:10:18 +00:00
/// </summary>
public MessageBar MsgBar;
2023-01-08 16:57:10 +00:00
/// <summary>
2023-05-22 20:18:59 +00:00
/// 工作显示栏
/// </summary>
public WorkTimer WorkTimer;
/// <summary>
2023-01-08 16:57:10 +00:00
/// 刷新时间时会调用该方法
/// </summary>
public event Action<Main> TimeHandle;
/// <summary>
/// 刷新时间时会调用该方法,在所有任务处理完之后
/// </summary>
public event Action<Main> TimeUIHandle;
2023-05-15 10:44:30 +00:00
/// <summary>
2023-06-05 09:18:27 +00:00
/// 如果不开启功能模式,默认状态设置
/// </summary>
public GameSave.ModeType NoFunctionMOD = GameSave.ModeType.Happy;
/// <summary>
2023-05-15 10:44:30 +00:00
/// 是否开始运行
/// </summary>
public bool IsWorking { get; private set; } = false;
2023-02-20 08:47:44 +00:00
public Main(GameCore core, bool loadtouchevent = true)
2022-12-13 07:10:18 +00:00
{
2023-02-22 05:37:23 +00:00
Console.WriteLine(DateTime.Now.ToString("T:fff"));
2022-12-13 07:10:18 +00:00
InitializeComponent();
Core = core;
2023-05-22 20:18:59 +00:00
WorkTimer = new WorkTimer(this);
WorkTimer.Visibility = Visibility.Collapsed;
UIGrid.Children.Add(WorkTimer);
2023-01-11 13:10:18 +00:00
ToolBar = new ToolBar(this);
ToolBar.Visibility = Visibility.Collapsed;
2023-05-19 08:17:51 +00:00
ToolBar.MenuWork1.Header = core.Graph.GraphConfig.Str[(gstr)"work1"];
ToolBar.MenuWork2.Header = core.Graph.GraphConfig.Str[(gstr)"work2"];
2023-01-11 13:10:18 +00:00
UIGrid.Children.Add(ToolBar);
2023-01-26 15:15:37 +00:00
MsgBar = new MessageBar(this);
2023-01-11 13:10:18 +00:00
MsgBar.Visibility = Visibility.Collapsed;
UIGrid.Children.Add(MsgBar);
2023-01-27 17:44:57 +00:00
2023-05-22 20:18:59 +00:00
2023-01-27 17:44:57 +00:00
if (loadtouchevent)
{
LoadTouchEvent();
}
2023-06-05 09:18:27 +00:00
if (!core.Controller.EnableFunction)
Core.Save.Mode = NoFunctionMOD;
2023-03-06 09:46:13 +00:00
var ig = Core.Graph.FindGraph(GraphCore.GraphType.StartUP, core.Save.Mode);
2023-05-09 23:16:58 +00:00
//var ig2 = Core.Graph.FindGraph(GraphCore.GraphType.Default, core.GameSave.Mode);
2023-02-13 09:48:59 +00:00
PetGrid2.Visibility = Visibility.Collapsed;
2023-05-31 17:47:23 +00:00
Task.Run(() =>
2023-04-04 09:32:53 +00:00
{
2023-05-31 17:47:23 +00:00
while (!ig.IsReady)
{
Thread.Sleep(100);
}
ig.Run(PetGrid, () =>
2023-04-04 09:32:53 +00:00
{
2023-05-31 17:47:23 +00:00
IsWorking = true;
Dispatcher.Invoke(() =>
{
PetGrid.Tag = ig;
PetGrid2.Tag = ig;
});
DisplayNomal();
2023-04-04 09:32:53 +00:00
});
2023-03-26 22:35:19 +00:00
});
2023-04-04 09:32:53 +00:00
2022-12-13 07:10:18 +00:00
EventTimer.Elapsed += EventTimer_Elapsed;
2022-12-14 18:17:13 +00:00
MoveTimer.Elapsed += MoveTimer_Elapsed;
2023-01-24 06:56:16 +00:00
SmartMoveTimer.Elapsed += SmartMoveTimer_Elapsed;
2022-12-14 18:17:13 +00:00
}
2023-01-27 17:44:57 +00:00
/// <summary>
/// 自动加载触摸事件
/// </summary>
public void LoadTouchEvent()
{
Core.TouchEvent.Add(new TouchArea(Core.Graph.GraphConfig.TouchHeadLocate, Core.Graph.GraphConfig.TouchHeadSize, () => { DisplayTouchHead(); return true; }));
for (int i = 0; i < 4; i++)
{
GameSave.ModeType m = (GameSave.ModeType)i;
Core.TouchEvent.Add(new TouchArea(Core.Graph.GraphConfig.TouchRaisedLocate[i], Core.Graph.GraphConfig.TouchRaisedSize[i],
() =>
{
if (Core.Save.Mode == m)
{
DisplayRaised();
return true;
}
else
return false;
}, true));
}
2023-01-27 17:44:57 +00:00
}
2023-05-25 11:02:13 +00:00
/// <summary>
2023-05-25 17:50:38 +00:00
/// 播放语音 语音播放时不会停止播放说话表情
2023-05-25 11:02:13 +00:00
/// </summary>
/// <param name="VoicePath">语音位置</param>
2023-05-25 17:50:38 +00:00
public void PlayVoice(Uri VoicePath)//, TimeSpan timediff = TimeSpan.Zero) TODO
2023-05-25 11:02:13 +00:00
{
2023-05-25 17:50:38 +00:00
PlayingVoice = true;
Dispatcher.Invoke(() =>
{
VoicePlayer.Clock = new MediaTimeline(VoicePath).CreateClock();
VoicePlayer.Clock.Completed += Clock_Completed;
VoicePlayer.Play();
//Task.Run(() =>
//{
// Thread.Sleep(1000);
// Dispatcher.Invoke(() =>
// {
// if (VoicePlayer?.Clock?.NaturalDuration.HasTimeSpan == true)
// PlayEndTime += VoicePlayer.Clock.NaturalDuration.TimeSpan - TimeSpan.FromSeconds(0.8);
// });
//});
});
}
/// <summary>
/// 声音音量
/// </summary>
public double PlayVoiceVolume
{
get => Dispatcher.Invoke(() => VoicePlayer.Volume);
set => Dispatcher.Invoke(() => VoicePlayer.Volume = value);
}
/// <summary>
/// 当前是否正在播放
/// </summary>
public bool PlayingVoice = false;
private void Clock_Completed(object sender, EventArgs e)
{
PlayingVoice = false;
VoicePlayer.Clock = null;
2023-05-25 11:02:13 +00:00
}
2023-01-24 06:56:16 +00:00
private void SmartMoveTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
MoveTimer.AutoReset = false;
}
2022-12-14 18:17:13 +00:00
private void MoveTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
2023-01-25 04:49:18 +00:00
string str = DisplayType.ToString();
2023-04-04 09:32:53 +00:00
if (MoveTimer.Enabled == false || (!str.Contains("Left") && !str.Contains("Right")))
2023-01-25 04:49:18 +00:00
{
MoveTimer.Enabled = false;
2023-04-04 09:32:53 +00:00
return;
2023-01-25 04:49:18 +00:00
}
2023-04-04 09:32:53 +00:00
Core.Controller.MoveWindows(MoveTimerPoint.X, MoveTimerPoint.Y);
2022-12-13 07:10:18 +00:00
}
2023-01-13 14:45:42 +00:00
public Action DefaultClickAction;
2022-12-13 07:10:18 +00:00
bool isPress = false;
long presstime;
2022-12-13 07:10:18 +00:00
private void MainGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
isPress = true;
CountNomal = 0;
2023-01-19 15:26:58 +00:00
if (DisplayType != GraphCore.GraphType.Default)
2022-12-14 18:17:13 +00:00
{//不是nomal! 可能会卡timer,所有全部timer清空下
2023-01-20 17:01:10 +00:00
CleanState();
2023-05-19 08:17:51 +00:00
if (DisplayStopMove(DisplayToNomal))
2023-01-19 15:26:58 +00:00
return;
2022-12-14 18:17:13 +00:00
}
2022-12-13 07:10:18 +00:00
Task.Run(() =>
{
var pth = DateTime.Now.Ticks;
presstime = pth;
2023-01-21 14:16:13 +00:00
Thread.Sleep(Core.Controller.PressLength);
2022-12-13 07:10:18 +00:00
Point mp = default;
Dispatcher.BeginInvoke(new Action(() => mp = Mouse.GetPosition(MainGrid))).Wait();
2023-01-24 06:56:16 +00:00
//mp = new Point(mp.X * Core.Controller.ZoomRatio, mp.Y * Core.Controller.ZoomRatio);
if (isPress && presstime == pth)
2022-12-13 07:10:18 +00:00
{//历遍长按事件
2023-06-14 11:13:52 +00:00
LastInteractionTime = DateTime.Now;
foreach (var x in Core.TouchEvent)
{
if (x.IsPress == true && x.Touch(mp) && x.DoAction())
return;
}
2022-12-13 07:10:18 +00:00
}
else
{//历遍点击事件
2023-06-14 11:13:52 +00:00
LastInteractionTime = DateTime.Now;
foreach (var x in Core.TouchEvent)
{
if (x.IsPress == false && x.Touch(mp) && x.DoAction())
return;
}
DefaultClickAction?.Invoke();
2022-12-13 07:10:18 +00:00
}
});
}
private void MainGrid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
isPress = false;
if (DisplayType.ToString().StartsWith("Raised"))
2022-12-13 07:10:18 +00:00
{
MainGrid.MouseMove -= MainGrid_MouseMove;
2023-02-20 08:47:44 +00:00
MainGrid.MouseMove += MainGrid_MouseWave;
2022-12-13 07:10:18 +00:00
rasetype = -1;
DisplayRaising();
2022-12-13 07:10:18 +00:00
}
2023-01-26 15:15:37 +00:00
else
2023-01-24 06:56:16 +00:00
{
2023-01-26 15:15:37 +00:00
//if (MsgBar.Visibility == Visibility.Visible)
//{
// MsgBar.ForceClose();
//}
if (SmartMove)
{
MoveTimer.AutoReset = true;
SmartMoveTimer.Enabled = false;
2023-01-26 15:15:37 +00:00
SmartMoveTimer.Start();
}
2023-01-24 06:56:16 +00:00
}
((UIElement)e.Source).ReleaseMouseCapture();
2022-12-13 07:10:18 +00:00
}
private void MainGrid_MouseMove(object sender, MouseEventArgs e)
{
((UIElement)e.Source).CaptureMouse();
2022-12-13 07:10:18 +00:00
var mp = e.GetPosition(MainGrid);
2023-03-01 22:51:07 +00:00
var x = mp.X - Core.Graph.GraphConfig.RaisePoint[(int)Core.Save.Mode].X;
var y = mp.Y - Core.Graph.GraphConfig.RaisePoint[(int)Core.Save.Mode].Y;
2022-12-13 07:10:18 +00:00
Core.Controller.MoveWindows(x, y);
if (Math.Abs(x) + Math.Abs(y) > 10)
rasetype = 0;
}
2023-01-11 13:44:16 +00:00
private void MainGrid_MouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
2023-06-14 11:13:52 +00:00
if (ToolBar.Visibility == Visibility.Visible)
{
ToolBar.CloseTimer.Enabled = false;
ToolBar.Visibility = Visibility.Collapsed;
}
else
ToolBar.Show();
2023-01-11 13:44:16 +00:00
}
2023-01-19 15:26:58 +00:00
2023-01-12 22:11:55 +00:00
public void Dispose()
{
EventTimer.Stop();
2023-05-27 10:37:15 +00:00
MoveTimer.Enabled = false;
2023-01-12 22:11:55 +00:00
EventTimer.Dispose();
MoveTimer.Dispose();
2023-01-20 17:01:10 +00:00
MsgBar.Dispose();
ToolBar.Dispose();
2023-01-12 22:11:55 +00:00
if (PetGrid.Child is IGraph g)
2023-01-20 17:01:10 +00:00
g.Stop(true);
2023-01-12 22:11:55 +00:00
if (PetGrid2.Child is IGraph g2)
2023-01-20 17:01:10 +00:00
g2.Stop(true);
}
/// <summary>
/// 清理所有状态
/// </summary>
public void CleanState()
{
MoveTimer.Enabled = false;
2023-01-20 17:01:10 +00:00
MainGrid.MouseMove -= MainGrid_MouseMove;
2023-02-20 08:47:44 +00:00
MainGrid.MouseMove += MainGrid_MouseWave;
}
private int wavetimes = 0;
private int switchcount = 0;
private bool? waveleft = null;
private bool? wavetop = null;
private DateTime wavespan;
private void MainGrid_MouseWave(object sender, MouseEventArgs e)
2023-05-22 20:18:59 +00:00
{
2023-05-19 08:17:51 +00:00
if (rasetype >= 0 || State != WorkingState.Nomal)
return;
2023-02-21 11:37:01 +00:00
if ((DateTime.Now - wavespan).TotalSeconds > 2)
2023-02-20 08:47:44 +00:00
{
wavetimes = 0;
switchcount = 0;
waveleft = null;
wavetop = null;
}
wavespan = DateTime.Now;
bool active = false;
var p = e.GetPosition(MainGrid);
if (p.Y < 200)
{
if (wavetop != false)
wavetop = true;
else
{
if (switchcount++ > 150)
wavespan = DateTime.MinValue;
return;
}
}
else
{
2023-02-21 11:37:01 +00:00
if (wavetop != true)
2023-02-20 08:47:44 +00:00
wavetop = false;
else
{
if (switchcount++ > 150)
wavespan = DateTime.MinValue;
return;
}
}
if (p.X < 200 && waveleft != true)
{
waveleft = true;
active = true;
}
if (p.X > 300 && waveleft != false)
{
active = true;
waveleft = false;
}
if (active)
{
2023-03-07 08:13:14 +00:00
if (wavetimes++ > 4)
2023-02-20 08:47:44 +00:00
if (wavetop == true)
{
2023-03-07 08:13:14 +00:00
if (wavetimes >= 10 || DisplayType == GraphCore.GraphType.Default || DisplayType == GraphType.Touch_Head_B_Loop || DisplayType == GraphType.Touch_Head_C_End)
DisplayTouchHead();
2023-02-21 11:37:01 +00:00
//Console.WriteLine(wavetimes);
2023-02-20 08:47:44 +00:00
}
else
{
2023-03-07 08:13:14 +00:00
if (wavetimes >= 10 || DisplayType == GraphCore.GraphType.Default || DisplayType == GraphType.Touch_Body_B_Loop || DisplayType == GraphType.Touch_Body_C_End)
DisplayTouchBody();
2023-02-20 08:47:44 +00:00
}
}
2023-01-12 22:11:55 +00:00
}
2022-12-13 07:10:18 +00:00
}
}