Как вы отображаете местоположение спрайта в реальном времени во время перетаскивания (AS3)

Я пытаюсь понять, как показать координаты X / Y объекта, пока он перемещается по сцене.

Если у меня есть квадрат, расположенный в точке 0,0, и я перетаскиваю его в новое место - например, 50,50 - я хочу показать местоположение квадрата когда он перетаскивается, а не только когда это упало. Таким образом, номера координат будут постоянно меняться по мере перетаскивания объекта.

Прямо сейчас мой код определяет местоположение объекта по X / Y только при запуске перетаскивания и при остановке перетаскивания:

import flash.events.MouseEvent;

this.addEventListener(MouseEvent.MOUSE_DOWN, startDragging, true);
this.addEventListener(MouseEvent.MOUSE_UP, stopDragging, true);

function startDragging(e:MouseEvent) {

square1.startDrag();
xDisplay_txt.text = square1.x;
yDisplay_txt.text = square1.y;

}

function stopDragging(e:MouseEvent) {

testStage1.stopDrag();
xDisplay_txt.text = testStage1.x;
yDisplay_txt.text = testStage1.y;

}

Любая помощь приветствуется. Спасибо.


person dzinermachine    schedule 20.12.2019    source источник


Ответы (1)


Вам нужно вызывать определенный обработчик, пока вы перетаскиваете эту вещь, на регулярной основе, чтобы обновлять выходные тексты. Самый простой способ - использовать событие ENTER_FRAME, которое запускается, как указано в его названии, каждый кадр.

import flash.display.Sprite;

import flash.events.Event;
import flash.events.MouseEvent;

// We may drag different objects, we need to know which one.
var currentDrag:Sprite;

// A list of objects we can drag.
var aList:Array = [square1, square2];

// Iterate over all the items in the list
// and subscribe to each one separately.
for each (anItem:Sprite in aList)
{
    anItem.addEventListener(MouseEvent.MOUSE_DOWN, onStart);
}

function onStart(e:MouseEvent):void
{
    // Store, which one object is being dragged.
    // Read on difference between Event.target and Event.currentTarget.
    currentDrag = e.currentTarget as Sprite;
    currentDrag.startDrag();

    // Subscribe to ENTER_FRAME event to control the way of things.
    // We need to do it only if we drag square1, as requested.
    if (currentDrag == square1)
    {
        addEventListener(Event.ENTER_FRAME, onFrame);
    }

    // Subscribe to stage, because this way you will handle the
    // MOUSE_UP event even if you release the mouse somewhere outside.
    stage.addEventListener(MouseEvent.MOUSE_UP, onStop);
}

function onFrame(e:Event):void
{
    // This event fires every frame, basically, every 40 ms.
    // Round the coordinates and update the texts.
    xDisplay_txt.text = int(currentDrag.x).toString();
    yDisplay_txt.text = int(currentDrag.y).toString();
}

function onStop(e:MouseEvent):void
{
    // That is also why we are keeping the refference
    // to the object we are dragging: to know which one to drop.
    currentDrag.stopDrag();

    // We're not dragging anything anymore.
    currentDrag = null;

    // Unsubscribe, as it is no longer needed.
    // That's fine even if we didn't subscribed to in in the first place.
    removeEventListener(Event.ENTER_FRAME, onFrame);

    // Unsubscribe from this one too.
    stage.removeEventListener(MouseEvent.MOUSE_UP, onStop);
}
person Organis    schedule 20.12.2019
comment
Organis - Спасибо !! Это прекрасно работает. Будет ли это влиять на другие перетаскиваемые объекты на сцене (или влиять на них)? - person dzinermachine; 22.12.2019
comment
@dzinermachine Приведенный выше код отслеживает только один объект, доступный по имени экземпляра square1. У вас есть список похожих объектов, которые вы хотите перетащить и отслеживать? - person Organis; 22.12.2019
comment
нет, мне нужно было отслеживать координаты X / Y только одного объекта - square1. Однако у меня есть два объекта на сцене, которые можно перетаскивать: квадрат1 и квадрат2. При перетаскивании square1 координаты отображаются динамически, а square2 скрывается. При перетаскивании square1 все работает нормально. Но когда я перетаскиваю square2, он все равно скрывается, как будто я перетаскиваю square1. - person dzinermachine; 22.12.2019
comment
Я знаю, что это отдельный вопрос, так что, возможно, мне стоит начать еще один вопрос, лол ... - person dzinermachine; 22.12.2019
comment
@dzinermachine Самый простой способ - определить отдельный набор обработчиков onStart и onStop для square2. Но самый простой способ зачастую оказывается наихудшим с точки зрения масштабируемости и размера скрипта. Я обновлю свой пост через минуту. - person Organis; 22.12.2019