Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Отмена последнего действия (http://www.flasher.ru/forum/showthread.php?t=159875)

geka96 06.07.2011 14:01

Отмена последнего действия
 
Добрый день! Делаю "рисовалку", хочу сделать отмену последнего действия...делаю таким способом:
При нажатии мыши, добавляется спрайт, который рисует....при отпускании мыши этот спрайт добавляется в массив...затем отменяю последнее действие так:
Код AS3:

var allSprites:Array = new Array();
btn_undo.addEventListener(MouseEvent.CLICK,onClickUndo);
function onClickUndo(e:Event):void
{
        var sprite:Sprite = allSprites.pop();
        sprite.graphics.clear();
        removeChild(sprite);
        sprite = null;
}

Рисую так:
Код AS3:

function MoveHandler(e:MouseEvent):void
{
        container = new Sprite();
        addChild(container);
 
        container.graphics.beginFill(0xff00ff);
        container.graphics.drawCircle(mouseX, mouseY, 20);
        container.graphics.endFill();
}

Когда отменяется последнее действие, удаляется только последний кужок...т.е. не вся линия которую я нарисовал из спрайтов, а последний круг в этой линии...
Может нужно все вмести эти кружки, сделать в один спрайт? Подскажите...пожалуйста...)

Вот исходник: http://www.varyag207.ru/undo_graphiscs.rar

iNils 06.07.2011 14:16

1. Массив вам в принципе не нужен. Взять последний спрайт можно и так
Код AS3:

var sprite:Sprite = removeChildAt (numChildren - 1) as Sprite

2. Если движение это одно действие, то логичнее держать все его кружки в одном спрайте.

geka96 06.07.2011 15:02

iNils, да так можно...он удаляет последнее действие, но потом начинает удалять все спрайты, которые есть...

Кружки все держу в одном спрайте...но отмена последнего действия происходит только у одного кружка..если не сложно гляньте мой исходник - выше)

iNils 06.07.2011 15:30

Исходник посмотреть не cмогу. У меня CS3.

geka96 06.07.2011 15:53

iNils, понятно..вот тогда весь код:
Код AS3:

var container:Sprite;
pic.addEventListener(MouseEvent.MOUSE_DOWN, MouseDown);
stage.addEventListener(MouseEvent.MOUSE_UP, MouseUp);
function MouseDown(e:MouseEvent):void
{
        addEventListener(MouseEvent.MOUSE_MOVE, enterFrameHandler);
}
function MouseUp(e:MouseEvent):void
{
        allSprites.push(container);
        removeEventListener(MouseEvent.MOUSE_MOVE, enterFrameHandler);
}
function enterFrameHandler(e:MouseEvent):void
{
        container = new Sprite();
        addChild(container);
 
        container.graphics.beginFill(0xff00ff);
        container.graphics.drawCircle(mouseX, mouseY, 20);
        container.graphics.endFill();
}
var allSprites:Array = new Array();
btn_undo.addEventListener(MouseEvent.CLICK,onClickUndo);
function onClickUndo(e:Event):void
{
        var sprite:Sprite = allSprites.pop();
        sprite.graphics.clear();
        removeChild(sprite);
        sprite = null;
}

Нужно будет создать кнопку btn_undo и мувик pic =) Если не сложно, гляньте что не так..а то никак не пойму....

alatar 06.07.2011 17:15

У вас по MOUSE_MOVE в переменную container записываются спрайты, каждый раз новый. Но в массив allSprites, объект по этой ссылке, будет добавлен только по MOUSE_UP. К тому моменту там будет последний созданный спрайт.

P.S. Вот это:
Код AS3:

sprite.graphics.clear();

в вашем случае, делать бессмысленно.

geka96 06.07.2011 17:32

alatar, получилось)) Спасибо, всё работает)


Часовой пояс GMT +4, время: 01:06.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.