![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2009
Сообщений: 28
|
Раньше работал во флеше, где имелся 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); } } } |
|
|||||
|
хм у вас какая-то флекс-каша.
вот где здесь логика? связанный ход мысли? stage есть у всех визуальных компонент, и у application тоже. обычное поведение AS3'шных DisplayObject'ов. значение ненулевое, когда объект добавлен в display list. посмотрите на жизненный цикл флексовых компонент. вы, наверное, обращаетесь к stage слишком рано |
|
|||||
|
Регистрация: Mar 2009
Сообщений: 28
|
Ммммм...
Тогда такой вопрос: как указать главный класс во 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); } } } <?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>
TypeError: Error #1009: Cannot access a property or method of a null object reference. Т.к. stage === null |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Дождитесь события ADDED_TO_STAGE.
|
|
|||||
|
Регистрация: Aug 2007
Сообщений: 467
|
А что такой код у вас во Флеше работал ?
__________________
Лучше быть умным и иногда делать глупости, чем глупым и постоянно умничать! |
|
|||||
|
Регистрация: Mar 2009
Сообщений: 28
|
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 null А строчка в MXML файле в функции initApp Выдает initApp [object Stage] Т.е. в MXML stage существует, а в mainClass переменная stage == null |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Потому что это был рутовый класс, он уже был на сцене.
А у вас событие не вызывается потому что mainClass не добавлен в display list. |
|
|||||
|
Регистрация: Mar 2009
Сообщений: 28
|
__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>
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 Спасибо всем откликнувшимся ![]() |
|
|||||
|
... Чё то странное.. )
Даже если убрать странности получается так ... 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 но квадрат рисуется.. наверно таки это не самый верный способ... х.з. Последний раз редактировалось xdoom; 29.03.2009 в 20:54. |
|
|||||
|
Регистрация: Feb 2011
Сообщений: 21
|
Тема старая, но всё равно напишу.
xdoom, "variable 'tmp' has no type declaration" - переменная 'tmp' не имеет определения типа. надо в коде писать Тип может быть mainClass либо UIComponent наверное =) |
![]() |
![]() |
Часовой пояс GMT +4, время: 22:57. |
|
|
« Предыдущая тема | Следующая тема » |
|
|