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