2010-11-23 16 views
1

Gibt es eine Möglichkeit, einen MovieClip mit startDrag zu haben, aber nur horizontale und vertikale (d. H. Nicht diagonale) Bewegung zu erzwingen?startDrag - stoppen diagonale Bewegung

+2

Bitte erweitern Sie Ihre Frage ... wie wollen Sie jemanden zu stoppen diagonal bewegen, wenn Sie so dass sie ... horizontal und vertikal in der gleichen Zeit bewegen? Denk darüber nach. – ocodo

Antwort

4

Hier ist meine Lösung. Es verfolgt die mouseX und mouseY beim Klick und vergleicht sie mit der letzten Position. Findet heraus, in welche Richtung sich die Maus hauptsächlich bewegt, und bewegt das Objekt dorthin. Möglicherweise möchten Sie eine zusätzliche Logik hinzufügen, um das Objekt auf die nächste 10. Einheit oder die Einheitsgröße zu fixieren, die Sie für die Verwendung in Spielen oder für die organisierte Platzierung des Objekts als Fanggitter verwenden möchten.

Update: Ich ging voran und fügte eine snapNearest Funktion hinzu, um die Bewegung zu steuern.

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; 

} 
1

Sie können nur auf die eine oder die andere Achse beschränken (unter Verwendung eines Einschränkungsrechtecks). Aber eine diagonale Bewegung wäre in der von Ihnen vorgeschlagenen Methode möglich, außer Sie definieren auch andere Grenzen ... zum Beispiel ein Gitter.

4

ja. Es gibt ein paar Optionen.

A. Sie können wählen, die startDrag() - Funktion zu verwenden und ihren zweiten Parameter mit einem Begrenzungsrechteck für Ihr ziehbares Objekt zu versehen. etwas wie;

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

B. können Sie Ihr ziehbar Objekt gesetzt für Mausereignisse zu hören, es entsprechend den Mausbewegungen bewegt. so etwas wie:

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

Diese Methoden beschränken die Bewegung nur auf eine Achse gleichzeitig ... Nicht Ihre Schuld, weil die Frage des OPs keinen Sinn ergibt ... noch nicht. – ocodo

+0

ah, ich habe die Frage falsch interpretiert. – TheDarkIn1978

2

Sie eine Zusatztaste verwenden würde könnte zum Beispiel ein normales Verhalten sein horizontal & drücken Sie die Shift-Taste vertikal zu bewegen.

function mouseMoveEventHandler(evt:MouseEvent):void 
    { 
     if(!evt.shiftKey) 
      dragSprite.x = evt.stageX; 
     else 
      dragSprite.y = evt.stageY;   
    }