2010-11-23 44 views
1

有沒有辦法有一個的startDrag影片剪輯,而是迫使只水平和垂直(即未對角)的運動?的startDrag - 停止對角運動

+2

請擴展您的問題......您如何建議阻止某人在對角線移動時允許他們在同一時間水平和垂直移動......?想想看。 – ocodo 2010-11-23 01:17:25

回答

4

這是我的解決方案。它在點擊時跟蹤鼠標X和鼠標Y並將其與最後位置進行比較。找出鼠標主要移動的方向,然後在那裏移動對象。您可能需要添加一些額外的邏輯,將對象鎖定到最接近的第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; 

} 
1

只能限制在一個軸或其他(使用的約束矩形),但對角運動將在你提出的方法是不可能的,除非你還定義了一些其他的限制......例如一個網格。

4

肯定。有幾個選項。

答:您可以選擇使用startDrag()函數併爲您的可拖動對象提供邊界矩形的第二個參數。就像是;

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

這些方法一次只限制一個軸的移動......不是你的錯,因爲OP的問題沒有意義......但是。 – ocodo 2010-11-23 01:15:55

2

你可以使用組合鍵,例如正常行爲是水平&按下shift鍵上下移動。

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