Сценарий действия 3 Функция отмены и повтора приложения для рисования

Может ли кто-нибудь показать мне, как я могу отменить и повторить функцию? так что это мой текущий сценарий действий. Я не могу понять, как это сделать, и я вижу пример на каком-то веб-сайте, сценарий действия слишком длинный, чтобы его понять. Пожалуйста, покажите простой способ, которым я могу сделать эту работу.

извините за плохую грамматику...

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

person Nasharuddin Shahabuddin    schedule 12.02.2013    source источник


Ответы (1)


Вы можете использовать copyFrom() в Shape.graphics, чтобы сохранить текущее состояние, и то же самое, чтобы «повторить», так как ваш холст является фигурой.

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
}

В этом подходе отсутствуют некоторые функции, такие как удаление части стека отмены/повтора, если сначала отменить до определенной точки, а затем нарисовать. Вы можете попробовать добавить эту функцию самостоятельно.

person Vesper    schedule 12.02.2013
comment
это не работает линия все еще там. он должен стереть текущую и предыдущую линии рисования, верно? мне очень нужно, чтобы эта функция работала... - person Nasharuddin Shahabuddin; 12.02.2013
comment
Если у вас возникли проблемы с реализацией этого, отредактируйте вопрос и поместите внутрь текущий код. - person Vesper; 13.02.2013
comment
выше есть мой текущий сценарий действия, пожалуйста, проверьте его .. я действительно не уверен, что делать. это не работает так, как я надеюсь... - person Nasharuddin Shahabuddin; 13.02.2013
comment
Пожалуйста, добавьте поведение, которое вы испытываете, и поведение, которое вы хотите испытать. - person Vesper; 13.02.2013
comment
вы можете скопировать сценарий действия и вставить его. я думаю, что это работает, когда пользователи нажимают кнопку отмены и повтора. - person Nasharuddin Shahabuddin; 13.02.2013
comment
Так. Набор функций работает по назначению, но вы, похоже, хотите другого поведения. Что вы хотите от этого кода? Объясните подробно пожалуйста. - person Vesper; 13.02.2013
comment
я думаю, что когда пользователь рисует и если он ошибочно рисует предыдущую строку, в приложении есть кнопка, которую пользователь может отменить, если они ошиблись. но когда я пробую свой текущий код, строка все еще существует. последняя строка должна быть ясной при нажатии кнопки. и когда пользователь хочет повторить действие отмены, линия возвращается на сцену (холст). - person Nasharuddin Shahabuddin; 13.02.2013
comment
Мне жаль, что это трудно понять, но вы можете заставить его работать как кнопка отмены и повтора, как в краске Windows. - person Nasharuddin Shahabuddin; 13.02.2013
comment
Я же говорил вам, что эта функциональность отсутствует в этом образце. Вы должны изменить его таким образом, чтобы он работал, самостоятельно. Подсказка: когда вы обрабатываете событие завершения рисования, проверьте, не является ли текущая позиция отмены самой верхней, если это так, отбросьте все выше, а затем нажмите новое состояние. - person Vesper; 13.02.2013