【问题标题】:Action script 3 drawing app undo and redo functionAction script 3 绘图应用程序撤消和重做功能
【发布时间】:2013-01-27 12:38:54
【问题描述】:

谁能告诉我如何进行撤消和重做功能?所以这是我当前的动作脚本。我不知道该怎么做,我在一些网站上看到了一些例子,动作脚本很长,无法理解。请展示一个简单的方法,我可以使这项工作..

抱歉语法不好...

import flash.display.MovieClip;
import flash.events.MouseEvent;

var pen_mc:MovieClip;
var drawing:Boolean = false;
var penSize:uint = 1;
var penColor:Number = 0x000000;

var shapes:Vector.<Shape>=new Vector.<Shape>(); 
var position:int=0;
const MAX_UNDO:int=10;


function init():void{

pen_mc = new MovieClip();
stage.addEventListener(MouseEvent.MOUSE_DOWN, startDrawing);
stage.addEventListener(MouseEvent.MOUSE_MOVE, isDrawing);
stage.addEventListener(MouseEvent.MOUSE_UP, finishedDrawing);
addChild(pen_mc);

}

init();

function startDrawing(e:MouseEvent):void{

trace("Pen Has started drawing");

drawing = true;
pen_mc.graphics.lineStyle(penSize, penColor);
pen_mc.graphics.moveTo(mouseX, mouseY);


}

function isDrawing(e:MouseEvent):void{
if(drawing){

    pen_mc.graphics.lineTo(mouseX, mouseY);
}

}


function finishedDrawing(e:MouseEvent):void{

     trace("finished drawing");
     drawing = false;

     var sh:Shape=new Shape();
     sh.graphics.copyFrom(pen_mc.graphics); // put current state into the vector
     shapes.push(sh);
     if (shapes.length>MAX_UNDO) shapes.unshift(); // drop oldest state
     position=shapes.indexOf(sh);
}
function undo():void {
    if (position>0) {
        position--;
        pen_mc.graphics.copyFrom(shapes[position].graphics);
    } // else can't undo
}
function redo():void {
    if (position+1<shapes.length) {
        position++;
        pen_mc.graphics.copyFrom(shapes[position].graphics);
    } // else can't redo
}


 function btn_undo(e:MouseEvent):void
        {
            undo();
        }

 function btn_redo(e:MouseEvent):void
        {
            redo();
        }

undo_btn.addEventListener(MouseEvent.CLICK, btn_undo);
redo_btn.addEventListener(MouseEvent.CLICK, btn_redo);

【问题讨论】:

    标签: actionscript-3 flash drawing undo redo


    【解决方案1】:

    您可以在 Shape.graphics 中使用 copyFrom() 来存储当前状态,“重做”也是如此,因为您的画布是一个形状。

    var shapes:Vector.<Shape>=new Vector.<Shape>(); 
    var position:int=0;
    const MAX_UNDO:int=10;
    ...
    function finishedDrawing(e:MouseEvent):void{
    
         trace("finished drawing");
         drawing = false;
    
         var sh:Shape=new Shape();
         sh.graphics.copyFrom(penMC.graphics); // put current state into the vector
         shapes.push(sh);
         if (shapes.length>MAX_UNDO) shapes.unshift(); // drop oldest state
         position=shapes.indexOf(sh);
    }
    function undo():void {
        if (position>0) {
            position--;
            penMC.graphics.copyFrom(shapes[position].graphics);
        } // else can't undo
    }
    function redo():void {
        if (position+1<shapes.length) {
            position++;
            penMC.graphics.copyFrom(shapes[position].graphics);
        } // else can't redo
    }
    

    这种方法缺少一些功能,例如如果先撤消到某个点,然后再绘制,则丢弃部分撤消/重做堆栈。您可以尝试自己添加此功能。

    【讨论】:

    • 它仍然无法正常工作。它应该擦除当前和以前的绘图线对吗?我真的需要这个功能才能工作......
    • 如果您在执行此操作时遇到问题,请编辑问题并将当前代码放入其中。
    • 上面是我当前的动作脚本,请检查一下。我真的不知道该怎么做。它不像我希望的那样工作......
    • 请添加您体验到的行为和您希望体验到的行为。
    • 您可以复制操作脚本并将其粘贴过去。我认为当用户单击撤消和重做按钮时它会起作用。
    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 2015-08-12
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多