2

差分スタイルの履歴ではなく、変更履歴を作成しようとしています。オブジェクト全体を保存することを選択しました。オブジェクトの各コピーが元のオブジェクトと一緒に更新されるため、これは問題になります。

このKinetic.Node.clone方法は私にとって正しいことのように思えましたが、私が期待することを実行していないようです。

擬似コード:

var History = function(){
  var h = this;
  h.history = [];
  h.pointer = -1;
  h.save = function() {
    h.history = h.history.slice(0,h.pointer);
    h.history.push(im.Stage.createCopy());
    h.movePointer(1);
  };
  h.movePointer = function(diff) {
    h.pointer += diff;
    (h.pointer < 0 && (h.pointer = 0));
    (h.pointer >= h.history.length && (h.pointer = h.history.length-1));
    return h.pointer;
  };
  h.render = function() {
    im.Stage = h.history[h.pointer].createCopy();
    im.Stage.draw();
  };
  h.undo = function() {
    h.movePointer(-1);
    h.render();
  };
  h.redo = function() {
    h.movePointer(1);
    h.render();
  };
};

ステージの正確なコピーを作成するにはどうすればよいですか?

4

2 に答える 2

0

正確に表現するための最良の方法は、次のことを行うことです。

 var layers = stage.getChildren();

レイヤーを取得します。次に、次のことを行います。

 var layerChildren = new Array();
 for(var i=0; i<layers.length; i++)
    layerChildren[i] = layers.getChildren();

状態を保存するたびに。

これにより、すべてのレイヤーとその子が配列に格納されます。かなり効率的で正確です。

これで、レイヤーのリストと子のリストをどこかに保存するだけで、状態間を行き来できます。

于 2013-01-09T22:15:52.933 に答える
0

履歴システムを構築するための最良の方法は、各操作の後にレイヤー/要素をを使用してシリアル化された値として配列に格納することlayer.toJSON()です。
履歴から何かを復元した後に表示/作業したいレイヤーとイベントハンドラーで画像を使用する場合、toJSON()は画像とイベントハンドラーをそのまま保存しないため、画像とイベントハンドラーをオブジェクト/レイヤーなどに再アタッチする必要があります保存されたデータが大きすぎたでしょう。このようにあなたの歴史を築き上げてください:

  1. まず、この質問にプロジェクトの回答を使用してみてください。
  2. 次に、画像とイベントハンドラーを再アタッチする必要があります。この質問に対してmarkEによって与えられたトリックを使用すると、簡単に処理できます。
于 2014-02-12T11:54:26.540 に答える