Почему этот прямоугольник не рисуется?

public class Greeter extends MovieClip
{

    public function Greeter()
    {
        addEventListener(Event.ADDED_TO_STAGE, go);
    }

    private function go(evt:Event):void
    {
        removeEventListener(Event.ADDED_TO_STAGE, go);
        var _root:MovieClip = parent.parent as MovieClip;

        var sp:Sprite = new Sprite();

        // Desenhando com um objeto graphics
        var g:Graphics = sp.graphics;
        g.beginFill(0xFF0000, 1);
        g.drawRect(10, 10, 300, 200);
        g.endFill();

        _root.addChild(sp);
    }
}

mxml-файл:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="1024" minHeight="768"
               creationComplete="initApp()">

        <fx:Script>
            <![CDATA[
                public function initApp():void
                {
                    var greeter:Greeter = new Greeter();
                }
            ]]>
        </fx:Script>

</s:Application>

--ответ:

Добавьте на сцену с помощью addElement и расширяйте spark.core.SpriteVisualElement.


person The Student    schedule 13.08.2010    source источник


Ответы (3)


Вам нужно добавить приветствие на сцену

public function initApp():void
{
    var greeter = new Greeter();
    addChild( greeter );
}

При вызове addChild(greeter) он запускает прослушиватель событий, который вы добавили в конструкторе Greeter, и вызывает метод go, в котором вы рисуете свой прямоугольник. Обратите внимание, что вам не нужно делать: _root.addChild(sp); Так как приветствие добавляется на сцену в методе initApp, вы можете просто добавить sp к приветствию, выполнив addChild( sp ) в методе go.

person dotminic    schedule 13.08.2010
comment
Спасибо! Но теперь я получил: Ошибка: addChild() недоступен в этом классе. Вместо этого используйте addElement() или измените скин, если он у вас есть.; Использование addElement дает компилятору ошибку: Неявное приведение значения типа Greeter к несвязанному типу mx.core:IVisualElement. - person The Student; 13.08.2010
comment
Класс Greeter должен реализовать IVisualElement - person dotminic; 13.08.2010
comment
при добавлении реализует IVisualElement возникает ошибка с огромным списком методов, которые нужно реализовать.. разве нельзя что-то просто расширить? - person The Student; 13.08.2010
comment
Я думаю, если все, что вы хотите сделать, это добавить экранный объект на сцену, возможно, вам следует подумать о создании проекта AS3, а не проекта Flex. В любом случае, что вы можете сделать, так это: Greeter расширяет SpriteVisualElement, а в методе initApp используйте addElement(), а не addChild. - person dotminic; 13.08.2010

Зачем ты это делаешь?

var _root:MovieClip = parent.parent as MovieClip;
...
_root.addChild(sp);

Этот стиль управления списками отображения напоминает снисходительность ActionScript 2 к инкапсуляции и полиморфизму.

Ваш объект Greeter не должен пытаться получить доступ к элементам над ним в списке отображения таким образом. Greeter должен добавить этот прямоугольник как дочерний элемент самого себя, и в этом контексте нет причин использовать объекты MovieClip, более подходящими являются спрайты.

Чтобы ответить на ваш вопрос и исправить полученный ответ о addChild, использование приложения Spark вместо mx:Application является причиной того, что addChild не является допустимой функцией. Экземпляры приложения Spark должны содержать новое поколение экранных объектов, как указано выше, либо расширение SpriteVisualElement, либо объект, реализующий функции, определенные в IVisualElement.

Если вы не используете функции компоновки и создания скинов Spark, просто перейдите на использование тега приложения Flex 3/Halo/mx, и вы сможете, как и ожидалось, addChild() со стандартным объектом, расширяющим Sprite, вместо SpriteVisualElement.

person Aaron    schedule 13.08.2010
comment
Сам я этого не делаю, я только что получил образец из Интернета.. ActionScript 3 не так уж много используется для разработки игр.. Теперь я попытаюсь расширить SpriteVisualElement и вернусь сюда.. - person The Student; 16.08.2010

Вы вызываете только конструктор.

Внутри конструктора вы добавляете прослушиватель событий.

В любом месте вашего кода вы рисуете прямоугольник.

person Daniel Moura    schedule 13.08.2010
comment
(отрицательный был не мой) Я рисую прямоугольник методом go(), который запускается событием ADDED_TO_STAGE.. ;) - person The Student; 13.08.2010
comment
Извините, что по ошибке нажал минус. - person dotminic; 13.08.2010
comment
теперь мой отрицательный, это должен быть комментарий, а не ответ .. ;) - person The Student; 16.08.2010