Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Создание объектов по XML (http://www.flasher.ru/forum/showthread.php?t=158887)

Korchy 24.06.2011 18:39

Создание объектов по XML
 
Описание игрового мира храню в базе данных. Есть скрипт PHP отдающий его в XML вида
Код:

<SectorMain>
  <Star id="1">
    <id>1</id>
    <sub_id>0</sub_id>
    <s_point_x>500</s_point_x>
    <s_point_y>300</s_point_y>
    <name>17</name>
    <img_path>img/graphic</img_path>
    <img_name>rock1</img_name>
    <img_ext>png</img_ext>
  </Star>
  <Planet id="1">
    <id>2</id>
    <sub_id>1</sub_id>
    <center_x>25</center_x>
    .... и т.п....
  </Planet>
</SectorMain>

Пытаюсь создавать объекты по описанию

Код AS3:

protected function CreateFromXML(Data:XML):void {
        // Создание сектора из XML
        for each (var Node:XML in Data.*) {
                if(Node.nodeKind()=="element") {
//                        var s:Star = new Star();
//                        var p:Planet = new Planet();
                        trace(Node.name());
                        var ClassReference:Class = getDefinitionByName(Node.name()) as Class;
                        var Instance:Object = new ClassReference();
                }
        }
}

получаю ошибку
F:\VN Flash\Src\Vn.fla:
Star
ReferenceError: Error #1065: Variable Star is not defined.

Полазив по форуму нашел ответ в том, что классы должны где-то упоминаться для того, чтобы они были импортированы в swf (Все ответы для FD, у меня CS3). Но и даже с раскоментаренными первыми двумя строчками все равно не работает.
Подскажите, как решить проблему?

goodguy 24.06.2011 18:51

Цитата:

Error #1065: Variable Star is not defined.
Компилятор же дал ответ.
проблема в этом:

Код AS3:

 Data.*

В ствойстве Data нет переменной звездочки

Korchy 24.06.2011 19:05

Цитата:

Сообщение от goodguy (Сообщение 1006269)
Компилятор же дал ответ.
проблема в этом:

Код AS3:

 Data.*

В ствойстве Data нет переменной звездочки

Эта не та звездочка. Ругается компилятор, насколько я понимаю, на класс Star экземпляр которого я хочу создать через getDefinition.
А звездочка в

Код AS3:

 Data.*

это обращение к узлам XML-дерева. С ней все в порядке. Если закоментарить создание объектов по имени - никто ни на что не ругается.

dimarik 24.06.2011 20:17

Импортировать забыли Star?

Kidd002 24.06.2011 20:28

Попробуйте получить имя класса с учетом его расположения.
То есть например вместо
Код AS3:

getDefinitionByName("Sprite")

написать
Код AS3:

getDefinitionByName("flash.display.Sprite")


goodguy 24.06.2011 20:30

Цитата:

Эта не та звездочка. Ругается компилятор, насколько я понимаю, на класс Star экземпляр которого я хочу создать через getDefinition.
А звездочка в
Действительно. Уже туплю под вечер.

Это смахивает на проблему, которая была однажды в моем коде http://www.flasher.ru/forum/showthread.php?t=156321

Korchy 24.06.2011 20:30

Цитата:

Сообщение от dimarik (Сообщение 1006285)
Импортировать забыли Star?

Star входит в package. Но даже если добавить в начало import Vn.Star; ошибка остается

Добавлено через 34 минуты
Цитата:

Сообщение от Kidd002 (Сообщение 1006286)
Попробуйте получить имя класса с учетом его расположения.
То есть например вместо
Код AS3:

getDefinitionByName("Sprite")

написать
Код AS3:

getDefinitionByName("flash.display.Sprite")



Вот это сработало, спасибо.
В итоге работает только в таком виде:
Код AS3:

protected function CreateFromXML(Data:XML):void {
        // Создание сектора из XML
        for each (var Node:XML in Data.*) {
                if(Node.nodeKind()=="element") {
                        Star;
                        Planet;
                        trace(Node.name());
                        var ClassReference:Class = getDefinitionByName("Vn."+Node.name()) as Class;
                        var Instance:Object = new ClassReference();
                }
        }
}

Vn - имя package

udaaff 24.06.2011 21:33

Названия пакетов, переменных (возможно, кроме ClassReference), методов принято писать с маленькой буквы. С большой буквы пишутся названия классов. Ознакомьтесь с конвенциями по оформлению кода http://opensource.adobe.com/wiki/dis...ng+Conventions.

Цитата:

В итоге работает только в таком виде:
Естественно, надо полное имя указывать.

Korchy 24.06.2011 22:23

Цитата:

Сообщение от udaaff (Сообщение 1006313)
Названия пакетов, переменных (возможно, кроме ClassReference), методов принято писать с маленькой буквы. С большой буквы пишутся названия классов. Ознакомьтесь с конвенциями по оформлению кода http://opensource.adobe.com/wiki/dis...ng+Conventions.

Я пишу на нескольких языках и в каждом своя нотация. Чтобы не поехала крыша от разных нотаций, я везде пишу одинаково. Это немного затрудняет прочтение, но на качестве кода к счастью не сказывается.

Цитата:

Сообщение от udaaff (Сообщение 1006313)
Естественно, надо полное имя указывать.

Для new же не нужно указывать полные имена. А для getDefinition получается почему-то нужно...

derhab 24.06.2011 22:50

Цитата:

Сообщение от Korchy (Сообщение 1006318)
Для new же не нужно указывать полные имена. А для getDefinition получается почему-то нужно...

ну вообще то в случае с new полный путь к классу в импорте прописан

stweet 24.06.2011 23:13

Цитата:

Сообщение от Korchy (Сообщение 1006318)
Для new же не нужно указывать полные имена. А для getDefinition получается почему-то нужно...

Помнится был у меня такой же вопросик =) Задача решилась добавлением путей к ресурсам в настройках проекта.

Добавлено через 35 секунд
Опоздал чутка)

Korchy 24.06.2011 23:33

Цитата:

Сообщение от derhab (Сообщение 1006323)
ну вообще то в случае с new полный путь к классу в импорте прописан

а getDefinition это игнорит?

В любом случае, класс включен в package, зачем еще раз явно нужен импорт и указание полного пути, не понимаю.


Цитата:

Сообщение от stweet (Сообщение 1006333)
Помнится был у меня такой же вопросик =) Задача решилась добавлением путей к ресурсам в настройках проекта.

Я пробовал, почему-то не получилось. Может не там прописывал.

derhab 24.06.2011 23:46

Цитата:

Сообщение от Korchy (Сообщение 1006343)
а getDefinition это игнорит?

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

Nucer 26.06.2011 18:32

В следующий раз - ставь галку allow debug в настройках публикации swf - будешь видеть номера строк с ошибками)


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

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