Как нарисовать спрайту за пределами класса - PullRequest
0 голосов
/ 26 декабря 2009

Мне интересно (основываясь на правилах определения объема работ), как я могу сделать следующее: Я хочу нарисовать спрайт, который существует на главной сцене, на которой у меня есть экземпляр класса.

Так что-то вроде

public function MyClass(reference:String){
   this.reference = reference;
}

public function drawToOutsideSprite(){
   this.parent.getChildByName(this.reference).addChild(someLoaderName);
}

Буду ли я использовать super () в этом случае или какова обычная методология?

Спасибо, JML

1 Ответ

1 голос
/ 26 декабря 2009

Есть несколько способов сделать это. Я предполагаю, что ваш MyClass расширяется Sprite.


<code>package
{
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.display.Sprite;
    /**
     *  MyClass
     */
    public class MyClass extends Sprite
    {
        public var referenceA:String;
        public var referenceB:Sprite;</code>
<code>
        public function get referenceA_way2():Sprite
        {
            return this.parent.getChildByName(referenceA);
        }
        /**
         *  MyClass Constructor
         */
        public function MyClass(referenceA:String = null, referenceB:Sprite = null)
        {
            super();
            this.referenceA = referenceA;
            this.referenceB = referenceB;
        }</code>
<code>
        public function drawToOutsideSpriteA(child:DisplayObject):void
        {
            // referenceA
            this.parent.getChildByName(this.referenceA).addChild(child);
            // or
            referenceA_way2.addChild(child);
        }</code>
<code>
        public function drawToOutsideSpriteB(child:DisplayObject):void
        {
            // referenceB
            referenceB.addChild(child);
        }</code>
<code>
        public function drawToOutsideSpriteC(referenceC:String, child:DisplayObject):void
        {
            this.parent.getChildByName(referenceC).addChild(child);
        }</code>
<code>
        // Do this:
        // it allows you to abstract out the logic of getting the main sprite
        // into some util class, so you could reuse that functionality elsewhere,
        // and so your code is cleaner.
        public function drawToOutsideSpriteD(child:DisplayObject):void
        {
            StageUtil.getMainSprite().addChild(child);
        }
    }
}</code>
<code>
package
{
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.display.Sprite;
    /**
     *  MyClass
     */
    public class StageUtil
    {
        private static var root:Stage;</code>
<code>
        /**
         *  Called when app first starts
         */
        public static function initialize(stage:Stage):void
        {
            root = stage;
        }</code>
<code>
        public static function getMainSprite():DisplayObjectContainer
        {
            return root; // or something more complex,
            // like a recursive function to getSpriteByName
        }</code>
<code>
        public static function addToStage(child:DisplayObject):DisplayObject
        {
            return getMainSprite().addChild(child);
        }
    }
}</code>

В общем, я бы абстрагировал логику для получения "основного" спрайта в некоторый класс util / manager, потому что вы не хотите жестко закодировать это в свой MyClass, поскольку вам это может понадобиться в других местах, и вы могли бы хочу настроить его позже. Похоже, вы просто спрашиваете, как лучше всего ссылаться на спрайты вне области действия MyClass, поэтому я просто говорю, что поместите его в Util, предполагая, что у него есть веская причина быть их (например, FlexGlobals.topLevelApplication во Flex, так что вы можете легко получить доступ к приложению).

Я не рекомендую передавать id или name в конструктор и делать это таким образом, я вообще не рекомендую аргументы конструктора вообще. Я бы просто передал их в метод, если вам нужно, или он встроен в сам класс или Util.

Чтобы немного прояснить вопрос об области видимости ... Обычно вы не хотите рисовать спрайты вне области действия класса, в котором вы находитесь, если только они не обладают какой-то специальной функциональностью, на которую ссылаются несколько классов с совершенно разными прицелы. Это потому, что вещи не имеют смысла, кто добавляется к кому. Но некоторые хорошие примеры того, когда это сделать, включают:

  • Кнопки с всплывающими подсказками: подсказки добавляются в корень, потому что они отображаются поверх всего, но кнопка может иметь глубину 20 дочерних элементов, поэтому вы можете иметь в подклассе Button, возможно, addToolTip(child).
  • Всплывающие окна: вы можете добавить всплывающее окно из MyClass, но оно действительно добавляется на сцену. В flex это как PopUpManager.addPopUp(child), так же как и в примере StageUtil.getMainSprite().addChild(child). Вы могли бы даже обернуть этот метод, чтобы он был похож на тот, что в классе выше, addToStage.
  • Стадия трансформации / рисования: Если у вас есть какой-то глобальный этап рисования или место, где вы масштабируете / изменяете размеры, вы можете захотеть добавить / удалить графику из этого класса из любого класса.

Метод super() в этом сценарии бесполезен. Единственный раз, когда вы действительно используете super(), это если вы переопределили метод и хотите получить доступ к реализации суперклассов. Примерно так (при условии, что вы расширяете Sprite):


<code>override public function addChild(child:DisplayObject):DisplayObject
{
    if (child is MyDrawingSprite)
        return StageUtil.addToStage(child); // add to main stage
    else
        return super.addChild(child); // add directly to this class
}</code>

В противном случае попробуйте просто добавить детей непосредственно в «Мой класс».

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...