Flash: как отправить событие клика вверху загруженного .swf? - PullRequest
0 голосов
/ 15 июня 2010

Итак, я пытаюсь создать инструмент, который позволит мне и другим пользователям открывать один и тот же .swf, и тогда я, как пользователь Admin, смогу взаимодействовать с моим, пока они все видят мои движения мыши и нажатия кнопок.и т. д. на них.

Я использую BlazeDS для управления этим, и я получаю данные, отправленные туда и обратно и т. д. - никаких проблем там нет.Проблема, с которой я сталкиваюсь, заключается в следующем:

В экземпляре "Admin" я нажимаю кнопку.Я фиксирую эти X и Y, затем говорю Blaze сказать моим клиентам отправлять событие Click для этих X и Y. На моей клиентской стороне я получаю эти данные и отправляю событие Click для этих X и Y - , нона самом деле щелчок фиксируется на уровне стадии. Клик на моей стороне клиента происходит ПОД всеми моими кнопками и другим содержимым, поэтому все происходит не так.

Имеет ли это смысл?Есть ли способ сказать ему, чтобы начать событие клика вверху?

Ответы [ 3 ]

1 голос
/ 16 июня 2010

Если вы не можете скомпилировать загруженный SWF-файл для использования более совершенной архитектуры, вы можете попробовать что-то более хакерское, чтобы заставить кнопки работать.

Посмотрите на методы getObjectsUnderPoint и areInaccessibleObjectsUnderPoint DisplayObjectContainer . В сочетании с hasEventListener вы сможете эмулировать то, что хотите.

Вот некоторый непроверенный псевдокод:

function detectClick(pt:Point):void
{
    var objsUnderPoint:Array = containerStage.getObjectsUnderPoint(pt);
    var clickable:Array = [];
    for each(dispObj:DisplayObject in objsUnderPoint)
    {
        if(dispObj.hasEventListener(MouseEvent.CLICK))
        {
            clickable.push(dispObj);
        }
    }

    if(clickable.length)
    {
         // sort on depth here
         // that might be tricky since you'll be looking at grandchildren
         // and not just children but it is doable.
         var topMostClickable:DisplayObject = ???
         topMostClickable.dispatchEvent(new MouseEvent(MouseEvent.CLICK, true, false));
    }
}

areInaccessibleObjectsUnderPoint важно, если вы считаете, что они могут быть ограничениями безопасности (например, междоменными проблемами), поэтому вы можете отлаживать, если что-то пойдет не так.

Также обратите внимание, что вы можете (или должны) заполнить более подробную информацию о MouseEvent (например, правильную цель, localX, localyY и т. Д.)

0 голосов
/ 16 июня 2010

Это кажется плохим способом реализовать то, что вы пытаетесь сделать. Если вы «кликаете» в инструменте администратора, вы, вероятно, на самом деле запускаете какое-то событие. Почему бы не вызвать это событие вместо отправки щелчка мышью?

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

, например

В админке:

myButton.addEventListener(MouseEvent.CLICK, handleClickButton);

function handleClickButton(event:MouseEvent):void
{
    doSomeAction();
    sendTriggerToClient(MyActions.SOME_TRIGGER);
}

В клиенте:

var actionMap:Object = {};
actionMap[MyActions.SOME_TRIGGER] = doSomeAction;

function receiveTriggerFromAdmin(trigger:String):void
{
    var responseFunc:Function = actionMap[trigger];
    responseFunc();
}

Я надеюсь, что псевдокод имеет смысл. Просто абстрагируйте то, что происходит в результате щелчка, в отдельную функцию (doSomeAction), а затем попросите администратора отправить сообщение перед вызовом этой функции. В клиенте подождите любой триггер, который проходит через, и сопоставьте его с той же функцией.

0 голосов
/ 15 июня 2010

Похоже, вам нужно установить фокус на самый верхний компонент позиций x и y перед отправкой события щелчка.

Тем не менее, мне интересно, какой вариант использования для чего-то подобного;в отличие от использования инструмента совместного использования экрана, такого как Connect.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...