kagamihogeの日記

kagamihogeの日記です。

Canvas に Sprite や Shape が addChild できない件

原因と対策はこちら FlexでCanvasにSpriteをaddChildできない件について - 午睡二時四十分

Canvas というかコンテナ系クラスの addChild は IUIComponent インターフェイスを実装したクラスでなければならない。引数の型は DisplayObject にもかかわらず。

罠すぎないか? これw 直感的には入れられてもおかしくないと思うよなぁ。でも、Sprite と Shape の型階層は下記のようになってるから、リファレンスに書いてある通り実行時にエラーになる。


Sprite -> DisplayObjectContainer -> InteractiveObject -> DisplayObject -> EventDispatcher -> Object
Shape -> DisplayObject -> EventDispatcher -> Object

TextInput なんかは IUIComponent インタフェースを実装した UIComponent を継承している。つまり Sprite や Shape は TextInput などの UIComponent 系のコンポーネントとは異質?ってこと? なぜこうなっているかの理由は、推測だけども Sprite や Shape は Flash Player の古い時代から存在してる代物だから?

というわけでトラバ先のコードを丸コピだけども回避策について。UIComponent を継承して Sprite をラップするクラスを作るというやり方を紹介していました。

package mycomponent
{
    import flash.display.Sprite;
    import mx.core.UIComponent;

    public class MySprite extends UIComponent
    {
        private var sprite:Sprite = new Sprite();
        public function MySprite() {
            super();
        }

        public function get asSprite():Sprite {
            return this.sprite;
        }

        override protected function createChildren():void {
            super.createChildren();
            this.addChild(sprite);
        }
    }
}

Shape は Sprite に突っ込めばおkかなと。使い方もあわせてこんな感じ。

var mySprite:MySprite = new MySprite();
hogeCanvas.addChild(mySprite);

mySprite.asSprite.addChild(new Sprite());