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. 首先,尝试在这个问题上使用 projeqht 的答案。
  2. 其次,您将不得不重新附加图像和事件处理程序。使用markE这个问题上给出的技巧,您可以轻松处理它。
于 2014-02-12T11:54:26.540 回答