Flash - перетащите два видеоролика одновременно? - PullRequest
0 голосов
/ 19 сентября 2008

Я пытаюсь создать приложение карты, похожее на this . Щелкните вкладку «Просмотр SWF» слева от изображения. В частности, заметили, как вы можете перемещаться, и вместе с ним перемещаются нажимаемые кнопки на карте. В основном, как они это делают?

В моем приложении есть карта, которую вы можете перемещать и перемещать, используя функцию startDrag (). У меня есть отдельный слой с другими кликабельными клипами, которые я бы хотел проследить за панорамированием слоя карты. К сожалению, Flash ограничивает вас перетаскиванием только одного фрагмента фильма за раз . Кто-то предложил решение с использованием прототипа , но я не могу заставить его работать правильно, и я не уверен, что это потому, что я использую ActionScript 3.0 или нет.

Кто-нибудь может наметить лучший способ для меня выполнить то, что я пытаюсь сделать, или лучший способ сделать то, что я сейчас делаю? Цени это.

Ответы [ 6 ]

3 голосов
/ 19 сентября 2008

Simple. Поместите вашу карту и нажимаемых кнопок в новый мувиклип, вы можете назвать его interactiveMapContainer или что-то подобное, а затем вызвать метод startDrag для interactiveMapContainer , и вы по-прежнему сможете нажимать кнопки, как только вы перетащите его.

Метод Якуба Котрлы также будет работать очень хорошо, хотя он немного сложнее.

2 голосов
/ 19 сентября 2008

Я думаю, что метод defmeta является лучшим, если возможно сделать все, чтобы быть потомками «основного» перетаскиваемого объекта - он самый быстрый (с точки зрения времени отклика пользовательского интерфейса) и самый простой и требует наименьшего количества кода .

Если это не вариант, в вашем распоряжении есть пара других методов:

  • Если вы используете Flex, вы можете заставить другие объекты двигаться вместе с картой, прослушивая MoveEvent .MOVE события на нем и перемещаясь соответственно
  • Вы можете самостоятельно реализовать функцию перетаскивания, чтобы иметь больше контроля над ней (см. Ниже).

Вот пример, который реализует функциональность перетаскивания для объекта, который также будет перемещать группу «родственных» объектов вместе с ним. В этом примере

  • Любая переменная, начинающаяся с подчеркивания, является закрытым членом класса, содержащего этот код
  • _siblings - это словарь, в котором ключами являются другие объекты, которые необходимо переместить.

.

private var _dragStartCoordinates:Point = null;
private var _siblingsDragStartCoordinates:Dictionary = null;

private function mouseDownHandler(event:MouseEvent):void
{
    this.startDrag();
    _dragStartCoordinates = new Point(this.x, this.y);

    _siblingsDragStartCoordinates = new Dictionary(true);
    for (var sibling:DisplayObject in _siblings)
    {
        _siblingsDragStartCoordinates[sibling] = new Point(sibling.x, sibling.y);
    }

    stage.addEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler, false, 0, true);
    stage.addEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler, false, 0, true);
}

private function dragMouseUpHandler(event:MouseEvent):void
{
    stage.removeEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler, false);
    stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler, false);
    this.stopDrag();
    moveSiblings();
    _dragStartCoordinates = null;
    _siblingsDragStartCoordinates = null;
}

private function dragMouseMoveHandler(event:MouseEvent):void
{
    moveSiblings();
}

// expects _dragStartCoordinates and _siblingsDragStartCoordinates
// to be set
private function moveSiblings():void
{
    var xDiff:Number = this.x - _dragStartCoordinates.x;
    var yDiff:Number = this.y - _dragStartCoordinates.y;

    for (var sibling:DisplayObject in _siblings)
    {
        sibling.x = _siblingsDragStartCoordinates[sibling].x + xDiff;
        sibling.y = _siblingsDragStartCoordinates[sibling].y + yDiff;
    }
}
1 голос
/ 04 марта 2010

Большое спасибо. Я изменил это, как показано ниже: пакет { import flash.display.MovieClip; импортировать flash.events. *; импорт flash.geom.Rectangle; import flash.utils.setInterval; импорт flash.utils.clearInterval; import flash.display.MovieClip; import flash.display.DisplayObject; импорт flash.display.Sprite; импорт flash.geom.Point; import flash.utils.Dictionary;

public class DragSync { 
    private var _dragStartCoordinates:Point = null;
    private var _siblingsDragStartCoordinates:Dictionary = null;
    private var _primaryItem:Object = null;

private var _workSpace: Object = null; private var _dragWithPrimary: Array = null;

    public function DragSync(primaryItem:Object,workSpace:Object, dragWithPrimary:Array)
    {
            _primaryItem = primaryItem;
            _dragWithPrimary = dragWithPrimary;
_workSpace = workSpace;

            _workSpace.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
            _workSpace.addEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler);
            _workSpace.addEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler);
_workSpace.addEventListener(MouseEvent.MOUSE_OUT, dragOut);
    }

    private function mouseDownHandler(event:MouseEvent):void
    {
            trace("event mouse down");
_primaryItem.startDrag();
_dragStartCoordinates = new Point(_primaryItem.x, _primaryItem.y);
            _siblingsDragStartCoordinates = new Dictionary(true);

            for each (var sibling:DisplayObject in _dragWithPrimary)
            {
                    _siblingsDragStartCoordinates[sibling] = new Point(sibling.x, sibling.y)
            }
    }

    private function dragMouseUpHandler(event:MouseEvent):void
    {
            moveSiblings();
_primaryItem.stopDrag();
            _dragStartCoordinates = null;
            _siblingsDragStartCoordinates = null;
    }

    private function dragMouseMoveHandler(event:MouseEvent):void
    {
            trace("event mouse MOVE MOVE");
moveSiblings();
    }

приватная функция dragOut (событие: MouseEvent): пустота { _primaryItem.stopDrag (); }

    // expects _dragStartCoordinates and _siblingsDragStartCoordinates
    // to be set
    private function moveSiblings():void
    {
            if (!_dragStartCoordinates || !_siblingsDragStartCoordinates) return;

            var xDiff:Number = _primaryItem.x - _dragStartCoordinates.x;
            var yDiff:Number = _primaryItem.y - _dragStartCoordinates.y;

            for each (var sibling:DisplayObject in _dragWithPrimary)
            {
                    sibling.x = _siblingsDragStartCoordinates[sibling].x + xDiff;
                    sibling.y = _siblingsDragStartCoordinates[sibling].y + yDiff;
            }

    }


} 

}

1 голос
/ 03 марта 2009

Спасибо hasseg за код, сэкономил немножко времени. Вот мой взгляд на это для общественного использования ...

    package Tools
{
    import flash.display.MovieClip; 
    import flash.events.*; 
    import flash.geom.Rectangle; 
    import flash.utils.setInterval; 
    import flash.utils.clearInterval; 
    import flash.display.MovieClip;
    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.geom.Point;
    import flash.utils.Dictionary;

    public class DragSync { 
        private var _dragStartCoordinates:Point = null;
        private var _siblingsDragStartCoordinates:Dictionary = null;
        private var _primaryItem:Object = null;
        private var _dragWithPrimary:Array = null;

        public function DragSync(primaryItem:Object,dragWithPrimary:Array)
        {
            _primaryItem = primaryItem;
            _dragWithPrimary = dragWithPrimary;

            _primaryItem.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
            _primaryItem.addEventListener(MouseEvent.MOUSE_UP, dragMouseUpHandler);
            _primaryItem.addEventListener(MouseEvent.MOUSE_MOVE, dragMouseMoveHandler);
        }

        private function mouseDownHandler(event:MouseEvent):void
        {
            _dragStartCoordinates = new Point(_primaryItem.x, _primaryItem.y);
            _siblingsDragStartCoordinates = new Dictionary(true);

            for each (var sibling:DisplayObject in _dragWithPrimary)
            {
                _siblingsDragStartCoordinates[sibling] = new Point(sibling.x, sibling.y)
            }
        }

        private function dragMouseUpHandler(event:MouseEvent):void
        {
            moveSiblings();
            _dragStartCoordinates = null;
            _siblingsDragStartCoordinates = null;
        }

        private function dragMouseMoveHandler(event:MouseEvent):void
        {
            moveSiblings();
        }

        // expects _dragStartCoordinates and _siblingsDragStartCoordinates
        // to be set
        private function moveSiblings():void
        {
            if (!_dragStartCoordinates || !_siblingsDragStartCoordinates) return;

            var xDiff:Number = _primaryItem.x - _dragStartCoordinates.x;
            var yDiff:Number = _primaryItem.y - _dragStartCoordinates.y;

            for each (var sibling:DisplayObject in _dragWithPrimary)
            {
                sibling.x = _siblingsDragStartCoordinates[sibling].x + xDiff;
                sibling.y = _siblingsDragStartCoordinates[sibling].y + yDiff;
            }
        }


    } 
}
1 голос
/ 19 сентября 2008

Я не могу ничего перетащить в SWF, который вы связали, просто увеличьте масштаб с помощью mouseWheel.

С помощью событий mousedown, mouseMove и mouseUp можно одновременно выполнить несколько перетаскиваний мувиклипа.

Добавить обработчик событий для событий через Mouse.addListener (объект).

  • В mouseDown установить флаг и запомнить текущую позицию мыши.
  • В mouseMove, если установлен флаг, вычислите смещение перемещения и просто измените .x и .y всех видеоклипов, которые вы хотите перетащить.
  • В mouseUp установите флаг в значение false
0 голосов
/ 19 сентября 2008

Можете ли вы добавить мувиклипы в родительский клип и обработчик событий перетащите родительский клип?

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