如何在类之外绘制一个精灵

时间:2009-12-26 02:16:37

标签: flex actionscript-3

我想知道(根据范围规则)我如何做以下事情: 我想绘制一个存在于主舞台上的精灵,我在其中实例化了一个类。

类似

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

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

在这种情况下我会使用super(),或者通常的方法是什么?

谢谢, JML

1 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点。我假设您MyClass延长了Sprite


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;

        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;
        }

        public function drawToOutsideSpriteA(child:DisplayObject):void
        {
            // referenceA
            this.parent.getChildByName(this.referenceA).addChild(child);
            // or
            referenceA_way2.addChild(child);
        }

        public function drawToOutsideSpriteB(child:DisplayObject):void
        {
            // referenceB
            referenceB.addChild(child);
        }

        public function drawToOutsideSpriteC(referenceC:String, child:DisplayObject):void
        {
            this.parent.getChildByName(referenceC).addChild(child);
        }

        // 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);
        }
    }
}

package
{
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.display.Sprite;
    /**
     *  MyClass
     */
    public class StageUtil
    {
        private static var root:Stage;

        /**
         *  Called when app first starts
         */
        public static function initialize(stage:Stage):void
        {
            root = stage;
        }

        public static function getMainSprite():DisplayObjectContainer
        {
            return root; // or something more complex,
            // like a recursive function to getSpriteByName
        }

        public static function addToStage(child:DisplayObject):DisplayObject
        {
            return getMainSprite().addChild(child);
        }
    }
}

一般情况下,我会抽出将“主”精灵放入某个util / manager类的逻辑,因为你不想将它硬编码到你的MyClass中,因为你可能在其他地方需要它,你可能会想要在以后定制它。听起来你只是问你在MyClass范围之外引用sprite的最佳方法是什么,所以我说只是把它放到Util中,假设它有充分的理由成为他们(就像Flex中的FlexGlobals.topLevelApplication,所以你可以轻松访问应用程序)。

我不建议将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; 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; }传入构造函数并以此方式执行,我根本不推荐构造函数参数。如果你需要的话,我会将它们传递给一个方法,或者将它们内置到类本身或者Util中。

稍微澄清一下范围界定问题...你通常不想在你所在类的范围之外绘制精灵,除非它们有一些特殊的功能,这些功能将由多个完全不同的类引用范围。这是因为事情开始没有意义,谁被添加到谁。但是关于何时这样做的一些好例子包括:

  • 带有工具提示的按钮:工具提示被添加到根目录中,因为它们出现在所有内容的顶部,但是一个Button可能是20个孩子深,所以你可能在Button子类中有 public function drawToOutsideSpriteA(child:DisplayObject):void { // referenceA this.parent.getChildByName(this.referenceA).addChild(child); // or referenceA_way2.addChild(child); }
  • PopUps:你可能想在MyClass中添加一个弹出窗口,但它确实被添加到舞台上。在flex中,这就像 public function drawToOutsideSpriteB(child:DisplayObject):void { // referenceB referenceB.addChild(child); }一样,就像示例 public function drawToOutsideSpriteC(referenceC:String, child:DisplayObject):void { this.parent.getChildByName(referenceC).addChild(child); }一样。您甚至可以将该方法包装起来,就像上面的类 // 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); } } }中那样。
  • 转换/绘制阶段:如果您有一些全局绘画阶段,或者您缩放/调整大小的位置,您可能希望能够从任何类添加/删除图形。

package { import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.display.Sprite; /** * MyClass */ public class StageUtil { private static var root:Stage;方法在此方案中无用。您真正使用 /** * Called when app first starts */ public static function initialize(stage:Stage):void { root = stage; }的唯一情况是,如果您已重写方法,并希望访问超类实现。这样的事情(假设你正在扩展Sprite):


        public static function getMainSprite():DisplayObjectContainer
        {
            return root; // or something more complex,
            // like a recursive function to getSpriteByName
        }

否则,请尽量将孩子直接添加到“MyClass”。

希望有所帮助。