ActionScript - проблема логики управления мышью - PullRequest
0 голосов
/ 14 февраля 2011

Я пытаюсь контролировать 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);
        }
    }
}

1 Ответ

0 голосов
/ 14 февраля 2011

Вы должны проверить, какой Rect будет перемещен, перед регистрацией mouseMoveHandler. А затем измените положение нужного прямоугольника. Я использовал переменную 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);
        }
    }
}
...