using Godot; using System; using System.Timers; namespace BITKit; /// /// 默认的String数据播放器,主要应用于播放json /// public partial class DataPlayer : Node { //参数 /// /// 当前帧 /// [Export] public int CurrentFrame { get => _currentFrame; set => _currentFrame = Math.Clamp(value, 0, Values?.Length ?? 0); } /// /// 播放帧率 /// [Export] private int frameRate = 60; [Export] private string timeFormat="mm:ss:fff"; /// /// 基于帧率的每帧播放数据 /// [Signal] public delegate void OnProcessPlayEventHandler(string value); /// /// 开始播放回调 /// [Signal] public delegate void OnPlayEventHandler(); /// /// 暂停回调 /// [Signal] public delegate void OnPauseEventHandler(); /// /// 播放和暂停回调 /// [Signal] public delegate void OnPlayOrPauseEventHandler(bool isPlaying); /// /// 设置总播放时间的回调 /// [Signal] public delegate void OnSetTotalTimeEventHandler(string dateTimeString); /// /// 设置当前播放时间的回调 /// [Signal] public delegate void OnSetPlaybackTimeEventHandler(string dateTimeString); /// /// 设置标准化播放时间的回调 /// [Signal] public delegate void OnSetNormalizeTimeEventHandler(double normalizeTime); /// /// 是否正在播放 /// public bool IsPlaying { get; protected set; } /// /// 是否已暂停播放 /// public bool IsPaused { get; protected set; } /// /// 内部计时器 /// private readonly System.Timers.Timer timer = new(); /// /// 内部数组 /// private string[] Values; //内部当前帧 private int _currentFrame; public override void _Ready() { timer.Elapsed += Play; } /// /// 播放 /// /// 播放数据的数组 public bool Play(string[] values) { if (values?.Length is 0) return false; if (values?.Length != Values?.Length) { CurrentFrame = 0; } Values = values; timer.Interval = TimeSpan.FromSeconds(1f / frameRate).Milliseconds; timer.Start(); return true; } /// /// 播放(在暂停时) /// /// public bool Play() { if (!IsPlaying) return false; IsPaused = false; return true; } /// /// 停止播放 /// /// public bool Stop() { if (!IsPlaying) return false; timer.Stop(); IsPlaying = IsPaused = false; return true; } /// /// 暂停播放 /// /// public bool Pause() { if (!IsPlaying) return false; IsPaused = true; return true; } /// /// 继续播放或暂停播放 /// /// public bool PlayOrPause() { if (!IsPlaying) return false; IsPaused = !IsPaused; return true; } protected override void Dispose(bool disposing) { timer.Stop(); timer.Dispose(); } /// /// 内部调用方法 /// /// /// protected virtual void Play(object sender, ElapsedEventArgs e) { if (IsPlaying is false || IsPaused) return; if (CurrentFrame > Values?.Length) { Stop(); return; } var current = Values?[CurrentFrame++]; var variant = Variant.From(current); EmitSignal(nameof(OnProcessPlayEventHandler), variant); } }