2014-12-10 2 views
0

Im пытается сделать простой объект перемещаться из своего исходного положения в один из углов, в котором перемещается мышь. Но это немного сложнее, потому что мне нужно, чтобы мы двигались на некотором расстоянии в одном из направлений, прежде чем перемещать объект в этих углах, в которые перемещается мышь (чтобы не случайно мы не перемещали мышь/объект).Перемещение по безопасному объекту AS3

Я думал, что мне нужно сохранить начальную точку, когда мышь была нажата. Затем, чтобы проверить, когда она (мышь) переместила XX пикселей в одном из направлений, а затем, если переместилась выше некоторой точки (в котором мы уверены, что это не случайное движение) переместите объект в один из углов. Но ... Я не могу понять, как это сделать с помощью кода.

Чтобы более четко выше Ill объяснить с этой картиной enter image description here

Так Gray Box является нашим объектом.

Стрелки - это направления, в которых мы можем перемещать коробку.

Зеленая линия это расстояние, которое нам нужно переместить нашу мышь (в то время как это pressedDown), так что объект движется в одном из directions./in этот пример 50px/

Давайте предположим, что мы щелкнули Серый ящик в верхнем правом углу (где заполнен зеленым кружком), поэтому, если мы хотим переместить ящик в ЛЕВЫЙ, нам нужно хотя бы переместить мышь (пока она еще нажата) в положение где левый полый зеленый круг есть. И если мы хотим переместить объект на ПРАВО, нам нужно переместить мышь на правой полой зеленой кружкой, перед Серый ящик идет в этом углу.

КРАСНЫЙ и СИНИЙ круги - это просто разные сценарии, представляющие разные точки, в которые мы нажали BOX, и где нам нужно переместить мышь, поэтому BOX перемещается.

:) Любая помощь будет очень оценена.

+0

Post код, который вы уже пробовали. Вы правы в том, что вам просто нужно сохранить точку мыши на «MOUSE_DOWN» и слушать либо «ENTER_FRAME», либо «MOUSE_MOVE» (лучше) и проверить там, если текущая позиция мыши перемещена достаточно далеко от точки мыши до точки считаться движением. – BadFeelingAboutThis

ответ

1

Вот простой пример:

var grayBox:Sprite; //let's say this is your gray square or whatever you're clicking 
grayBox.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); 


var mouseDownPoint:Point = new Point(); //the point to capture on mouse down to compare against 
var currentObject:DisplayObject; //to store the current object on mouse down 
var threshold:int = 50; //how far in pixels the mouse needs to move before you count it as a move 
var didItMove:Boolean = false; //stores whether the current click was a move 

function mouseDownHandler(e:MouseEvent):void { 
    mouseDownPoint.x = e.stageX; 
    mouseDownPoint.y = e.stageY; 
    currentObject = e.currentTarget as DisplayObject; 
    didItMove = false; //reset this 
    stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHanlder, false, 0, true); //listen to mouse move until mouse up 
    stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); 
} 

function mouseMoveHandler(e:MouseEvent):void { 
    if (Math.abs(e.stageX - mouseDownPoint.x) > threshold || Math.abs(e.stageY - mouseDownPoint.y) > threshold) { 
     //moved far enough 
     didItMove = true; 
     stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); //remove listener 
    } 
} 

function mouseUpHandler(e:MouseEvent):void { 
    if(stage.hasEventListener(MouseEvent.MOUSE_MOVE)) stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); //remove listener if still around 
    stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); //remove the mouse up listener from the stage 
    if (didItMove) { 
     //do something 

     //use currentObject 

     if(e.stageX > mouseDownPoint.x: 
      if(e.stageY > mouseDownPoint.y){ 
       //bottom right corner 
      }else { 
       //top right corner 
      } 
     }else{ 
      if(e.stageY > mouseDownPoint.y){ 
       //bottom left corner 
      }else { 
       //top left corner 
      } 
     } 
    } 

    currentObject = null; //free the var so it's hanging around in memory 
} 
+0

ну, я не мечтал, чтобы это произошло так скоро: D. Обычно это занимает от 3 до 4 дней с большой помощью и много попыток и неспособности получить что-то, как я и предполагал. Большое спасибо @LDMS, он работает как шарм. – GregorII

+0

Хммм ... Теперь я заметил, что он работает, только если вы отпустите кнопку мыши, когда внутри ** объекта **. Если вы нажмете ** Объект ** и переместитесь выше необходимого расстояния, но за пределами ** объекта ** границы он не вызывает. Любые подсказки о том, как решить эту проблему? (im пытается с e.stageX e.stageY вместо e.localX e.localY, но все еще не работает) – GregorII

+1

Добавить мышь вверх слушателя на сцену – BadFeelingAboutThis

Смежные вопросы