AS3:マウスがステージを去るときMOUSE_OUTは、焼成ません
-
18-09-2019 - |
質問
私は上から下へ、ステージ全体をカバーNAVアイテムでウェブサイトを開発しています(以下、変更された画像を参照)、ユーザーがマウスでのステージを終了することは非常に簡単です、「に必要なMouseEvent.MOUSE_OUT
イベントをトリガしませオフ」NAVアイテムが言っています。
私はマウスがステージを去ったときを検出し、任意の有効なNAVの項目をオフにするEvent.MOUSE_LEAVE
を使用する必要がありますか。それは私がやろうとしてますが、トラブル私のリスナーからの任意の出力を得ることを持っていたものです。任意のアイデア?
http://marcysutton.com/blog /wp-content/uploads/2010/01/redpropeller.pngする
のFlash IDEでのムービークリップに関連付けられたクラスの場合、これはEvent.MOUSE_LEAVE
リスナを登録するための正しい構文ですか?関係なく、私が何を何もしていないように思えません。それは私が発射するイベントのために、ブラウザでムービーを埋め込むために持っている場合ですか?
this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);
ここに私のMainNav.asクラスがあります:
package com.redpropeller {
import com.greensock.*;
import com.greensock.plugins.*;
import flash.display.*;
import flash.text.*;
import flash.events.*;
public class MainNav extends MovieClip { // MainNav is a movieclip in the IDE
public var colors:Array;
public function MainNav():void {
colors = new Array(0xee3124, 0xc72a1f, 0xa62c24, 0x912923, 0x7e221c);
TweenPlugin.activate([TintPlugin]);
// trying to target stage through this object
this.stage.addEventListener(Event.MOUSE_LEAVE, mouseLeaveListener);
for(var i:Number=0; i<this.numChildren; i++){
var n = this.getChildAt(i);
n.useHandCursor = true;
n.buttonMode = true;
n.addEventListener(MouseEvent.MOUSE_OVER, navBtnOn);
n.addEventListener(MouseEvent.MOUSE_OUT, navBtnOff);
}
}
public function mouseLeaveListener(e:Event):void {
trace('mouseleave'); // nothing ever happens
}
private function navBtnOn(e:MouseEvent):void {
TweenLite.to(e.currentTarget.bar_mc, 0.01, {tint:0x333333});
}
private function navBtnOff(e:MouseEvent):void {
TweenLite.to(e.currentTarget.bar_mc, 0.01,
{tint:uint(colors[this.getChildIndex(MovieClip(e.currentTarget))])});
// changes color back to specific tint
}
}
}
解決
あなたは、コンストラクタでMOUSE_LEAVEのイベントリスナーを作成しようとしています。これはMainNavにはaddChild()メソッドを介してステージに追加されていない場合、ステージオブジェクトがまだ存在しない可能性があります。 MainNavは、設計時にステージにすでにある場合は、ステージがすぐに利用できないでしょうということはまだ可能です。 Event.ADDED_TO_STAGEリスナーを設定:するDisplayObject(MovieClipの、スプライトなど)を継承するクラスの場合、私は、コンストラクタで唯一のことを行います。そのリスナーは、親コンテナからオブジェクトがはaddChildを介してステージの表示スタックに追加されているinit()メソッドを()トリガ、またはオブジェクトが設計時にステージ上に既にある場合。私のinit()メソッドが呼び出されると、私は舞台プロパティが利用可能になることを知っています。
あなたのコンストラクタでは、ステージはまだインスタンスに存在しないかもしれませんが、あなたは、ランタイムエラーを取得する必要があります。ただし、先のステージの「この」キーワードを使用しています。あなたはObjectから継承したクラスでは「この」を使用する場合、それがいることを作成しようとするため、プロパティが存在しない場合、コンパイラはエラーをスローしません(あなたのクラスは、Object> MovieClip-> DisplayObject-> EventDispatcher-を経由して行います) thisの一員としての性質。 Objectクラスは動的であるため、これは新しいプロパティは、ヘッダー内のクラス変数として宣言することなく、いつでも作成することができることを意味し、起こる - あなたはちょうどその動的プロパティを使用する際に「この」キーワードを使用する必要があります。あなたがthis.stageを使用すると、ステージはクラスが存在しない場合はあなたのためのプロパティのステージを作成します。しかし、これはあなたが望む段階ではないので、リスナーはただ何もしない、空のオブジェクトにアタッチなっています。舞台を参照すると、私は確信しているとき、「これは」あなたには、いくつかの時点でエラーが表示されます削除してください。一般的には、コンパイラはそのプロパティの型エラーを無視することから、プロパティのthisを使用することをお勧めしません。
あなたはIDEで動作しないことMOUSE_LEAVE上記1つのコメントに言及したが、私はCS4からこれをテストし、それが作業を行います。あなたは、ブラウザのFlash Playerプラグインに比べIDEのFlash Playerのパフォーマンスの違いを目の当たりにすることができます。いくつかのケースではSWFの迅速負荷とステージがすぐに利用可能であるならば、あなたのステージイベントリスナーは、コンストラクタから動作しますが、それは信頼性がありません。 ADDED_TO_STAGEイベント後に呼び出され、「この」キーワードを使用していないのinit()メソッドにそのリスナーを移動します。
他のヒント
答:Event.MOUSE_LEAVEはIDEで起動しません。映画は、HTMLページに埋め込まれている場合は正常に動作します。あなたの助けをありがとう!