Как вы определяете, когда мышь покидает сцену в ActionScript 2? - PullRequest
1 голос
/ 15 января 2009

Мне не повезло с необходимостью перенести код ActionScript 3 в ActionScript 2, и у меня возникла проблема с определением, когда мышь покидает сцену.

В ActionScript 3 есть событие под названием Event.MOUSE_LEAVE, которое можно использовать для определения, когда мышь покидает сцену, но, насколько я вижу, в ActionScript 2 нет эквивалента.

Как бы вы лучше всего подражали той же функциональности?

Прослушивание движения мыши и проверка координат мыши по границам сцены не работает, потому что координаты мыши перестают обновляться, когда мышь покидает сцену.

Ответы [ 4 ]

6 голосов
/ 15 января 2009

Я не нашел надежного способа сделать это в AS2 (в некоторых браузерах вы даже получаете обновления мыши, когда мышь находится за пределами приложения). Поэтому я обычно проверяю, находится ли мышь вне внешней границы приложения размером 10 или 20 пикселей, если это так, я считаю, что это MOUSE_LEAVE. Вероятно, лучше слушать MOUSE_MOVE, а не проверять этот каждый кадр, так как вы можете пропустить несколько обновлений, если у вас более низкая частота кадров.

Также можно вызвать контекстное меню, переместить мышь наружу и затем щелкнуть полностью, минуя всю вышеуказанную проверку (или даже очень быстро переместить мышь за границу), поэтому я часто добавляю таймер, который срабатывает после Мышь не двигалась в течение 2-3 секунд.

Это не особенно надежно, но это лучшее, что мне удалось.

5 голосов
/ 17 мая 2010

Использование математики для оценки, когда мышь будет вне границ:

(Реализация по аналогии с третьим вариантом Тео.)

// 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);
}
2 голосов
/ 15 января 2009

Я думаю, что однажды обошел это, поместив невидимые кнопки по краям сцены и используя их функцию разворачивания. думаю, это работало, пока они не двигали мышь слишком быстро! далекие воспоминания все же.

0 голосов
/ 06 августа 2009

Существует три категории решений этой проблемы:

  1. Проверьте положение мыши относительно границ сцены (например, ответ Мейхью). Это наивное решение, и если бы оно сработало, я бы никогда не задал вопрос. Проблема в том, что координаты мыши перестают обновляться, когда мышь покидает сцену, и они сохраняют свою последнюю позицию, которая всегда находится внутри сцены.

  2. Создание границы вокруг сцены и обнаружение движений мыши внутри этой границы (например, ответ грейпфрукта. Работает, если граница очень широкая, но вы получаете много ложных срабатываний - и если мышь останавливается внутри границы и затем начинает двигаться снова, вы получаете ложный ввод мыши.Также страдает от тех же проблем, что и 1, мышь всегда может двигаться достаточно быстро, чтобы вы не заметили, что она перемещается за границу.

  3. Отслеживайте направление и скорость мыши, чтобы при прекращении приема событий перемещения мыши можно было рассчитать, где должна находиться мышь, и посмотреть, находится ли эта точка вне сцены. Может быть одурачен в крайних случаях, но работает намного лучше, чем как 1, так и 2. Требуется намного больше кода, хотя.

...