2009-12-26 48 views
0

我想知道(基于范围规则)我可能如何执行以下操作: 我想绘制一个存在于我有一个类的主舞台上的精灵实例化。如何绘制到类之外的精灵

因此,像

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

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

我会在这种情况下使用超(),或有什么方法如常?

感谢, JML

回答

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 /经理类,因为你不想硬编码到你的MyClass的,因为你可能需要它在逻辑其他地方,你可能想在稍后进行定制。这听起来像你只是问什么是在MyClass范围之外引用sprites的最好方法,所以我说只是把它放到Util中,假设它有很好的理由(比如Flex中的FlexGlobals.topLevelApplication,所以你可以轻松访问应用程序)。

我不建议将idname的构造函数传递给构造函数,并且这样做,我根本不推荐构造函数参数。如果需要的话,我可以将它们传递给方法,或者将其内置到类本身或Util中。

要清除范围问题有点...通常不想绘制到你所在类的范围之外的精灵,除非他们有一些特殊的功能将被多个类共同引用不同的范围。这是因为事情开始没有意义,谁加入了谁。但在什么时候做thatinclude一些很好的例子:

  • 按钮工具提示:因为他们出现在一切之上的工具提示添加到根,但巴顿可能是20个孩子深,所以你必须在Button子类,或许是addToolTip(child)
  • PopUps:你可能想从MyClass中添加一个弹出窗口,但它真的被添加到舞台上。在flex中,这就像PopUpManager.addPopUp(child),就像样本StageUtil.getMainSprite().addChild(child)一样。你甚至可以包装该方法,以便像上面的类中那样,addToStage
  • 变换/绘图阶段:如果您有一些全局绘画阶段,或者您调整/调整大小的地方,您可能希望能够从任何课程中添加/删除图形。

super()方法在这种情况下没有用。你真的使用super()的唯一时间是如果你重写了一个方法,并且想要访问超级类的实现。像这样的东西(假设你扩展雪碧):


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 } 

否则,尝试坚持只是直接将孩子送到“MyClass的”。

希望有所帮助。

+0

OK;我看到一件事情,我有一个问题: 即使我使用StageUtil类方法,是否还必须调用super()? 我不认为我必须,对吧? 也许有人可以向我解释在什么情况下绝对有必要打电话给超级... 谢谢, jml – jml 2009-12-26 17:08:37

+0

你不需要调用超级,除非你重写一个方法,你想在某些点执行超类功能。 – 2009-12-26 18:46:40

+0

真棒。谢谢您的帮助。 – jml 2009-12-26 22:44:25

相关问题