Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как правильно обратиться к свойствам контента Loader'а из класса-потомка? (http://www.flasher.ru/forum/showthread.php?t=128239)

kirea 03.08.2009 09:35

Как правильно обратиться к свойствам контента Loader'а из класса-потомка?
 
Здравствуйте, простите, если уже было, но я по поиску на форуме не смог найти ответ (((
У меня проблема заключается в том, что я не могу обратиться к некоторым свойствам контента Лоадера.
Я создал класс, который управляет загрузкой, отображением и размещением подгружаемой SWF-ки:
Код AS3:

public class MovieLoader extends Loader

Я этот класс использовал для подгрузки декоративных элементов для сайта: каждый элемент дизайна - отдельный объект класса MovieLoader. Всё отлично работает в плане загрузки, позицирования, масштабирования и т.п. Но когда мне понадобилось сделать некоторые элементы активными для пользователя, я не смог обратиться из самого класса MovieLoader к некоторым свойствам подгруженной SWF:
Код AS3:

buttonMode = true;
useHandCursor = true;

- так не работает. Попробовал по-другому - тоже безуспешно:
Код AS3:

var m:MovieClip = content as MovieClip;
m.buttonMode = true;
m.useHandCursor = true;

Выдает TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
Помогите, пожалуйста, как обратиться к свойствам и поменять их

marat_sa 03.08.2009 09:51

Может сделать композицию: в кастомном классе, расширяющем Sprite создаем экземпляр Loader. buttonMode и useHandCursor будут работать у этого класса кастомного.

kirea 03.08.2009 10:06

Цитата:

Сообщение от marat_sa (Сообщение 840100)
Может сделать композицию: в кастомном классе, расширяющем Sprite создаем экземпляр Loader. buttonMode и useHandCursor будут работать у этого класса кастомного.

прикол в том, что именно так я и начинал... был у меня
Код AS3:

public class MovieLoader extends MovieClip

всё так же отлично работало, кроме вышеописанной проблеммы. У меня в классе MovieLoader содержался
Код AS3:

private var loader:Loader;

обращения типа
Код AS3:

var m:MovieClip = loader.content as MovieClip;
m.buttonMode = true;

или типа
Код AS3:

loader.content.buttonMode = true;

- тоже не работали.

cleptoman 03.08.2009 10:39

а на какой стадии вы контент от лоадера требуете?..может его нет еще?

Lou 03.08.2009 11:02

buttonMode- свойство Sprite'a, т.е. если Вы загружаете битмап, то его нужно сперва засунуть в Sprite или MovieClip, а потом уже buttonMode использовать. А приведение Bitmap as MovieClip не сработает.

kirea 03.08.2009 11:18

Цитата:

Сообщение от cleptoman (Сообщение 840108)
а на какой стадии вы контент от лоадера требуете?..может его нет еще?

контент уже есть и инициализирован - он уже на экране смасштабирован и спозицирован (сайт "резиновый"): вот и предмет разговора - лого по центру должен стать кликабельным по окончанию догрузки остального контента сайта http://tbcorp.com.ua/
Цитата:

Сообщение от Lou (Сообщение 840110)
buttonMode- свойство Sprite'a, т.е. если Вы загружаете битмап, то его нужно сперва засунуть в Sprite или MovieClip, а потом уже buttonMode использовать. А приведение Bitmap as MovieClip не сработает.

Как было видно на примере, я гружу не битмап, а MovieClip (логотип анимированный). Работает многое: x, y, scaleX, scaleY, alpha и т.п., а специфичные для MovieClip свойства - недоступны!!!

marat_sa 03.08.2009 12:06

> Как было видно на примере, я гружу не битмап, а MovieClip

В смысле SWF чтоли?

buttonMode ставить, как свойство кастомного вашего объекта:
Код AS3:

public class MovieLoader extends Sprite {
 
private var _loader:Loader;
 
public function MovieLoader() {
    this.buttonMode = true;
    _loader = new Loader();
  ...
}
}


kirea 03.08.2009 12:32

Цитата:

buttonMode ставить, как свойство кастомного вашего объекта
Я же и писал, что с самого начала так и делал. приведу ФРАГМЕНТ класса. Незначимые для проблеммы методы и проперти я выбросил для упрощения чтения (загрузка объекта осуществляется из класса докуменка main: после конструктора и установки всех проперти вызывается метод Load() ):
Код AS3:

package mainCode {
import flash.events.*;
import flash.display.*;
import flash.net.*;
import mainCode.main;
 
public class MovieLoader extends MovieClip
{
        public var loader        :Loader;
        public var toStage        :Boolean = false;        //Показывать ли сразу после загрузки?
        public var SwfFile        :String        = '';        //Файл-источник
        //-------------------------------------------------------------------------------
        public function MovieLoader()
        {
 
        }
        //-------------------------------------------------------------------------------
        public function Load():void
        {
                if (main.canLoad) loading()
                else this.addEventListener(Event.ENTER_FRAME, accessToLoad);
        }
        //-------------------------------------------------------------------------------
        private function loading():void
        {
                main.canLoad = false;
                var req:URLRequest = new URLRequest(SwfFile);
                loader = new Loader();
                loader.contentLoaderInfo.addEventListener(Event.INIT, fileLoaded);
                if (!NoPreload) loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, setPreload);
                loader.load(req);
        }
        //-------------------------------------------------------------------------------
        private function accessToLoad(event:Event):void
        {
                if (main.canLoad)
                {
                        loading();
                        this.removeEventListener(Event.ENTER_FRAME, accessToLoad);
                }
        }
        //-------------------------------------------------------------------------------
        private function fileLoaded(event:Event):void
        {
                loader.x = x;
                loader.y = y;
 
                moveIt();
                if (toStage) showOnStage();
                main.swfRemain--;
                main.canLoad = true;
 
                loader.contentLoaderInfo.removeEventListener(Event.INIT, fileLoaded);
                if (!NoPreload) loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, setPreload);
                main.swfStage.addEventListener(Event.RESIZE, moveIt);
 
                if (main.swfRemain == 0) main.allLoaded();
 
                var m:MovieClip = loader.content as MovieClip;    //НЕ РАБОТАЕТ
                m.buttonMode = true;          //НЕ РАБОТАЕТ
        }
        //-------------------------------------------------------------------------------
}        //class
}        //package

и просто buttonMode = true без обращения к content тоже не работает.

wvxvw 03.08.2009 12:43

loader.content не обязан быть MovieClip, вполне может быть просто Sprite, или пользовательский класс наследник Sprite.
buttonMode - у Loader нет такого свойства.

kirea 03.08.2009 13:09

Цитата:

Сообщение от wvxvw (Сообщение 840134)
loader.content не обязан быть MovieClip, вполне может быть просто Sprite, или пользовательский класс наследник Sprite.
buttonMode - у Loader нет такого свойства.

ну если загружен именно MovieClip, неужели нету никакого способа изменять свойства загруженного мувика. Кроме, конечно, банального разделения моего класса на два класса: отдельно для Лоадера, и второй отдельный для управления мувиком. Уж очень не хочется менять интерфейсную часть класса, а то переделывать много в других классах придется...

cleptoman 03.08.2009 14:12

так приведите его к МувиКлипу

kirea 03.08.2009 14:52

Цитата:

Сообщение от cleptoman (Сообщение 840156)
так приведите его к МувиКлипу

на чем начали дискуссию, на том и топчемся (наверное я нечетко сформулировал вопрос). я именно это и хотел с самого начала узнать: почему приведение к MovieClip не работает:
Код AS3:

var m:MovieClip = content as MovieClip;
m.buttonMode = true;  //НЕ РАБОТАЕТ
m.useHandCursor = true;  //НЕ РАБОТАЕТ

и как это обойти, не разрушая структуру класса??? :(

wvxvw 03.08.2009 14:53

>> неужели нету никакого способа изменять свойства загруженного мувика
Изменять что? Документ класс после компиляции? - конечно нет. Добавить свойство buttonMode Loader'у вы тоже не сможете т.как это флешевый класс - хотите, добавляйте его классу-наследнику, например, положите Sprite в Loader и после используйте buttonMode этого спрайта.

kirea 03.08.2009 15:28

Спасибо WVXVW. Хоть не очень удобно, но наверное придется именно так и долбаться.... (((

dimarik 03.08.2009 19:52

А что говорит
Код AS3:

trace( describeType(loader.content) );


kirea 03.08.2009 21:13

Цитата:

Сообщение от dimarik (Сообщение 840251)
А что говорит
Код AS3:

trace( describeType(loader.content) );


как ни странно, он выдает пустую строку. чтобы удостовериться еще раз, сделал так:
Код AS3:

trace('>>>' + describeType(loader.content) + '<<<');

- на выходе получил >>><<<

wvxvw 03.08.2009 21:16

Код AS3:

trace( describeType(loader.content).toXMLString() );


kirea 03.08.2009 21:39

Цитата:

Сообщение от wvxvw (Сообщение 840284)
Код AS3:

trace( describeType(loader.content).toXMLString() );


<type name="null" isDynamic="false" isFinal="true" isStatic="false"/>
:( хотя сам подгруженный SWF до момента вызова этого trace крутится на экране уже несколько секунд, дожидаясь догрузки остального, и все вызовы .x , .y , scaleX, alpha сработали корректно и без проблем

wvxvw 03.08.2009 21:43

Значит вы загружаете MovieClip, и вы дождались только загрузки первого кадра, а не всех кадров.

kirea 03.08.2009 21:47

уже проверил. пока весь сайт с хоста загрузится, логотип успевает проиграть полностью и корректно останавливается на последнем кадре (по stop() ). и только по прошествии пары секунд происходит обращение trace( describeType(loader.content).toXMLString() );


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

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