ボタンの中のボタン

Flashの特性としてボタンのなかにボタンがあると外側のボタンにしか反応しなくなる.
MovieClipは外側のMCの属性を継承するので(_alphaとか_visibleとかと同様)外側のボタンをenbaledfalseにしてもこの問題は×.

ボクなりの解決方法はそのボタンの中にダミーのボタンを作って(1つMCを入れ子でおいておく),ボタンのMCのボタンイベントハンドラを下のダミーボタンにオーバーライドさせるっていう方法.
(つまり,他のボタンと並列の状態において,深度(レイヤー)を調整するだけ.)

button_mc
    |
    |-dummyButton_mc

と作っておいて.

[button_mc内]
var dummyButton_mc:MovieClip;

// 代わりのイベントハンドラを作ってあげる.
this.onMyRelease:Function = function() {};

// 左辺・右辺に注意
this.dummyButton_mc.onRelease = this.onMyRelease;

んで,他のコードから
this.button_mc.onMyRelease = function():Void {
  trace('ok');
};

これでOK!!
あったまいい~!!
ってか定石か…?(´・ω・`)

もう1つ仮想アクセサを使ったパターンで試してみた.

var onMyRelease:Function;
var dummyButton_mc:MovieClip;

this.fncGetter = function() {
	this.dummyButton_mc.onRelease();
};

this.fncSetter = function() {
	trace('setter');
};

this.addProperty('onRelease', this.fncGetter, this.fncSetter);

これはNG... (´・ω・`)
仮想アクセサだろうがなんだろうがイベントハンドラとして働いてしまう模様.(そりゃそうか...)
つまりこれは,そとからonReleaseとかそのイベントハンドラ名そのままで見せかけるということは不可能ってことかな...??


またまったく別の方法としてMouse.addListenerで擬似的にボタンをエミュレートするかhitTest辺りを使うかかねぇ…
んー,でもやっぱ↑のやりかたがやっぱりいいと思う.ウン.


contributor nao : 2005年08月21日 02:45

trackback

trackback for this entry URL:
http://blog.graffiti-web.org/mt/mt-tb.cgi/289

comment

はじめまして
このやり方を試したのですがうまく行きません
this.dummyButton_mcthis.onRelease = this.onMyRelease;
これで左辺のなかのdummyButton_mcthisがよくわかりません
記述ミスと思ったけどコンパイル的には通るし・・・
でも動かないし
良ければ詳しく教えてください。

contributor vicious : 2006年03月26日 17:25


this.dummyButton_mcthis.onRelease = this.onMyRelease;
   ↓
this.dummyButton_mc.onRelease = this.onMyRelease;

こうですね,きっと...
すいません.

contributor nao : 2006年03月26日 17:43