// using System.Numerics; using Godot; using System.Collections.Generic; using System; public class MoveRecords { private readonly LinkedList records = new LinkedList(); // 使用队列替换栈 private readonly int maxRecords; // 记录上限 private readonly Action onAddRecordCallback; // 添加记录时的回调 private readonly Action onUndoRecordCallback; // 撤销记录时的回调 public MoveRecords( Action onAddRecordCallback = null, Action onUndoRecordCallback = null, int maxRecords = 32) { this.maxRecords = maxRecords; this.onAddRecordCallback = onAddRecordCallback; this.onUndoRecordCallback = onUndoRecordCallback; } public void AddRecord(T newNode, T oldNode, Vector2 newPos, Vector2 oldPos) { // 达到记录上限时,移除最远的记录(队首元素) if (records.Count >= maxRecords) { records.RemoveFirst(); } var record = new MoveRecord(newNode, oldNode, newPos, oldPos); // 触发添加记录的回调 onAddRecordCallback?.Invoke(newNode, oldNode, newPos, oldPos); // GD.Print("In func Addrecord: ", record.NewNode, "->", record.OldNode, ":", record.NewPos, "->", record.OldPos); records.AddLast(record); // 将新记录加入队尾 } public void Undo() { if (records.Count == 0) return; MoveRecord record = records.Last.Value; // 移除并获取队首的记录以执行撤销操作 records.RemoveLast(); // 触发撤销记录的回调 onUndoRecordCallback?.Invoke(record.NewNode, record.OldNode, record.NewPos, record.OldPos); } public void Clear() { records.Clear(); } private class MoveRecord { public T NewNode { get; } public T OldNode { get; } public Vector2 NewPos { get; } public Vector2 OldPos { get; } public MoveRecord(T newNode, T oldNode, Vector2 newPos, Vector2 oldPos) { NewNode = newNode; OldNode = oldNode; OldPos = oldPos; NewPos = newPos; } } }