原因と対策はこちら 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());