Почему этот прямоугольник не нарисован? - PullRequest
1 голос
/ 13 августа 2010
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.

Ответы [ 3 ]

2 голосов
/ 13 августа 2010

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

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

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

1 голос
/ 14 августа 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 Application, и вы сможете добавить addChild (), как и ожидалось, со стандартным объектом, расширяющим Sprite вместо SpriteVisualElement.

0 голосов
/ 13 августа 2010

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

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

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

...