Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблема с getDefinitionByName (http://www.flasher.ru/forum/showthread.php?t=211690)

Marlin 16.10.2015 07:42

Проблема с getDefinitionByName
 
Здравствуйте , появилась непонятная проблема с getDefinitionByName

Код AS3:

//параметром передаю 1
                private function setLevel(levelNum:uint):void
                {                       
 
                        var levelData:Class = (getDefinitionByName("cls.data." +"Level" + levelNum + "Data" )) as Class;
                        trace(new levelData()); // [object Level1Data]
                        currentLevelData = new Level1Data();
}

так все работает, все нормально.

а так :
Код AS3:

private function setLevel(levelNum:uint):void
                {                       
 
                        var levelData:Class = (getDefinitionByName("cls.data." +"Level" + levelNum + "Data" )) as Class;
                        trace(new levelData()); //в этой строке падает с ошибкой:[Fault] exception, information=ReferenceError: Error #1065: Переменная Level1Data не определена.
                        currentLevelData = new levelData();

не могу понять в чем дело, в первом варианте к экземпляру обращается видит все свойства все норм,
а во втором варианте переменная levelData = undefined

Tails 16.10.2015 10:11

http://help.adobe.com/ru_RU/FlashPla...initionByName()
Почитайте описание. Если определение не найдено, выбрасывается исключение. Правильнее будет обрабатывать эту ситуацию:
Код AS3:

var levelData:Class;
try{
    levelData = getDefinitionByName("Level1Data") as Class;
}catch(err:Error){
    trace("Нет данных: " + err);
}

А раз определение не найдено, значит его нет по тому адресу, по которому вы его ищете. Проверьте имя класса, его пакет. Пакеты тоже надо указывать:
Код AS3:

getDefinitionByName("flash.display.Sprite")


Marlin 16.10.2015 10:23

первый вариант же работает, там создается экземпляр этого класса , пакет я указал cls.data. , а когда я создаю экземпляр вне trace , у меня вылетает ошибка

Tails 16.10.2015 10:39

В первом примере вы создаёте экземпляр не по ссылке levelData, а на прямую:
Код AS3:

currentLevelData = new Level1Data();


caseyryan 16.10.2015 11:33

Классы, которые берутся через getDefinitionByName должны быть вкомпилированы в проект. А если они нигде не упомянуты или нет специальной настройки компилятора, то они игнорируются. В первом случае класс упомянут
Код AS3:

currentLevelData = new Level1Data(); // здесь

Соответственно он вкомпилировался и все работает.
Во втором случае нет.

Решение у этой проблемы простое. Просто нужно где-то упомянуть класс.

Я делаю это в отдельном классе, который просто импортирую в нужный мне проект. Но можно просто где-то написать
Код AS3:

Level1Data;

Например в конструкторе, и после этого все заработает

alexandrratush 16.10.2015 12:37

На сколько я знаю, еще можно подключить либу как include.

Marlin 16.10.2015 12:42

Да, все заработало, прописал в конструкторе. А если допустим у меня 20 уровней, соответственно Level1Data, Level2Data,Level3Data ... И все они наследуются от LevelData, можно ли как нибудь поизящней их прописать?

alexandrratush 17.10.2015 09:37

Marlin эти классы в swc или swf библиотеке?

amesqit 17.10.2015 12:39

Мне кажется гораздо порще и приятнее решить данную задачу через интерфейсы. Для уровня прописывается интерфейс ILevel в котором описываются все функции LevelData. Для Main класса тоже прописывается интерфейс IMain с одной функцией getLevel():ILevel. Таким образом подгрузив этот свф, и зная что его Main это IMain вы без всяких проблем забираете у него ILevel, пользуте и радуетесь. Если несколько уровней в одном свф, то нужно доработать IMain передавая количество уровней и в добавить например индекс getLevel(index:uint):ILevel.

Marlin 17.10.2015 12:46

Цитата:

Сообщение от alexandrratush (Сообщение 1188111)
Marlin эти классы в swc или swf библиотеке?

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


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

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