2011-02-14 88 views
0

我试图控制2个不同的形状(红色矩形和蓝色矩形)与鼠标事件(向下,移动,向上)的相同序列,但只有一个形状在一个时间必须移动。的ActionScript - 鼠标控制逻辑问题

形状被沿着x轴水平锁定。

红色矩形,它开始时在舞台上的左侧,具有右侧登记而在舞台上的右侧的蓝色矩形具有左注册。在MOUSE_MOVE事件期间移动的矩形是最接近* MOUSE_MOVE *事件的stageX属性的形状。

最接近矩形由每个矩形(averageX)的相对于x属性平均到MOUSE_MOVE stageX属性确定。因此,如果stageX小于averageX,左侧的形状应该移动。刨花比averageX,形状在右边。

问题时控制在随后的事件MOUSE_MOVE改变矩形,MOUSE_UP之前发生。在MOUSE_DOWN期间设置的变量适用于首先移动的矩形,但当另一个矩形移动时,事情变得危险。

基本上,其X属性是最接近MOUSE_MOVE事件的stageX属性应该沿着向左或向右鼠标事件,一次一个移动矩形。

为用下面的代码示例简单起见,总是可以某处两个矩形之间发生一个事件MOUSE_DOWN。

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

//Class 
public class RectsTest extends Sprite 
    { 
    //Variables 
    private var redRect:Shape; 
    private var blueRect:Shape; 

    private var mouseDownOrigin:Number; 
    private var redRectOrigin:Number; 
    private var blueRectOrigin:Number; 
    private var averageX:Number; 

    //Constructor 
    public function RectsTest() 
     { 
     init(); 
     } 

    //Initialize 
    private function init():void 
     { 
     redRect = createRect(0xFF0000, -200, 200, 100); 
     redRect.x = 200; 
     redRect.y = 200; 

     blueRect = createRect(0x0000FF, 0, 200, 100); 
     blueRect.x = stage.stageWidth - 200; 
     blueRect.y = 300; 

     addChild(redRect); 
     addChild(blueRect); 

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

    //Create Rect 
    private function createRect(color:Number, x:Number, width:Number, height:Number):Shape 
     { 
     var result:Shape = new Shape(); 
     result.graphics.beginFill(color); 
     result.graphics.drawRect(x, 0, width, height); 
     result.graphics.endFill(); 

     return result; 
     } 

    //Mouse Down Event Handler 
    private function mouseDownEventHandler(evt:MouseEvent):void 
     { 
     mouseDownOrigin = evt.stageX; 
     redRectOrigin = redRect.x; 
     blueRectOrigin = blueRect.x; 

     averageX = (redRect.x + blueRect.x)/2; 

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

    //Mouse Move Event Handler 
    private function mouseMoveEventHandler(evt:MouseEvent):void 
     { 
     if (evt.stageX < averageX) 
      redRect.x = redRectOrigin + evt.stageX - mouseDownOrigin; 

     if (evt.stageX > averageX) 
      blueRect.x = blueRectOrigin + evt.stageX - mouseDownOrigin; 

     averageX = (redRect.x + blueRect.x)/2; 
     } 

    //Mouse Up Event Handler 
    private function mouseUpEventHandler(evt:MouseEvent):void 
     { 
     stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler); 
     stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler); 
     } 
    } 
} 

回答

0

您应该检查在注册mouseMoveHandler之前将移动哪个Rect。然后改变必要矩形的位置。我使用currentRect变量来表示可移动矩形:

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

//Class 
public class RectsTest extends Sprite 
    { 
    //Variables 
    private var redRect:Shape; 
    private var blueRect:Shape; 

    private var mouseDownOrigin:Number; 
    private var redRectOrigin:Number; 
    private var blueRectOrigin:Number; 
    private var averageX:Number; 

    //Constructor 
    public function RectsTest() 
     { 
     init(); 
     } 

    //Initialize 
    private function init():void 
     { 
     redRect = createRect(0xFF0000, -200, 200, 100); 
     redRect.x = 200; 
     redRect.y = 200; 

     blueRect = createRect(0x0000FF, 0, 200, 100); 
     blueRect.x = stage.stageWidth - 200; 
     blueRect.y = 300; 

     addChild(redRect); 
     addChild(blueRect); 

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

    //Create Rect 
    private function createRect(color:Number, x:Number, width:Number, height:Number):Shape 
     { 
     var result:Shape = new Shape(); 
     result.graphics.beginFill(color); 
     result.graphics.drawRect(x, 0, width, height); 
     result.graphics.endFill(); 

     return result; 
     } 

    //Mouse Down Event Handler 
    private function mouseDownEventHandler(evt:MouseEvent):void 
     { 
     mouseDownOrigin = evt.stageX; 
     redRectOrigin = redRect.x; 
     blueRectOrigin = blueRect.x; 

     averageX = (redRect.x + blueRect.x)/2; 

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

    //Mouse Move Event Handler 
    private function mouseMoveEventHandler(evt:MouseEvent):void 
     { 
     if (evt.stageX < averageX) { 
      redRect.x = redRectOrigin + evt.stageX - mouseDownOrigin; 
      redRectOrigin = redRect.x; 
     } 


     if (evt.stageX > averageX) { 
      blueRect.x = blueRectOrigin + evt.stageX - mouseDownOrigin; 
      blueRectOrigin = blueRect.x; 
     } 

     mouseDownOrigin = evt.stageX; 
     averageX = (redRect.x + blueRect.x)/2; 
     } 

    //Mouse Up Event Handler 
    private function mouseUpEventHandler(evt:MouseEvent):void 
     { 
     stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpEventHandler); 
     stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseMoveEventHandler); 
     } 
    } 
} 
+0

我觉得你误会了,因为你的代码不起作用。拖动时应该能够改变移动的形状。所以如果我将红色矩形拖到屏幕的右侧,一旦stageX接近蓝色矩形,红色矩形将停止移动,而蓝色矩形开始移动 - 全部在鼠标移动之前。 – TheDarkIn1978 2011-02-14 20:03:14