startDrag - остановить движение по диагонали - PullRequest
1 голос
/ 23 ноября 2010

Есть ли способ иметь MovieClip с startDrag, но заставить только горизонтальное и вертикальное (т.е. не диагональное) движение?

Ответы [ 4 ]

4 голосов
/ 23 ноября 2010

Вот мое решение. Он отслеживает mouseX и mouseY по щелчку и сравнивает его с последней позицией. Выясняет, в каком направлении движется мышь, а затем перемещает объект туда. Возможно, вы захотите добавить дополнительную логику, чтобы привязать объект к ближайшей 10-й единице или к любому размеру блока, который вы хотите сформировать в виде сетки для использования в играх или организованном размещении объекта.

Обновление: я пошел дальше и добавил функцию snapNearest, чтобы помочь контролировать движение.

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

dragObj.addEventListener(MouseEvent.MOUSE_DOWN, dragIt);

var curX:Number = 0;
var curY:Number = 0;
var oldX:Number = 0;
var oldY:Number = 0;
var gridUnit:Number = 25;

function dragIt(e:MouseEvent):void
{
    // set x,y on down
    oldX = mouseX;
    oldY = mouseY;

    // add mouse up listener so you know when it is released
    stage.addEventListener(MouseEvent.MOUSE_UP, dropIt);
    stage.addEventListener(Event.ENTER_FRAME, moveIt);

    trace("Start Drag")
}

function moveIt(e:Event):void
{

    // figure out what the main drag direction is and move the object.

    curX = mouseX;
    curY = mouseY;

    // figure out which is the larger number and subtract the smaller to get diff
    var xDiff:Number = curX > oldX ? curX - oldX : oldX - curX;
    var yDiff:Number = curY > oldY ? curY - oldY : oldY - curY;

    if(xDiff > yDiff) {
        dragObj.x = snapNearest(mouseX, gridUnit);
    }else{
        dragObj.y = snapNearest(mouseY, gridUnit);
    }

    oldX = mouseX;
    oldY = mouseY;
}

function dropIt(e:MouseEvent):void
{

    //remove mouse up event
    stage.removeEventListener(MouseEvent.MOUSE_UP, dropIt);
    stage.removeEventListener(Event.ENTER_FRAME, moveIt);

    trace("Stop Drag")

}


// snap to grid
function snapNearest(n:Number, units:Number):Number
{

    var num:Number = n/units ;
    num = Math.round(num);
    num *= units;

    return num;

}
4 голосов
/ 23 ноября 2010

да.Есть несколько вариантов.

A. Вы можете использовать функцию startDrag () и снабдить ее 2-й параметр прямоугольником границ для перетаскиваемого объекта.что-то вроде;

dragSprite.startDrag(false, new Rectangle(0, 0, 20, stage.stageHeight));

B. Вы можете настроить перетаскиваемый объект на прослушивание событий мыши, перемещая его в соответствии с движениями мыши.что-то вроде:

dragSprite.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventHandler);

function mouseDownEventHandler(evt:MouseEvent):void
 {
 stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
 stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);
 }

function mouseMoveEventHandler(evt:MouseEvent):void
 {
 //only move dragSprite horizontally
 //dragSprite.y = evt.stageY;
 dragSprite.x = evt.stageX;
 }

function mouseUpEventHandler(evt:MouseEvent):void
 {
 stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
 stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);
 }
2 голосов
/ 23 ноября 2010

Вы можете использовать клавишу-модификатор, например, нормальное поведение будет горизонтальным и нажать клавишу Shift для вертикального перемещения.

    function mouseMoveEventHandler(evt:MouseEvent):void
    {
        if(!evt.shiftKey)
           dragSprite.x = evt.stageX;
        else
           dragSprite.y = evt.stageY;           
    }
1 голос
/ 23 ноября 2010

Вы можете ограничить только одну ось или другую (используя прямоугольник ограничения). Но в предложенном вами методе возможно диагональное перемещение, если только вы не определите некоторые другие ограничения ... например, сетку.

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