Я пытаюсь контролировать 2 разные фигуры (красный и синий прямоугольники) с одинаковой последовательностью событий мыши (вниз, движение, вверх), но только одна фигура за раз должна двигаться.
фигуры зафиксированы горизонтально вдоль оси X.
красный прямоугольник, который начинается с левой стороны сцены, имеет правую регистрацию, а синий прямоугольник с правой стороны сцены имеет левую регистрацию. прямоугольник, который перемещается во время событий MOUSE_MOVE, является формой, наиболее близкой к свойству stageX события * MOUSE_MOVE *.
ближайший прямоугольник определяется путем усреднения свойства x каждого прямоугольника ( averageX ) по отношению к свойству MOUSE_MOVE stageX . поэтому, если stageX меньше, чем СреднееX , форма слева должна двигаться. терка средняяX , форма справа.
проблема возникает, когда элемент управления меняет прямоугольники во время последующих событий MOUSE_MOVE, перед MOUSE_UP. переменные, которые установлены во время MOUSE_DOWN, подходят для прямоугольника, который перемещается первым, но вещи становятся рискованными, когда вместо этого должен быть перемещен другой прямоугольник.
В основном, прямоугольник, свойство x которого ближе всего к свойству stageX события MOUSE_MOVE, должно перемещаться влево или вправо вместе с событием мыши, по одному за раз.
для простоты в следующем примере кода событие 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);
}
}
}