2011-10-06 4 views
0

실행 취소 및 다시 실행 기능을 구현해야한다는 점에서 응용 프로그램을 만들 예정입니다. 응용 프로그램에서는 스테이지에 여러 객체가 있으며 사용자는 객체의 위치를 ​​ 으로 사용자 정의 할 수 있습니다. 그러나 사용자가 실행 취소를 클릭하면 객체는 기본값 인 으로 돌아가고 다시 실행을 클릭하면 객체가 새 위치로 이동합니다.as3에서 실행 취소 및 다시 실행 기능 구현 방법

내 질문에 내 응용 프로그램에서 어떻게 이러한 기능을 적용 할 수 있습니까? 도서관이나 타사 수업이 있습니까?

나를 도와 줄 수 있습니까?

미리 감사드립니다.

+0

여러 객체에 대해 실행 취소 및 다시 실행을 구현하는 방법은 무엇입니까? as3에서 제 3 자 클래스를 사용할 수 있습니까? –

답변

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); 
    } 
    } 
} 

이 내 사용자 정의 클래스 afor가 취소하고 무대에 여러 개체를 다시 실행합니다. 실행 취소 및 다시 실행에 사용할 수있는 다른 패턴이 있지만 나에게 이것은 실행 취소 및 다시 실행을위한 간단한 방법입니다. 나는 완벽하게 성공적으로 이것을 내 프로젝트에 구현했다.

이 클래스는 클래스를

    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

Command-pattern 자체로는 충분하지 않습니다. 일반적으로 [Memento] (http://en.wikipedia.org/wiki/Memento_pattern) 패턴과의 관계에서 사용됩니다. –

+1

@spender : 어떻게 이것을 as3 코드에서 구현할 수 있습니까? –

0

두 가지 상태 (기본값 및 "변경됨") 만 필요하면 구현하는 것이 매우 간단해야합니다. 배열에 각 객체의 새 값과 업데이트 된 값을 저장하고 "실행 취소"또는 "다시 실행"을 누르면 관련 배열에서 위치를 설정합니다.

좀 더 복잡한 것이 필요한 경우 수행하는 모든 것을 실행 취소 할 수있는 "조치"로 저장할 수 있습니다. 예를 들어, 여러 하위 클래스 ("Move", "ChangeColor"등)가있는 클래스 (예 : "Action")가 있습니다. 그들은 수행하는 변경 (몇 픽셀을 이동해야하는지)과 작업 수행 (개체 X 픽셀 이동) 및 작업 실행 취소 (개체 X 픽셀 이동) 방법을 포함합니다.

0

내가 생각할 수있는 가장 간단한 방법은 이전 상태와 새 상태 및 변경된 개체가있는 작업 개체를 만드는 것입니다.

실행 취소 기능을 얻을 것입니다 액션이 발사 될 때마다,

당신이 취소 히트 액션 객체에서이 데이터를 작성 객체의 상태 이전으로 되돌아와 다시 실행 스택에 대처를 진행 .

가장 일반적인 변경 사항을 처리 할 수 ​​있어야합니다. 삭제/삭제 취소와 같은 것들은 약간의 추가 조정이 필요합니다. 나는 삭제할 때 모든 속성을 넣을 것입니다. 그리고 실행 취소를 처리 할 때 create 함수를 사용하십시오.

실행 취소/다시 실행 기능을 변경하지 않고도 추가 기능을 처리 할 수있는 방법으로 이전 및 이후 상태에 대한 매개 변수 및 값 조합 문자열을 사용하는 것이 좋습니다.

이것은 더 빠르고 더러운 방법이며, 다른 사람들이 언급 한 것처럼 설계 패턴과 적절한 OOP 방식을 사용하여이를 수행 할 수도 있습니다.

+0

코드 블록을 제공하여 진행할 수 있습니까? –

관련 문제