Chunky Chunk
Chunky Chunk

Reputation: 17217

ActionScript - Mouse Logic Problem

dumb problem. embarrassed that i haven't found a solution. i'm tired.

a red square in on the stage. mouse-down + mouse-drag-up will move the red square downward (+y), while mouse-down + mouse-drag-down will move the red square upward (-y). this opposite motion is desired.

however, during a mouse drag the square must begin moving from it's current y position, regardless of how many mouse drags have changed it's initialized position. currently, the red square will always begin at stage 0, since my mouseDownOrigin variable is incorrect because my brain is asleep.

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);
        }
    }
}

Upvotes: 0

Views: 167

Answers (1)

PatrickS
PatrickS

Reputation: 9572

You need to record the red square y position on the MouseUp event handler, practically recording the position you leave the square in.

   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;
   }

Upvotes: 2

Related Questions