PDA

Просмотр полной версии : Переход на Flex. Трудности со stage


Kennysp
23.03.2009, 12:25
Раньше работал во флеше, где имелся Document class, в котором был объект stage, к которому можно было делать addChild, addEventListener и т.д.

Сейчас решил пересесть на flex. Тут же столкнулся с проблемкой. Во flex используется MXML, таким образом stage доступен только в MXML а в главном классе его нет (stage === null) :(

Есть какой нибудь способ в MXML указать главный класс, чтобы внутри него использовать stage, а не uicomponent?


package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.*;

public class test2 extends Sprite
{
public function test2():void {
var spr: Sprite = new Sprite();
spr.graphics.beginFill(0xFF0000);
spr.graphics.beginFill(0x00FF00, 100);
spr.graphics.lineStyle(1, 0x000000, 100);
spr.graphics.moveTo(200, 200);
spr.graphics.lineTo(200, 300);
spr.graphics.lineTo(300, 300);
spr.graphics.lineTo(300, 200);
var mc: MovieClip = new MovieClip;
mc.addChild(spr);
stage.addChild(mc);
}
}
}

fljot
23.03.2009, 12:46
хм у вас какая-то флекс-каша.

вот где здесь логика? связанный ход мысли?
Во flex используется MXML, таким образом stage доступен только в MXML а в главном классе его нет (stage === null) :(

stage есть у всех визуальных компонент, и у application тоже. обычное поведение AS3'шных DisplayObject'ов. значение ненулевое, когда объект добавлен в display list. посмотрите на жизненный цикл флексовых компонент. вы, наверное, обращаетесь к stage слишком рано

Kennysp
23.03.2009, 13:20
Ммммм...
Тогда такой вопрос: как указать главный класс во flex?
К примеру в CS3 нужно было прописать имя главного класса в поле Document Class и тогда при запуске флешки создавался экземпляр прописанного класса.

Теперь я создаю FLEX проект.
Создаю в нем файл mainClass.as

package {
import flash.display.MovieClip;
import flash.display.Sprite;

public class test2 extends Sprite
{
public function test2():void {
var spr: Sprite = new Sprite();
spr.graphics.beginFill(0xFF0000);
spr.graphics.beginFill(0x00FF00, 100);
spr.graphics.lineStyle(1, 0x000000, 100);
spr.graphics.moveTo(200, 200);
spr.graphics.lineTo(200, 300);
spr.graphics.lineTo(300, 300);
spr.graphics.lineTo(300, 200);
var mc: MovieClip = new MovieClip;
mc.addChild(spr);
stage.addChild(mc);
}
}
}


В MXML файле пишу

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="initApp()">

<mx:Script>
<![CDATA[

public function initApp():void{
import mainClass;
var tmp = new mainClass();
}

]]>
</mx:Script>

</mx:Application>


Строчка stage.addChild(mc); естественно выдает ошибку
TypeError: Error #1009: Cannot access a property or method of a null object reference.
Т.к. stage === null

etc
23.03.2009, 13:31
Дождитесь события ADDED_TO_STAGE.

2morrowMan
23.03.2009, 13:32
А что такой код у вас во Флеше работал ?

Kennysp
23.03.2009, 13:41
2morrowMan, да во Флеше работал. Рисовался квадрат на stage.

Добавлено через 9 минут
Переписал manClass.as:

package {
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.events.*;

public class mainClass extends Sprite {

public function mainClass():void {
trace('mainClass', stage);
addEventListener(Event.ADDED_TO_STAGE, init);
}

public function init():void {
trace('init');
var spr: Sprite = new Sprite();
spr.graphics.beginFill(0xFF0000);
spr.graphics.beginFill(0x00FF00, 100);
spr.graphics.lineStyle(1, 0x000000, 100);
spr.graphics.moveTo(200, 200);
spr.graphics.lineTo(200, 300);
spr.graphics.lineTo(300, 300);
spr.graphics.lineTo(300, 200);
var mc: MovieClip = new MovieClip;
mc.addChild(spr);
stage.addChild(mc);
}
}
}



Конструктор mainClass вызывается, а вот событие ADDED_TO_STAGE не происходит (функция init не вызывается), ну и строчка
trace('mainClass', stage);
выдает mainClass null

А строчка
trace('initApp', stage); в MXML файле в функции initApp
Выдает initApp [object Stage]
Т.е. в MXML stage существует, а в mainClass переменная stage == null

etc
23.03.2009, 13:52
2morrowMan, да во Флеше работал. Рисовался квадрат на stage.

Потому что это был рутовый класс, он уже был на сцене.

А у вас событие не вызывается потому что mainClass не добавлен в display list.

Kennysp
23.03.2009, 14:38
__etc, да вы правы.
Все заработало.
Опишу что нужно было сделать, может кому поможет в будущем =)

Во-первых надо было сделать addChild:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="initApp()">

<mx:Script>
<![CDATA[
import mainClass;
public function initApp():void{
var tmp = new mainClass();
this.addChild(tmp);
}

]]>
</mx:Script>

</mx:Application>


Во-вторых класс должен быть наследником UIComponent, ну и действительно надо дождаться ADDED_TO_STAGE:

package
{
import mx.core.UIComponent;
import mx.events.FlexEvent;
import mx.core.Application;

import flash.events.Event;
import flash.display.Sprite;
import flash.display.MovieClip;

public class mainClass extends UIComponent {

public mainClass Component() {
this.addEventListener( Event.ADDED_TO_STAGE , init );
}

private function init( event:Event ) : void{
trace( this , "init called" , stage );
var spr: Sprite = new Sprite();
spr.graphics.beginFill(0xFF0000);
spr.graphics.beginFill(0x00FF00, 100);
spr.graphics.lineStyle(1, 0x000000, 100);
spr.graphics.moveTo(200, 200);
spr.graphics.lineTo(200, 300);
spr.graphics.lineTo(300, 300);
spr.graphics.lineTo(300, 200);
var mc: MovieClip = new MovieClip;
mc.addChild(spr);
stage.addChild(mc);
}

}
}



PS Спасибо всем откликнувшимся :)

xdoom
29.03.2009, 20:49
public mainClass Component() {
this.addEventListener( Event.ADDED_TO_STAGE , init );
}


... Чё то странное.. )

Даже если убрать странности получается так ...
Severity and Description Path Resource Location Creation Time Id
1008: variable 'tmp' has no type declaration. tnt/src tnt.mxml line 15 1238341897735 120
1008: variable 'tmp' has no type declaration. tnt/src totry.mxml line 8 1238341899554 122

но квадрат рисуется.. наверно таки это не самый верный способ... х.з.

Dmitriy913
16.05.2011, 02:48
Тема старая, но всё равно напишу.
xdoom, "variable 'tmp' has no type declaration" - переменная 'tmp' не имеет определения типа.
надо в коде писать var tmp:<тип> = new mainClass();
Тип может быть mainClass либо UIComponent наверное =)