AS3 Как запустить драг только на оси х? - PullRequest
6 голосов
/ 22 июня 2011

У меня есть красный квадрат, который я хочу перетащить только по оси X. Я разработал простой скрипт, который теоретически должен работать, но он не ведет себя должным образом. Это немного сложно объяснить ... квадрат продолжает не в ту позицию, а положение сцены, кажется, меняется, поэтому иногда вы не можете перетащить квадрат вправо ...

red.buttonMode = true;
red.addEventListener(MouseEvent.MOUSE_DOWN, dragHandler);

function dragHandler(e:MouseEvent):void {
    var ypos:Number = e.currentTarget.y;
    var xpos:Number = e.currentTarget.x;

    e.currentTarget.startDrag(false,new Rectangle(-xpos,ypos,stage.stageWidth,0));
}


red.addEventListener(MouseEvent.MOUSE_UP, dropHandler);

function dropHandler(e:MouseEvent) {
    //trace("red up");
    e.currentTarget.stopDrag();
}

Ответы [ 3 ]

14 голосов
/ 22 июня 2011

Решение для радостного Марти сработало для вас, хотя оно не слишком эффективно (этот слушатель MouseEvent.MOUSE_MOVE - убийца).Проблема с исходным кодом заключалась в том, что прямоугольник, в котором вы ограничиваете границы перетаскивания, должен быть относительно родительских координат .Кроме того, в зависимости от того, где у вас есть точка регистрации вашего квадрата, вам, возможно, придется принять во внимание его width , если вы не хотите, чтобы какая-либо его часть вышла изthe stage.

Например, если ваш красный квадрат находится прямо на сцене, его точка регистрации расположена в его центре, и вы хотите ограничить перетаскивание всей осью x сцены, это будетработа:

e.currentTarget.startDrag(
       false,
       new Rectangle(
          e.currentTarget.width/2,
          e.currentTarget.y,
          stage.stageWidth-e.currentTarget.width,
          0
       )
);
3 голосов
/ 22 июня 2011

Вы можете попробовать другой подход, который включает MouseEvent.MOUSE_MOVE, так как использование прямоугольника для динамической границы было бы сложно.

// define lock on y-axis
var LOCKY:Number = target.y;

// MouseEvent.MOUSE_MOVE
stage.addEventListener(MouseEvent.MOUSE_MOVE, _mouseMove);
function _mouseMove(e:MouseEvent):void
{
    if(target.y != LOCKY) target.y = LOCKY;
}

// dragging
target.addEventListener(MouseEvent.MOUSE_DOWN, _mouseDown);
function _mouseDown(e:MouseEvent):void
{
    target.startDrag();
    target.addEventListener(MouseEvent.MOUSE_UP, _mouseUp);
}

// dropping
function _mouseUp(e:MouseEvent):void
{
    target.stopDrag();
    target.removeEventListener(MouseEvent.MOUSE_UP, _mouseUp);
}
0 голосов
/ 27 февраля 2014

ЭТО РАБОТАЕТ ACTIONSCRIPT 3 (Semilla Sol Apps)

1 - создайте свои обычные MOUSE DOWN и MOUSE UP прослушиватели событий

2 - добавьте элементы ' startDrag ' и ' stopDrag ' в каждую их функцию соответственно

ЗДЕСЬ КАК ЗАБЛОКИРОВАТЬ ОСЬ:

1: создайте прослушиватель событий для объекта, который вы хотите ограничить ... в данном примере это экземпляр фрагмента ролика с именем ' player ':

player.addEventListener(Event.ENTER_FRAME, pLimiter);

ЗДЕСЬ ФУНКЦИЯ «pLimter»:

function pLimiter(e:Event):void
{
    player.y = stage.stageHeight;
}

Так что в этом случае мы ограничиваем «перетаскивание» только по оси x.

  • вечеринка на чуваке! (Semilla Sol Apps)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...