Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Обращение к переменной подгружаемой swf-ки (http://www.flasher.ru/forum/showthread.php?t=199518)

Idon'tKnow 19.05.2013 20:33

Обращение к переменной подгружаемой swf-ки
 
1.)Объясните, пожалуйста, почему при загрузке в файл А файла Б, дети класса loadedClass Файла Б переименовываются? Конкретный пример. rect переименовывается в instance3.

Файл А.

Код AS3:

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. Вот тут идёт замена имени, как это работает?
                }

Файл Б.

Код AS3:

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!");
                }
        }
}

2.) А как исходя из этого кода, обратиться к переменной
Код AS3:

public var test:String = "89";

через загруженный экземпляр -
Код AS3:

var sprite:Sprite  = e.currentTarget.content;

?

caseyryan 19.05.2013 20:38

не переименовывается там ничего.
Поле name дисплей объекта, и название переменной в классе не имеют ничего общего.

Простой пример:
Код AS3:

 
rect = new Shape();
rect.graphics.lineStyle(1);
rect.graphics.drawRect(20, 20, 20, 20);
this.addChild(rect);
trace(rect.name); // выдаст тоже что-то на подобие instance01


Idon'tKnow 19.05.2013 20:41

caseyryan, спасибо. Но почему тогда у меня не выходит обратиться к ребенку/переменной rect вот так sprite.rect ? Или это невозможно?

caseyryan 19.05.2013 20:55

потому что тип данных Sprite. А у спрайта нет свойства rect.
То есть в этом случае надо писать не
Код AS3:

var sprite:Sprite  = e.currentTarget.content;

а
Код AS3:

var sprite:loadedClass   = e.currentTarget.content as loadedClass;

Но работать это не будет, потому что программа не знает что такое loadedClass.
Советую почитать про интерфейсы.

Idon'tKnow 19.05.2013 21:03

caseyryan, еще раз Огромное спасибо.

Zebestov 19.05.2013 23:33

Idon'tKnow, на форуме принято для каждого вопроса создавать отдельную тему, и уж тем более неприемлемым является заголовок с перечислением вопросов. В данном случае вопрос по сути один: "Обращение к переменной подгружаемой swf-ки".

Idon'tKnow 19.05.2013 23:44

Zebestov, прошу прощения. Я просто думал это одна и та же проблема.
Продолжая тему,

Вопрос:
Код AS3:

var sprite:Sprite  = (e.currentTarget.content);
trace(sprite);// [object loadedClass] Т.е возвращает объект типа loadedClass?
trace(sprite.test);// Но обратиться к этому свойству не даёт...

Вроде, как было сказано caseyryan'ом, sprite является типом Sprite, но почему трейсится
[object loadedClass] ?

P.S. Компилятор тоже выдает, что и было выше сказано...
Access of possibly undefined property test through a reference with static type flash.display:Sprite.
trace(sprite.test);

Wolsh 19.05.2013 23:48

Потому что трейс выдает то, что возвращает метод toString(). Поскольку Ваш "спрайт" на самом деле экземпляр класса loadedClass, его переопределенный toString() возвращает [object loadedClass]. Но сама переменная sprite имеет тип Sprite, у которого нет метода test(), о чем и сообщает компилятор. Он то не в курсе, что этот спрайт уже не совсем спрайт)))

Idon'tKnow 19.05.2013 23:51

Wolsh, благодарю! Пойду еще поковыраюсь))) :)

Wolsh 20.05.2013 00:58

Как уже сказал caseyryan, чтобы обратиться к такому добавленному методу расширенного класса, Ваша загружающая свф должна знать этот класс. То есть импортировать его. А это, конечно же, не всегда оптимально и даже не всегда возможно (зачем, спрашивается, делать отдельную свф с классом, который итак имеется в главной свф, да?). Поэтому в таких случаях используют интерфейсы. Интерфейс это тип данных, так же как и класс. Но интерфейс не содержит сам код методов, то есть ничего не делает. Он только гарантирует, что методы с таким названием (с точной сигнатурой) у данного экземпляра точно есть. Интерфейс тоже придется импортировать и в главную свф, и в загружаемую. Но он практически ничего не весит, не привязан ни к какой графике и никак не может вмешиваться в работу программы, поскольку не содержит самих действий.
Попробуйте.
Код AS3:

import a.ITest;
public class loadedClass extends Sprite implements ITest {
                //...
                public function test():void {
                        trace("Шалость удалась!");
                }

a/ITest.as
Код AS3:

package a {
        public interface ITest {
                function test():void
        }
}

Код AS3:

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();
}



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

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