Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 16.10.2015, 07:42
Marlin вне форума Посмотреть профиль Отправить личное сообщение для Marlin Найти все сообщения от Marlin
  № 1  
Ответить с цитированием
Marlin

Регистрация: Feb 2014
Сообщений: 57
По умолчанию Проблема с 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

Старый 16.10.2015, 10:11
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 2  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,251
Записей в блоге: 6
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")
__________________
Дети не должны знать о своих родителях

Старый 16.10.2015, 10:23
Marlin вне форума Посмотреть профиль Отправить личное сообщение для Marlin Найти все сообщения от Marlin
  № 3  
Ответить с цитированием
Marlin

Регистрация: Feb 2014
Сообщений: 57
первый вариант же работает, там создается экземпляр этого класса , пакет я указал cls.data. , а когда я создаю экземпляр вне trace , у меня вылетает ошибка

Старый 16.10.2015, 10:39
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 4  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,251
Записей в блоге: 6
В первом примере вы создаёте экземпляр не по ссылке levelData, а на прямую:
Код AS3:
currentLevelData = new Level1Data();
__________________
Дети не должны знать о своих родителях

Старый 16.10.2015, 11:33
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 5  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,642
Записей в блоге: 4
Классы, которые берутся через getDefinitionByName должны быть вкомпилированы в проект. А если они нигде не упомянуты или нет специальной настройки компилятора, то они игнорируются. В первом случае класс упомянут
Код AS3:
currentLevelData = new Level1Data(); // здесь
Соответственно он вкомпилировался и все работает.
Во втором случае нет.

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

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

Старый 16.10.2015, 12:37
alexandrratush вне форума Посмотреть профиль Отправить личное сообщение для alexandrratush Найти все сообщения от alexandrratush
  № 6  
Ответить с цитированием
alexandrratush
 
Аватар для alexandrratush

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 529
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
На сколько я знаю, еще можно подключить либу как include.

Старый 16.10.2015, 12:42
Marlin вне форума Посмотреть профиль Отправить личное сообщение для Marlin Найти все сообщения от Marlin
  № 7  
Ответить с цитированием
Marlin

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

Старый 17.10.2015, 09:37
alexandrratush вне форума Посмотреть профиль Отправить личное сообщение для alexandrratush Найти все сообщения от alexandrratush
  № 8  
Ответить с цитированием
alexandrratush
 
Аватар для alexandrratush

Регистрация: Jul 2013
Адрес: Днепр
Сообщений: 529
Отправить сообщение для alexandrratush с помощью ICQ Отправить сообщение для alexandrratush с помощью Skype™
Marlin эти классы в swc или swf библиотеке?

Старый 17.10.2015, 12:39
amesqit вне форума Посмотреть профиль Отправить личное сообщение для amesqit Найти все сообщения от amesqit
  № 9  
Ответить с цитированием
amesqit
 
Аватар для amesqit

Регистрация: Oct 2007
Сообщений: 255
Записей в блоге: 1
Мне кажется гораздо порще и приятнее решить данную задачу через интерфейсы. Для уровня прописывается интерфейс ILevel в котором описываются все функции LevelData. Для Main класса тоже прописывается интерфейс IMain с одной функцией getLevel():ILevel. Таким образом подгрузив этот свф, и зная что его Main это IMain вы без всяких проблем забираете у него ILevel, пользуте и радуетесь. Если несколько уровней в одном свф, то нужно доработать IMain передавая количество уровней и в добавить например индекс getLevel(index:uint):ILevel.
__________________
ответ прост: be || !be == true

Старый 17.10.2015, 12:46
Marlin вне форума Посмотреть профиль Отправить личное сообщение для Marlin Найти все сообщения от Marlin
  № 10  
Ответить с цитированием
Marlin

Регистрация: Feb 2014
Сообщений: 57
Цитата:
Сообщение от alexandrratush Посмотреть сообщение
Marlin эти классы в swc или swf библиотеке?
Да я думал прям в проекте их забить в одну папку, так как там нет никаких новых текстур, только числовые данные.

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:36.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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