воскресенье, 18 июля 2010 г.

Определения нахождения мыши над сценой в AS2 (аналог MOUSE_LEAVE)

Для старого проекта написанного на ActionScript2 понадобилось определять находится ли мышь над флешкой или уже покинула область flash.
В AS2 нет аналога Event.MOUSE_LEAVE и после поиска в интернете нашлось более-менее универсальное рабочее решение, оно не всегда работает корректно (например если мышь резко останавливается за несколько пикселей до границ флешки), но это наилучшее решение.

Также в ActionScript 2 в полноэкранном режиме (fullscreen mode) не получится определить движение мыши с помощью onMouseMove, поэтому если вы хотите определять изменение положения мыши, то придется сравнивать координаты мыши в каждом фрейме.

Код для определения нахождения мыши над сценой:

var mouse_dx:Number = _xmouse;
var mouse_dy:Number = _ymouse;
var mouseSpeed:Number = 1;

function checkPosition(Void):Void
{
    if (_xmouse<mouseSpeed || _xmouse>(Stage.width-mouseSpeed)
     || _ymouse<mouseSpeed || _ymouse>(Stage.height-mouseSpeed))
    {
        trace("out");
    }
    else
    {
        trace("in");
    }
}
checkPosition(Void);

var mouseListener:Object = new Object();
mouseListener.onMouseMove = function():Void
{
    mouse_dx = Math.abs(mouse_dx - _xmouse);
    mouse_dy = Math.abs(mouse_dy - _ymouse);

    mouseSpeed = mouse_dx > mouse_dy ? mouse_dx : mouse_dy;
    mouseSpeed += 1;

    checkPosition(Void);

    mouse_dx = _xmouse;
    mouse_dy = _ymouse;
}
Mouse.addListener(mouseListener);

четверг, 8 июля 2010 г.

Контейнер Вконтакта и работа компонент во флеше

Vkontakte logo

Понадобилось использовать контейнер для приложения vkontakte (т.к. некоторые матоды работают только из контейнера) и столкнулся с тем что перестал адекватно работать самописный скроллер.

В процессе поиска нашел решение в FAQ Вконтакта и хотя там написано: "При использовании контейнера стандартные компоненты флеша работают некорректно. Как это исправить?" - этот метод подошел и мне, хотя это был не стандартный компонент.
Так что при глюках советую сначала попробовать решение проблемы с flash-компонентами от Святослава Лисина:

addEventListener( Event.ADDED_TO_STAGE, onAddedToStage );
function onAddedToStage(e: Event): void
{
   Security.allowDomain("*");
   stage.dispatchEvent(new Event(Event.DEACTIVATE));
   stage.dispatchEvent(new Event(Event.ACTIVATE));
}

PS
Бонус - опытным путем, после некоторого количества поиска решения было выяснено, что продвинутый загрузчик фотографий vkontakte не загружает картинки если одна из сторон меньше 60px (примерно), при этом никаких пояснений не выдается и нигде не описывается.