1

一部の ActionScript 3 コードを ActionScript 2 にダウンポートする必要があり、マウスがステージを離れたときの検出に問題があります。

ActionScript 3 にはEvent.MOUSE_LEAVE、マウスがステージから離れたことを検出するために使用できる というイベントがありますが、私が見る限り、ActionScript 2 には同等のものはありません。

同じ機能をどのようにエミュレートするのが最善でしょうか?

マウスの動きをリッスンし、ステージの境界に対してマウス座標をチェックしても、マウスがステージを離れるとマウス座標の更新が停止するため、機能しません。

4

4 に答える 4

6

AS2でこれを行うための信頼できる方法が見つかりませんでした(一部のブラウザーでは、マウスがアプリの外にあるときにマウスの更新を取得し続けることさえあります)。したがって、私が通常行うことは、マウスがアプリケーションの外側の10または20ピクセルの境界線の外側にあるかどうかを確認することです。外側にある場合は、それをMOUSE_LEAVEと見なします。フレームレートが低いといくつかの更新を見逃す可能性があるため、フレームごとにこれをチェックするよりも、MOUSE_MOVEをリッスンする方がおそらく良いでしょう。

コンテキストメニューを表示し、マウスを外側に移動してから、上記のチェック全体を完全にバイパスしてクリックすることもできます(または、マウスを境界線を越えて非常に速く移動することもできます)。そのため、マウスが終了した後に起動するタイマーを追加することがよくあります。 tはたとえば2〜3秒で移動しました。

特に堅牢ではありませんが、私が管理した中で最高です。

于 2009-01-15T12:13:05.080 に答える
6

数学を使用して、マウスがいつ範囲外になるかを推定します。

(Theo の 3 番目のオプションに沿った実装です。)

// Stage rollout detection:
private var mouse_dx:Number;
private var mouse_dy:Number;

private function detectMouseOutOfBounds ():Void {
    mouse_dx = _xmouse;
    mouse_dy = _ymouse;

    var mouseListener:Object = { };
    mouseListener.onMouseMove = Delegate.create(this,
        function () {
            mouse_dx = Math.abs(mouse_dx-_xmouse);
            mouse_dy = Math.abs(mouse_dy-_ymouse);
            var speed:Number = Math.max(mouse_dx, mouse_dy) + 5; // Precautionary buffer added.
            var willBeOutOfBounds:Boolean = (
                _xmouse - speed < 0 || 
                _xmouse + speed > Stage.width ||
                _ymouse - speed < 0 ||
                _ymouse + speed > Stage.height
            );
            if (willBeOutOfBounds) {
                _display._alpha = 10;
            } else {
                _display._alpha = 100;
            }
            mouse_dx=_xmouse;
            mouse_dy = _ymouse;
        }
    );
    Mouse.addListener(mouseListener);
}
于 2010-05-17T16:43:00.360 に答える
2

ステージの端に見えないボタンを配置し、そのロールアウト機能を使用して、これを回避したことがあると思います。マウスをあまり速く動かさない限り、これはうまくいったと思います! 遠い記憶ですが。

于 2009-01-15T12:35:32.557 に答える
0

この問題の解決策には、次の3つのカテゴリがあります。

  1. ステージの境界に対してマウスの位置を確認します(たとえば、Mayhewの回答)。これは素朴な解決策であり、それが機能していれば、私は質問をすることはなかったでしょう。問題は、マウスがステージを離れるとマウス座標の更新が停止し、常にステージ内にある最後の位置が保持されることです。

  2. ステージの周囲に境界線を作成し、この境界線内でのマウスの動きを検出します(たとえば、grapefruktの回答。境界線が非常に広い場合は機能しますが、誤検知が多く発生します。また、マウスが境界線内で停止してから再び動き始めた場合も機能します。誤ったマウス入力が発生します。また、1と同じ問題が発生します。マウスは常に十分に速く移動できるため、境界を越えて移動していることを検出できません。

  3. マウスの方向と速度を追跡して、マウス移動イベントの受信を停止したときに、マウスがどこにあるべきかを計算し、そのポイントがステージの外にあるかどうかを確認できるようにします。エッジケースではだまされる可能性がありますが、1と2の両方よりもはるかにうまく機能します。ただし、はるかに多くのコードが必要です。

于 2009-08-06T17:42:10.587 に答える