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

Rundll 26.01.2012 13:18

Массив пользовательских объектов с разными параметрами
 
Здравствуйте!

Опишу кратко задачу. Есть пользовательский объект типа myClass.
Есть массив myClassBuffer, в который планируется вносить объекты типа myClass.
При срабатывании определенного события тип myClass изменяется, а в буфер заносится его предыдущее значение. Вот грубый пример того, что нужно сделать: есть скажем спрайт отображения дерева. При нажатии на кнопку у дерева добавляется одна ветка, а в массив добавляется предыдущий спрайт этого дерева; Таким образом, если мы будем потом последовательно из массива читать мувики, получим последовательную хронологию действий.
Вроде бы задача простая, но при попытке прочитать последовательно из массива все предыдущие спрайты все прочитанные спрайты имеют текущее значение. Вот небольшой кусочек того, что делаю:
Код AS3:

var mySprite:Sprite = new Sprite();
var currentSprite:Sprite = new Sprite()
var mySpriteBuffer:Array = new Array();
 
//...здесь идет код отрисовки на mySprite нового элемента
 
//...при срабатывании события заношу в буфер:
 
currentSprite = new Sprite();
currentSprite = mySprite;
currentSprite.name = String("Sprite" + mySpriteBuffer.length);
mySpriteBuffer.push(currentSprite);
 
//и вывожу в трассировщик
trace(currentSprite.name); //1-й шаг: "Sprite0", 2-й шаг: "Sprite1", 3-й шаг: "Sprite2" и т.д.
 
//...и далее после нескольких шагов читаю из буфера
 
trace(mySpriteBuffer[0].name); //"Sprite2"
trace(mySpriteBuffer[1].name); //"Sprite2"
trace(mySpriteBuffer[2].name); //"Sprite2"

Собственно вопрос: почему в буфере сидят одинаковые спрайты?

zuxul 26.01.2012 15:16

Цитата:

Код AS3:

currentSprite = new Sprite();
currentSprite = mySprite;


У Вас так в коде, или это опечатка?

Genzo 26.01.2012 15:26

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

Rundll 26.01.2012 15:27

Так в коде. Я понимаю, что где-то накосячил, но я пробовал разные варианты для того чтобы решить данную задачу, пока не решил.

Цитата:

Вы вставляете в массив ссылки на один и тот же объект, для того чтобы хранить разные объекты клонируйте оригинал перед изменением, как клонировать спрайт или mc можете поискать на форуме.
Честно говоря рою инфу на тему клонирования уже несколько часов, но так и не нашел универсального средства для полного клонирования объекта (с дочерними спрайтами) с сохранением информации о классе. Много обсуждений, но явного средства нет. Вообще я хочу реализовать в графическом редакторе функцию отмены действия undo, думал сохранять после каждого действия спрайты в буфере, а потом вызывать их по необходимости. Может есть другой способ?

Stitch512 27.01.2012 23:19

Реализация undo/redo через клонирование объектов - не самая лучшая идея. Собственно такая тема уже была.
http://www.flasher.ru/forum/showthread.php?t=174379

Сохранять лучше не сами объекты а произведенные изменения.

zuxul 28.01.2012 00:07

Код AS3:

currentSprite = new Sprite();
currentSprite = mySprite;

Здесь Вы создаете новый спрайт, а следующей строкой присваиваете currentSprite старый спрайт mySprite. (на новый спрайт больше нигде нет ссылки, и доступ к нему никак не получить)

dimarik 28.01.2012 00:42

Цитата:

Сообщение от Rundll (Сообщение 1059239)
При срабатывании определенного события тип myClass изменяется

Вы курочите мой мозг. Тип объекта вроде как не может меняться в рантайме.

anmelegov 28.01.2012 15:58

не понятно че вы хотите сделать, но может попробуйте вот так:
Код AS1/AS2:

currentSprite = mySprite;
currentSprite.name = String("Sprite" + mySpriteBuffer.length);
mySpriteBuffer.push(currentSprite);
currentSprite = new Sprite();



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

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