2011-10-06 186 views
0

我将创建一个应用程序,我必须实现一个撤消和重做功能。 在应用程序中会有多个对象位于舞台上,用户可以自定义对象的位置。但是当用户点击撤销时,对象将返回到默认的 位置,点击重做对象后将移动到新的位置。如何在as3中实现撤消和重做功能

所以我的问题是我如何在我的应用程序中应用这些功能? 是否有任何图书馆或任何第三方课程?

有人能帮助我吗?

在此先感谢。

+0

如何实现对多个对象的撤销和重做?我们可以在as3中有任何第三方课程吗? –

回答

0
package com 
{ 
    import flashx.undo.IOperation; 

    public class UndoOperation implements IOperation 
    { 

    private var _previousX:Number = 0; 
    private var _previousY:Number = 0; 
    private var _previousObj:Object = new Object(); 
    private var _currentX:Number = 0; 
    private var _currentY:Number = 0; 
    private var _currentObj:Object = new Object(); 
    private var _shape:Object = new Object(); 


    public function TransformOperation(currentObj:Object,previousObj:Object,previousX:Number, previousY:Number, currentX:Number, currentY:Number) 
    { 
     _previousX = previousX; 
     _previousY = previousY; 
     _previousObj = previousObj; 

     _currentX = currentX; 
     _currentY = currentY; 
     _currentObj = currentObj; 
     _shape = _currentObj; 

     trace('Transform _previousX: '+ _previousX +' _previousY: ' +_previousY+' _currentObj '+_currentObj+' _shape '+_shape); 
     trace('trans _currentX '+ _currentX +' '+'_currentY  '+ _currentY); 

    } 

    public function performUndo():void 
    { 
     _shape = _currentObj; 
     //trace('_shape.x '+_shape.x+" _shape.y "+_shape.y); 
     _shape.x = _previousX; 
     _shape.y = _previousY; 
     //trace(_previousX +' '+ _previousY +' '+ _previousWidth +' '+ _previousHeight +' '+ _previousScaleX +' '+ _previousScaleY +' '+ _previousRotation); 
     //trace('_shape.x '+_shape.x+" _shape.y "+_shape.y); 
     //trace('_currentX '+ _currentX +' '+'_currentY  '+ _currentY); 
    } 

    public function performRedo():void 
    { 
     _shape.x = _currentX; 
     _shape.y = _currentY; 
     trace(_currentX+' '+ _currentY); 
    } 
    } 
} 

这是我的自定义类,用于撤消和重做舞台上的多个对象。有不同的模式可用于撤销和重做操作,但对我来说,这是撤销和重做的简单方法。我已经在我的项目中完美并成功地实现了这一点。

使用这个类只导入类

    import flashx.undo.UndoManager; 

,之后

  public static var _undo:UndoManager=new UndoManager(); 
      public static var _redo:UndoManager=new UndoManager();  
      public static var PrevX:Number=0; 
      public static var PrevY:Number=0; 
      var operation:TransformOperation = new TransformOperation(this,this,PrevX,PrevY,this.x,this.y); 
      _undo.pushUndo(operation); 

之后,创建点击事件撤消和重做:

public static function Undo(e:MouseEvent):void 
    { 
     _redo.pushRedo(_undo.peekUndo()); 
     _undo.undo(); 
     if(_undo.peekUndo()==null) 
     { 
      PlayerPosition.getClass.getChildByName("toolbar_mc").getChildByName("undo_mc").removeEventListener(MouseEvent.CLICK,Undo); 
     } 
     PlayerPosition.getClass.getChildByName("toolbar_mc").getChildByName("redo_mc").addEventListener(MouseEvent.CLICK,Redo); 
    } 

    public static function Redo(e:MouseEvent):void 
    { 
     _undo.pushUndo(_redo.peekRedo()); 
     _redo.redo(); 
     if(_redo.peekRedo()==null) 
     {       PlayerPosition.getClass.getChildByName("toolbar_mc").getChildByName("redo_mc").removeEventListener(MouseEvent.CLICK,Redo); 
     } 
     PlayerPosition.getClass.getChildByName("toolbar_mc").getChildByName("undo_mc").addEventListener(MouseEvent.CLICK,Undo); 
    } 

对于我这个作品好...希望这可以帮助其他人... :)

5

看看command pattern。它非常适合撤消/重做类型问题。

+5

命令模式本身是不够的。通常它用于与[Memento](http://en.wikipedia.org/wiki/Memento_pattern)模式的关系。 –

+1

@spender:我如何在as3代码中实现这一点? –

0

如果你只想要两种不同的状态(默认和“改变”),它应该是非常微不足道的实施。将新值和每个对象的更新值存储在数组中,并在按下“撤销”或“重做”时从相关数组中设置位置。

如果你需要更复杂的东西,你可以将你做的所有事情存储为一个可撤销的“动作”。例如,有一个类(例如“Action”)和几个子类(“Move”,“ChangeColor”等)。它们包含它们执行的更改(我们应该移动多少像素)以及执行操作(移动对象X像素)和撤消操作(移动对象-X像素)的方法。

0

我能想到的最简单的方法就是创建一个动作对象,其中您有旧状态以及新状态和已更改的对象。

每次会得到一个撤消功能的动作触发时,填写在操作的对象这个数据

,当你点击撤消,该对象的状态之前恢复到和推动行动统一到重做堆栈。

这应该能够处理最常见的更改。像删除/取消删除等事情需要一点额外的调整。我只是在删除时放入所有属性,并在处理撤销时使用create函数。

我会建议使用字符串参数和值组合的状态之前和之后,这样你可以处理额外的功能,而无需更改撤销/重做功能。

这更多的是一种快速和肮脏的方式,您也可以使用设计模式和适当的面向对象方式来处理这个问题,就像其他人提到的一样。

+0

你能给我提供一些代码块吗? –