マウスホイール対応ということで
Spark projectにあるライブラリ「SWFWheel」を使用させていただきました。 その中でちょっと勘違いしていたところがあったのでメモ。 マウスホイールを使用しているクラスファイルにインポートしてそのクラスを MainにaddChild()して使用していたのですがIE6,firefoxでは 機能していたのにsafariでは機能しなかった。 「あれ~?なんで???」状態になって見直した。 どうやらSWFWheelは子オブジェクトに使用している時でもMain.asでインポート、 SWFWheel.initialize(stage); しないとsafariでは機能しないみたい。 なまじwindowsで動いただけに動揺してしまった。 それにしても便利なライブラリだな。制作者に感謝、感謝です。
ちょっとハマったのでメモ。
読み込んだ外部swfを新しく作ったsprite()であるカレンダーにaddChildして表示した。
calender = new Sprite();
private function calendar_show():void {
cal_URL = new URLRequest("****.swf");
cal_loader= new Loader();
cal_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, compHandler);
cal_loader.load(cal_URL);
}
private function compHandler(e:Event):void {
calendar.addChild(cal_loader);
}
でこれがいらなくなったときにremoveする際
private function next_clkHandler(e:MouseEvent):void {
calendar.removeChild(cal_loader);
cal_loader.unload();
}
としたんですけど、子のイベントが消えていないためエラーが出ました。
原因はremoveEventListener();で子のイベントを消去していないから。
対処としては読み込んだswfに
addEventListener(Event.REMOVED_FROM_STAGE, removeHandler);
private function removeHandler(e:Event):void {
(このファイル内でaddEventListenerしたイベントをremoveEventListenerします)
}
これでOK。
いろんな方のサンプルを見てどうにか作ってみました。
EventDispatcherを使ってみたかったんですよね。
ま、何とかできました。
わからんわからんと拙い僕が書いたのできっと初心者の方でも分かってくれるはず。
ASファイル
例えばボタンインスタンスに1フレーム目にボタンのノーマル状態、
2フレーム目にアクティブ状態、
3フレーム目にボタンイベントが効かなくなった状態、
をそれぞれ配置します。
で、それぞれにイベントを追加します。
btn.addEventListener(MouseEvent.ROLL_OVER, RoverHandler);
btn.addEventListener(MouseEvent.ROLL_OUT, RoutHanlder);
private function RoutHanlder(e:MouseEvent):void {
e.target.gotoAndStop(1);
}
private function RoverHandler(e:MouseEvent):void {
e.target.gotoAndStop(2);
}
ってかんじで。
さて、先ほど条件分岐してボタンイベントが効かなくなったときには
btn.mouseEnabled = false;
とするのですが、ボタンが効かなくなった瞬間、ROLL_OUTのイベントも一緒に実行するみたいです。
どうやらマウスがロールアウトしたと判断するみたいですね。
回避するにはmouseEnabledと一緒にremoveEventListenerでイベントを削除したら思い通りにいきました。
root、第一フレームstop()を記述してムービークリップを配置。
そのムービークリップからrootの次のフレームに移動したくてroot.nextFrame()って、単純に書いただけではだめ。
MovieClip(root).gotoAndStop(2);と記述するのでした。
オープニングflashのときによく使う。