Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как связать узлы XML c графическими Sprite`ами (http://www.flasher.ru/forum/showthread.php?t=120355)

Роман Вадимович 18.01.2009 16:20

Как связать узлы XML c графическими Sprite`ами
 
Добрый день!
Подскажите пожалуйста найти рациональное решение задачи.
Я пишу редактор, представляющий собой инструмент, позволяющий располагать на холсте пиктограммки.
Данные сохраняемые редактором помещаются в XML примерно такого вида:
Код:

<objects>
  <object name="FirstObject" x="25" y="70" icon="FirstIcon"/>
  <object name="FirstObject" x="25" y="70" icon="SecondIcon"/>
  ...

</objects>

В процессе работы редактора мне необходимо как-то связывать XML узел и сам объект на экране.

Эту задачу я решил так:
- после загрузки сохраненного XML файла создаю временный уникальный атрибут id для каждого узла. И в каждом графическом объекте храню id узла на который он ссылается;
- при создании нового объекта - присваиваю ему новый id, так чтобы он не повторился.
- при сохранении в файл, удаляю временные атрибуты id из XML.

Подскажите насколько это верное решение. Может есть более простой и рациональный способ решить эту задачу.
Заранее благодарен.

s8000_1 18.01.2009 16:46

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

Роман Вадимович 18.01.2009 17:00

На сколько я понимаю - передать ссылку на XML элемент невозможно.
При передаче элемента будет создана копия узла.
Кстати только что попробовал это сделать.

s8000_1 18.01.2009 17:10

Можно передавать ссылку. Копий узла не создается.

Код AS3:

var xml:XML = <data>
<item name="item0"/>
<item name="item1"/>
<item name="item2"/>
</data>
 
trace (xml);
 
var obj:Object = new Object();
obj["node0"] = xml.item[0];
trace (obj["node0"].@name);
obj["node0"].@name = "item0Modified";
 
trace (xml)

p.s. а вообще я бы распарсил XML и создал массив объектов-моделей с нужными свойствами. Способ муторнее, но позволяет отслеживать изменения в объектах с помощью событий

etc 18.01.2009 17:18

Цитата:

Сообщение от Роман Вадимович (Сообщение 791790)
На сколько я понимаю - передать ссылку на XML элемент невозможно.
При передаче элемента будет создана копия узла.
Кстати только что попробовал это сделать.

Да ну, неужели копия? Покажите.

Роман Вадимович 18.01.2009 17:34

Cпасибо s8000_1, Ваш пример работает.

Цитата:

Да ну, неужели копия? Покажите.
Вот пример из книжки Мука:
Цитата:

References to Parts of a Document Are Not Live
As you change or add new content to an XML object, bear in mind that any updates you make will not be reflected by variables that refer to part of that document. For example, the following code creates a variable, children, that a refers to <BOOK>’s
child nodes:
Код AS3:

var novel:XML = <BOOK ISBN="0141182806">
<TITLE>Ulysses</TITLE>
<AUTHOR>Joyce, James</AUTHOR>
<PUBLISHER>Penguin Books Ltd</PUBLISHER>
</BOOK>
var children:XMLList = novel.*;

If we now remove the <PUBLISHER> element, the change is made to the original document, but is not reflected by the children variable:
Код AS3:

// Remove <PUBLISHER>
delete novel.PUBLISHER;
trace(novel);
// Displays: <BOOK ISBN="0141182806">
// <TITLE>Ulysses</TITLE>
// <AUTHOR>Joyce, James</AUTHOR>
// </BOOK>
trace(children);
// Displays: <TITLE>Ulysses</TITLE>
// <AUTHOR>Joyce, James</AUTHOR>
// <PUBLISHER>Penguin Books Ltd</PUBLISHER>
// <PUBLISHER> is still there!

Future versions of E4X may support live references to parts of a document.
Предполагаю, что я не до конца разобрался :)

s8000_1 18.01.2009 17:39

Не до конца разобрались.
Код AS3:

var children:XMLList = novel.*;

создает объект children со ссылками на элементы из другого XML. Когда Вы делаете delete, вы удаляете ссылку из этого объекта, а не сам элемент.

Ссылки как работали, так и работают.
Код AS3:

var novel:XML = <BOOK ISBN="0141182806">
<TITLE>Ulysses</TITLE>
<AUTHOR>Joyce, James</AUTHOR>
<PUBLISHER>Penguin Books Ltd</PUBLISHER>
</BOOK>
var children:XMLList = novel.*;
children[0] = "acb";
delete novel.PUBLISHER;
children[0] = "acb";
trace(novel);
trace(children);

p.s. структура со сквозными ссылками на элементы XML хорошая, но крайне неудобная с точки зрения апгрейда.

Роман Вадимович 18.01.2009 17:43

Да, точно. Спасибо за помощь!
Теперь понятно.


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

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