using System.Collections.Generic; using System; using Godot; using System.Linq; public class MoveRecords { private readonly LinkedList records = new LinkedList(); // 使用队列替换栈 private readonly int maxRecords; // 记录上限 private Action onAddRecordCallback; // 添加记录时的回调 private 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(Node newNode, Node 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 Node NewNode { get; } public Node OldNode { get; } public Vector2 NewPos { get; } public Vector2 OldPos { get; } public MoveRecord(Node newNode, Node oldNode, Vector2 newPos, Vector2 oldPos) { this.NewNode = newNode; this.OldNode = oldNode; this.OldPos = oldPos; this.NewPos = newPos; } } }