Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как передать stage и stage3D в объект другого класса? (http://www.flasher.ru/forum/showthread.php?t=161128)

savva 21.07.2011 01:13

Как передать stage и stage3D в объект другого класса?
 
Заголовок не полностью отражает суть вопроса.По порядку
У меня есть пара вопросов,в actionscript 3 примерно с месяц (меня на летнюю практику отправили и дали разбираться с as3 и alternativa3d) всё познать не успеваю.

Собственно вопрос следующим образом

Есть класс сцена в котором прописывается парсер создаются контроллеры пишутся stage.align и прочее.

в main файле пишется
Код:

public class Main extends Scene {}
и всё! Всё прекрасно работает.Почему?В сцене создаётся эмбед xml файла парсится и так далее.

хочется сделать по иному,чтобы в объект класса сцены передавался xml. Но в классе сцена производятся следующие манипуляции
Код:

stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE
.....
stage3D = stage.stage3Ds[0];
stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreate);
stage3D.requestContext3D();

И прочее,там контроллер присобачивается(которому нужно передать stage и прочие элементы.Собственно хочется перейти к такому виду
Код:

import Scene
public class Main
public function Main{
var sc:Scene=new Scene(xml,stage);
}

(Ну что-то в этом духе не охото расписывать,но здесь вероятно придётся создавать тоже stage да?)
Судя по всему придётся всё onEnterFrame и прочее подобные вещи переносить в main да?

Вообще хочется понять разницу между подходами.В первом случае extended я вообще ничего не вызываю,но при этом всё выполняется.(Простите если глупый вопрос,просто в голове не как не уляжется).

Выдаёт ошибку что stage находится в Scene. То есть нужно производить инициализацию stage(всякие align и прочее) и stage3D(stage.stage3ds[0] и т.д.) в Main а потом передавать в сцену?

Извините за сумбурность текста и вопросов,написал как мог.

silin 21.07.2011 11:01

в первом случае (наследование: Main extends Scene ) main это объект Main со всеми свойствами\методами Stage, при его создании выполняется и все то, что прописано в конструкторе Stage

во втором случае (композиция) main просто несет на борту объект Stage, все что будет в нем сделано/определено доступно только через него же (через sc в твоем контексте)

инициализацию, связанную со stage, можно производить и в sc, но после того как stage будет в нем доступен (получит ссылку или будет добавлен в дисплейЛист, если это DisplayObject)

savva 21.07.2011 11:44

А в какой момент объявляется stage? stage он же имеет тип InteractiveObject и как я понимаю чтобы его передать мне нужно его иницилизировать в main?(При этом когда я делал extends Scene в сцене я нигде не объявлял stage, он просто есть откуда-то и я им пользуюсь) то бишь я попытался сделать так:

Код:

package
{
        import flash.display.Sprite;
        import flash.display.Stage3D;
        import flash.events.Event;
                import flash.utils.ByteArray;
        import Scene;
       
        /**
        * ...
        * @author sa
        */
        public class Main
        {
                [Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class;
                public function Main()
                {
                        var file:ByteArray = ((new EmbedModel()) as ByteArray);
                        var str:String = file.readUTFBytes( file.length );
                        var xml:XML = new XML( str );
                        var sc:Scene = new Scene(xml, stage, stage3D);
                }
               
        }
       
}

Но в этом случае у меня undefined property stage.
мне нужно в мэйне объявить что-то вроде
Код:

var eventsource:InteractiveObject;
var stage3D:Stage3D;
....
eventsource=stage;
stage3D = stage.stage3Ds[0];
var sc:Scene=new Scene(xml,eventsource,stage3D);

В смысле добавлен в дисплейлист?Точнее кто? Stage же он он один на всю сцену,это stage3d может быть несколько насколько я знаю(хотя и не представляю как несколькими пользоваться).
Вообще мне желательна композиция чтобы без расширения класса импортировать в любое приложение свои классы и они бы прекрасно работали.

silin 21.07.2011 12:23

>> А в какой момент объявляется stage?

stage нигде не объявляется, это ссылка на объект Stage плеера, она есть у всех диплейОбжектов ( когда они добавлены в дисплей лист)

>> он же имеет тип InteractiveObject и как я понимаю чтобы его передать мне нужно его иницилизировать в main
та же песня: это ссылка\указатель, чтобы ее передать не надо ничего инициализировать..

боюсь мы немного на разных языках говорим, сори

savva 21.07.2011 12:42

Хорошо,тогда поставлю вопрос следующим образом.

Как мне сделать класс Main таким образом чтобы все работы со stage такие как :
Код:

stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE
.....
stage3D = stage.stage3Ds[0];
stage3D.addEventListener(Event.CONTEXT3D_CREATE, onContextCreate);
stage3D.requestContext3D();

Производились в классе не являющимся Main, а классом объект которого создаётся в Main. То бишь в мэйне находился xml парсер и всё.
Код:

package
{
        import flash.display.Sprite;
        import flash.display.Stage3D;
        import flash.events.Event;
                import flash.utils.ByteArray;
        import Scene;
       
        /**
        * ...
        * @author sa
        */
        public class Main
        {
                [Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class;
                public function Main()
                {
                        var file:ByteArray = ((new EmbedModel()) as ByteArray);
                        var str:String = file.readUTFBytes( file.length );
                        var xml:XML = new XML( str );
                        var sc:Scene = new Scene(xml, /*сюда нужно передать stage*/);
                }
        }
}

при вот таком вызове
Код:

.........
        public class Main extends Sprite
        {
                [Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class;
                public function Main()
                {
                        var sc:Scene = new Scene();
                }               
        }
}

в классе Scene появляется ошибка :
Код:

[Fault] exception, information=TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
Как передать stage в класс сцена?

silin 21.07.2011 14:26

вариант 1 (Scene - дисплейОбжект, имеет доступ к stage после addChild(sc))
Код AS3:

public class Main extends Sprite 
{
        [Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class;
        public function Main():void
        {
                var file:ByteArray = ((new EmbedModel()) as ByteArray);
                var str:String = file.readUTFBytes( file.length );
                var xml:XML = new XML( str );
                var sc:Scene = new Scene(xml);
                addChild(sc);// после этого stage будет доступен в самом sc
        }
}

Код AS3:

public class Scene extends Sprite 
{
        public function Scene(xml:XML)
        {
                trace( "xml : " + xml );
                addEventListener(Event.ADDED_TO_STAGE, init);
        }
 
        private function init(e:Event = null):void
        {
                removeEventListener(Event.ADDED_TO_STAGE, init);
                // здесь stage это 'родное' свойство Sprite, доступное после добавления 'на сцену'
                stage.align = StageAlign.TOP_LEFT;
        }
 
}

вариант 2 (sc не добавляем на сцену, он вообще не обязательно должен быть дисплейОбжектом
Код AS3:

public class Main extends Sprite 
{
        [Embed("FormMain.xml", mimeType = "application/octet-stream")] private static const EmbedModel:Class;
        public function Main():void
        {
                var file:ByteArray = ((new EmbedModel()) as ByteArray);
                var str:String = file.readUTFBytes( file.length );
                var xml:XML = new XML( str );
                var sc:Scene = new Scene(xml, stage);
        }
}

Код AS3:

public class Scene 
{
 
        public function Scene(xml:XML, stage:Stage)
        {
                trace( "xml : " + xml );
                // здесь stage это ссылка переданная из объекта, уже имеющего ее
                stage.align = StageAlign.TOP_LEFT;
                trace( "stage : " + stage );
 
        }
}


savva 21.07.2011 15:12

Спасибо большое,работают оба варианта.


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

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