Поэтому мне нужна функция отмены для 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, он будет перебирать все плитки, которые были исправлены. Если исправленная плитка является плиткой, на которую нажали, и она действительно изменилась, она добавит ее в список отмены и повтора. Вы должны пока игнорировать список повторов, так как функциональность повторов еще не реализована. я хочу, чтобы функция отмены работала в первую очередь.
Итак, в последней части функции я добавляю новые действия в списки, но опять же, я думаю, что мне нужно сделать что-то еще, кроме добавления, когда вы находитесь где-то в списке, а не в конце.
Надеюсь, вы понимаете, чего я хочу.
Спасибо!
undoList, так и кredoList? - person Mohammad Dehghan   schedule 16.03.2013