Форум 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=160810)

goodguy 17.07.2011 20:41

Как правильнее организовать отмену последнего действия?
 
В данный момент пишу продвинутый редактор уровней для своей будущей игры, и решил в нем организовать отмену и возврат действий (undo / redo). Причем хочу сделать длинные откаты, вплоть до пустого документа.
Своя идея как это реализовать конечно есть, но хотелось бы почитать предложения людей, которые этим либо занимались сами, либо знают как это правильно делается.

Скажем, добавляю я объект в дисплей лист, потом перемещаю его в другое место, потом удаляю. Понимаю, что удалил зря - жму откат, от снова появляется, еще раз жму, становится на прежнее место и т.п.
Кто что предложит?

nOobCrafter 17.07.2011 20:46

Массив, с элементами-действиями, так же судя по вашей задумке у вас все обьекты всегда будут в памяти? за исключением случаев когда вы перезаписываете действия? (сделали, откатились и сделали по другому)

goodguy 17.07.2011 20:49

Цитата:

Массив, с элементами-действиями
У меня такая же идея. Но только что есть "действие"? каким то образом надо его описывать, перед помещением в массив. А реализация пока получается довольно громоздкая.
Цитата:

так же судя по вашей задумке у вас все обьекты всегда будут в памяти?
Да. Но там в любом случае больше 300 мегабайт не натекает. Я уже проверял. Так что все нормально.

Добавлено через 20 минут
Похоже поторопился с темой. Нашел паттерн решющий этот вопрос в книжке Actionscript 3 design patterns.
+ memnto паттерн

Inet_PC 17.07.2011 22:43

Мне кажется здесь больше подойдет паттерн Command. Примерно с таким интерфейсом:
Код AS3:

public interface ICommand 
{
    function execute():void;
    function redo():void;
    function undo():void;
}

И соответственно:
Код AS3:

public interface ICommandHistory extends ICommand 
{
    function addChild(value: ICommand):void;
    function removeChild(value: ICommand):void;
    function get numChildren():int
}

Думаю с реализацией проблем не будет.

goodguy 17.07.2011 22:46

Спасибо. Только я уже нашел этот паттерн, о чем и написал в 3 посте :)

nOobCrafter 18.07.2011 01:39

Цитата:

Command
тогда уж цепь смотрите http://johnlindquist.com/2011/02/01/...bility-part-1/

MXPain 18.07.2011 03:40

http://www.flairpy.com/mementoPatter...ntoSample.html жми вью сорс

goodguy 18.07.2011 07:32

Цитата:

Сообщение от nOobCrafter (Сообщение 1012424)
тогда уж цепь смотрите http://johnlindquist.com/2011/02/01/...bility-part-1/

Как-то все мудрено. Паттерн с командой проще. А а в моем случае даже его можно упростить.

Цитата:

http://www.flairpy.com/mementoPatter...ntoSample.html жми вью сорс
Я видел это уже. Read post #3

Tr1te 18.07.2011 12:24

А в чем проблема составить массив?

Пустой лист шаг 0. Добавили объект. Пишем в 0-вой элемент, ссылку на объект, то что его в этом шаге не было. В 1-вый элемент пишем ссылку на объект, пишем что его добавили, и место положения.
Переместили объект. Во 2-ой шаг/элемент массива пишем ссылку на объект, и место положения, итд.

Нажали undo, текущий шаг 2, читаем массив на шаг назад, там у нас добавлен объект, объект уже есть ничего не делаем, проверяем свойста... координаты смещаем по указанным координатам.
Еще раз undo, назад текущий шаг 1, читаем на элемент ниже. Ссылка на объект, объекта не было. по ссылки удаляем объект.
Жмем redo, читаем... создан объект с координатами... делаем.

Вы решили как компания LOLapps, которые вложили тонну средств в движок, а потом на его базе делать тонну игрушек?

goodguy 18.07.2011 12:35

Tr1te, я так и делаю сейчас.
Просто сначала пришла идея данные о перемещениях и всем остальном, хранить в самих объектах. Все объекты, которые могут быть добавлены у меня применяют интерфейс ICommonChild с нужными методами. Этот способ работает, но не совсем так как надо, потому что для отмены действия надо указать программе для какого именно объекта нужно отменить действие. Централизированный массив лучше.
Цитата:

Вы решили как компания LOLapps, которые вложили тонну средств в движок, а потом на его базе делать тонну игрушек?
У моей игры не будет движка, в том виде, в котором это обычно понимают. Т.е. все, что будет в игре, будет применимо только к ней. Сейчас я пишу редактор уровней, который будет заточен тоже только для нее.


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

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