所以我想要我在游戏中使用的 MapEditor 的撤消功能。我得到了部分工作。当我点击地图时,它会将新旧图块存储在单独的列表中。当我按 Ctrl + Z 时,它将撤消最后一个操作,依此类推。
我的问题是当您撤消一些操作,然后将新操作添加到列表中时。那应该怎么办?我应该在列表末尾添加新操作,还是应该从列表中的当前位置删除所有内容直到最后,然后将新操作添加到列表中。
我的问题是我无法解决这个问题。我已经尝试了多种方法,但是当这种情况发生时,它们都被破坏了。
同样,我需要知道在将新操作添加到撤消列表时如何进行。
添加到撤消列表时我当前的代码:
private void UpdateCorrectedTiles(Dictionary<TileSide, Tile> correctedTiles, bool saveEditedTiles)
{
List<Tile> tmpUndoTilesList = new List<Tile>();
List<Tile> tmpRedoTilesList = new List<Tile>();
foreach (Tile tile in tiles)
{
foreach (KeyValuePair<TileSide, Tile> correctedTile in correctedTiles)
{
if (tile.GetTilePosition() == correctedTile.Value.GetTilePosition())
{
if (correctedTile.Key == TileSide.Clicked && saveEditedTiles
&& Tile.IsTileChanged(previousClickedTile, correctedTile.Value))
{
Tile undoTile = Tile.CreateCloneTile(previousClickedTile);
Tile redoTile = correctedTile.Value;
tmpUndoTilesList.Add(undoTile);
tmpRedoTilesList.Add(redoTile);
}
TileInfo info = correctedTile.Value.GetTileInfo();
Vector2 frames = correctedTile.Value.GetCurrentFrame();
tile.SetTileInfo(info);
tile.SetCurrentFrame(frames);
}
}
}
if (saveEditedTiles && tmpUndoTilesList.Count > 0 && tmpRedoTilesList.Count > 0)
{
undoTilesList.Add(tmpUndoTilesList);
redoTilesList.Add(tmpRedoTilesList);
currentUndoRedoIndex = undoTilesList.Count - 1;
}
}
这段代码的作用是在 Foreach 中,它将遍历所有已更正的图块。如果更正的图块是被点击的图块并且它实际上已经改变了,它将把它添加到撤消和重做列表中。您现在应该忽略重做列表,因为重做功能尚未实现。我想让撤消功能首先工作。
因此,在函数的最后一部分,我将新操作添加到列表中,但同样,我认为我需要做其他事情,然后当您在列表中的某个位置而不是最后时添加。
希望你明白我想要什么。
谢谢!