プログラミングやる前に先お風呂はいっちゃいなさい

243月/090

先日のリングコマンドの不具合について

どうにも気持ち悪かったんで、先日アップしたリングコマンドの不具合について調べてました。

どうやら、僕がUIComponentにBitmapをaddChildして使う際に行った実装がまずかったみたいです。

UIDecorator.as 

  1. public class UIDecorator extends UIComponent
  2. {
  3.   public function UIDecorator(displayObject:DisplayObject)
  4.   {
  5.     super();
  6.     BindingUtils.bindSetter(bindCenter, this, "centerX");
  7.     BindingUtils.bindSetter(bindCenter, this, "centerY");
  8.     this.displayObject = displayObject;
  9.     super.addChild(this.displayObject);
  10.   }
  11.  
  12.   [Bindable] public var centerX:Number = 0;
  13.   [Bindable] public var centerY:Number = 0;
  14.  
  15.   private function bindCenter(dummy:Number):void
  16.   {
  17.     this.lx = this.lx;
  18.     this.ly = this.ly;
  19.   }
  20.  
  21.   [Bindable]
  22.   public function get lx():Number
  23.   {
  24.     return super.x + centerX;
  25.   }
  26.   public function set lx(value:Number):void
  27.   {
  28.     super.x = value - centerX;
  29.   }
  30.  
  31.   [Bindable]
  32.   public function get ly():Number
  33.   {
  34.     return super.y + centerY;
  35.   }
  36.   public function set ly(value:Number):void
  37.   {
  38.     super.y = value - centerY;
  39.   }
  40.  
  41.   public override function set width(value:Number):void
  42.   {
  43.     super.width = value;
  44.     displayObject.width = value;
  45.   }
  46.   public override function set height(value:Number):void
  47.   {
  48.     super.height = value;
  49.     displayObject.height = value;
  50.   }
  51.  
  52.   public var displayObject:DisplayObject;
  53. }

こんな感じに実装してみた。
これは正解のソースで、本当はコンストラクタの中でdisplayObjectの幅と高さをthisの幅と高さにバインドする処理が入ってました。

で、このバインドを信用していたんだけど、どうもビルドするたびに、このバインドが利いたり利かなかったり・・・。
もう、なんでこんな曖昧なんだ。。バインド。。一気に僕の信用を落としました。

さて、で、これではBitmapをまだaddChildしてないので、ちゃんとBitmapをaddChildするようにコレを継承して、こんなのを作りました。

UIBitmap.as

  1. public class UIBitmap extends UIDecorator
  2. {
  3.   private var _bitmap:Bitmap;
  4.   public function UIBitmap(bitmapData:BitmapData=null)
  5.   {
  6.     super(new Bitmap());
  7.     _bitmap = this.displayObject as Bitmap;
  8.     this.bitmapData = bitmapData;
  9.   }
  10.  
  11.   public function set bitmapData(value:BitmapData):void
  12.   {
  13.     _bitmap.bitmapData = value;
  14.     if (value == null)
  15.       return;
  16.     this.width = value.width;
  17.     this.height = value.height;
  18.   }
  19.   public function get bitmap():Bitmap
  20.   {
  21.     return _bitmap;
  22.   }
  23. }

このソースも正解のソース。
本当はbitmapDataのsetterの中でthisの幅と高さを入れる処理はしてなかった。

まあ、つまり、UIComponentに入れたBitmapのサイズがバインド処理で行うはずなのに行われてなかったというものでした。

おわり。

明日は、MXMLで書くXMLパーサを作った話を書く予定。