59 lines
2.2 KiB
C#
59 lines
2.2 KiB
C#
// using System.Numerics;
|
|
using Godot;
|
|
|
|
using System.Collections.Generic;
|
|
using System;
|
|
|
|
public class MoveRecords<T> {
|
|
private readonly LinkedList<MoveRecord> records = new LinkedList<MoveRecord>(); // 使用队列替换栈
|
|
private readonly int maxRecords; // 记录上限
|
|
private Action<T, T, Vector2, Vector2> onAddRecordCallback; // 添加记录时的回调
|
|
private Action<T, T, Vector2, Vector2> onUndoRecordCallback; // 撤销记录时的回调
|
|
|
|
public MoveRecords(
|
|
Action<T, T, Vector2, Vector2> onAddRecordCallback = null,
|
|
Action<T, T, Vector2, Vector2> 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;
|
|
}
|
|
}
|
|
} |