ActionScript - проблема логики мыши - PullRequest
0 голосов
/ 22 ноября 2010

тупая проблема. смутился, что я не нашел решение. я устал.

красный квадрат на сцене. mouse-down + mouse-drag-up переместит красный квадрат вниз (+ y), а mouse-down + mouse-drag-down переместит красный квадрат вверх (-y). это противоположное движение желательно.

однако, при перетаскивании мышью квадрат должен начать двигаться с его текущей позиции y, независимо от того, сколько перетаскиваний мыши изменили свою начальную позицию. в настоящее время красный квадрат всегда начинается на стадии 0, поскольку моя переменная mouseDownOrigin неверна, потому что мой мозг спит.

package
{
import flash.display.Sprite;
import flash.events.MouseEvent;

public class Test extends Sprite
    {
    private var sp:Sprite = new Sprite();
    private var mouseDownOrigin:int;

    public function Test()
        {
        sp.graphics.beginFill(0xFF0000);
        sp.graphics.drawRect(0, 0, 100, 100);
        sp.x = sp.y = 200;
        addChild(sp);

        stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownEventHandler);
        }

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

    private function mouseMoveEventHandler(evt:MouseEvent):void
        {
        sp.y = mouseDownOrigin - evt.stageY;
        }

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

1 Ответ

2 голосов
/ 22 ноября 2010

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

   private var currentPosition:int;

   private function mouseUpEventHandler(evt:MouseEvent):void
   {
     currentPosition = sp.y;

     stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler);
     stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler);
   }

   private function mouseMoveEventHandler(evt:MouseEvent):void
   {
       var n:int = event.stageY - mouseDownOrigin ;
       sp.y = currentPosition - n;
   }
...