|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Apr 2013
Сообщений: 77
|
Обращение к переменной подгружаемой swf-ки
1.)Объясните, пожалуйста, почему при загрузке в файл А файла Б, дети класса loadedClass Файла Б переименовываются? Конкретный пример. rect переименовывается в instance3.
Файл А. loader.load(new URLRequest("../lib/loadedClass.swf")); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderListener); private function loaderListener(e:Event):void { var sprite:Sprite = e.currentTarget.content; addChild(sprite); trace(sprite.getChildAt(0).name); //instance3 , а не rect. Вот тут идёт замена имени, как это работает? } package a { import flash.display.Shape; import flash.display.Sprite; public class loadedClass extends Sprite { public var rect:Shape; public var test:String = "89"; public function loadedClass() { rect = new Shape(); rect.graphics.lineStyle(1); rect.graphics.drawRect(20, 20, 20, 20); this.addChild(rect); } public static function tracer():void{ trace("tracer!"); } } } |
|
|||||
не переименовывается там ничего.
Поле name дисплей объекта, и название переменной в классе не имеют ничего общего. Простой пример: |
|
|||||
Регистрация: Apr 2013
Сообщений: 77
|
caseyryan, спасибо. Но почему тогда у меня не выходит обратиться к ребенку/переменной rect вот так sprite.rect ? Или это невозможно?
|
|
|||||
потому что тип данных Sprite. А у спрайта нет свойства rect.
То есть в этом случае надо писать не а Но работать это не будет, потому что программа не знает что такое loadedClass. Советую почитать про интерфейсы. |
|
|||||
Регистрация: Apr 2013
Сообщений: 77
|
caseyryan, еще раз Огромное спасибо.
|
|
|||||
Lorem ipsum
|
Idon'tKnow, на форуме принято для каждого вопроса создавать отдельную тему, и уж тем более неприемлемым является заголовок с перечислением вопросов. В данном случае вопрос по сути один: "Обращение к переменной подгружаемой swf-ки".
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Apr 2013
Сообщений: 77
|
Zebestov, прошу прощения. Я просто думал это одна и та же проблема.
Продолжая тему, Вопрос: var sprite:Sprite = (e.currentTarget.content); trace(sprite);// [object loadedClass] Т.е возвращает объект типа loadedClass? trace(sprite.test);// Но обратиться к этому свойству не даёт... [object loadedClass] ? P.S. Компилятор тоже выдает, что и было выше сказано... Access of possibly undefined property test through a reference with static type flash.display:Sprite. trace(sprite.test); |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Потому что трейс выдает то, что возвращает метод toString(). Поскольку Ваш "спрайт" на самом деле экземпляр класса loadedClass, его переопределенный toString() возвращает [object loadedClass]. Но сама переменная sprite имеет тип Sprite, у которого нет метода test(), о чем и сообщает компилятор. Он то не в курсе, что этот спрайт уже не совсем спрайт)))
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Apr 2013
Сообщений: 77
|
Wolsh, благодарю! Пойду еще поковыраюсь)))
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Как уже сказал caseyryan, чтобы обратиться к такому добавленному методу расширенного класса, Ваша загружающая свф должна знать этот класс. То есть импортировать его. А это, конечно же, не всегда оптимально и даже не всегда возможно (зачем, спрашивается, делать отдельную свф с классом, который итак имеется в главной свф, да?). Поэтому в таких случаях используют интерфейсы. Интерфейс это тип данных, так же как и класс. Но интерфейс не содержит сам код методов, то есть ничего не делает. Он только гарантирует, что методы с таким названием (с точной сигнатурой) у данного экземпляра точно есть. Интерфейс тоже придется импортировать и в главную свф, и в загружаемую. Но он практически ничего не весит, не привязан ни к какой графике и никак не может вмешиваться в работу программы, поскольку не содержит самих действий.
Попробуйте. import a.ITest; public class loadedClass extends Sprite implements ITest { //... public function test():void { trace("Шалость удалась!"); } import a.ITest; loader.load(new URLRequest("../lib/loadedClass.swf")); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderListener); private function loaderListener(e:Event):void { var sprite:ITest = e.currentTarget.content as ITest; addChild(sprite as Sprite); sprite.test(); }
__________________
Reality.getBounds(this); |
Часовой пояс GMT +4, время: 04:57. |
|
« Предыдущая тема | Следующая тема » |
|
|