そのため、ゲームで作業している 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 であり、修正されたすべてのタイルをループします。修正されたタイルがクリックされたタイルであり、実際に変更された場合、元に戻すおよびやり直しリストに追加されます。やり直し機能はまだ実装されていないため、やり直しリストは無視してください。元に戻す機能を最初に機能させたい。
したがって、関数の最後の部分で、新しいアクションをリストに追加しますが、別のことをしてから、最後ではなくリストのどこかにいるときに追加する必要があると思います。
私が何を望んでいるのか理解していただければ幸いです。
ありがとう!