событие мыши не работает должным образом - PullRequest
0 голосов
/ 22 декабря 2009

Может кто-нибудь, пожалуйста, помогите мне в этом. прикрепленный флаг, который имеет часть кода, над которым я работаю для проекта.

с помощью мыши вы можете нарисовать круг на изображении, но по некоторым причинам событие мыши не работает. он отлично работает, когда списки событий присоединены к сцене, но не работает, когда он прикреплен к мувиклипу.

также, как я могу ограничить рисование круга только внутри мувиклипа, который является прямоугольником.

вот код

    const CANVAS:Sprite = new Sprite();
var _dragging:Boolean = false;
var _corner:Point;
var _corner2:Point;

menFront.addEventListener(MouseEvent.MOUSE_DOWN, setAnchor);
menFront.addEventListener(MouseEvent.MOUSE_UP, completeRect);


function setAnchor(e:MouseEvent):void{
    trace("mouse down");
    if(!_dragging){
        CANVAS.graphics.clear(); 

        _corner = new Point(e.stageX, e.stageY);
        _dragging = true;
        menFront.addEventListener(MouseEvent.MOUSE_MOVE, liveDrag);
    }
}

function completeRect(e:MouseEvent):void{
    trace("mouse up");
    if(_dragging){    
        _dragging = false;
        menFront.removeEventListener(MouseEvent.MOUSE_MOVE, liveDrag);
        CANVAS.graphics.lineStyle(0, 0, 0);
        CANVAS.graphics.beginFill(0x222222,.5)

        _corner2 = new Point(e.stageX, e.stageY);
        trace(Point.distance(_corner,_corner2).toFixed(2));
        CANVAS.graphics.drawCircle(_corner.x, _corner.y, Point.distance(_corner,_corner2));
        addChild(CANVAS); 
    }
}

function liveDrag(e:MouseEvent):void{
    CANVAS.graphics.clear(); 
    CANVAS.graphics.lineStyle(0, 0x999999);

    _corner2 = new Point(e.stageX, e.stageY);
    //trace(Point.distance(_corner,_corner2).toFixed(2));
    CANVAS.graphics.drawCircle(_corner.x, _corner.y, Point.distance(_corner,_corner2));
    addChild(CANVAS); 
}

1 Ответ

3 голосов
/ 22 декабря 2009

Если вы добавите MouseEvent.MOUSE_UP к объекту, который вы перетаскиваете, событие only сработает, если элемент находится под мышью в момент, когда происходит MOUSE_UP, но поскольку вы обновляете элемент с MOUSE_MOVE, это состояние гонки между тем, когда происходит MOUSE_UP и когда происходит MOUSE_MOVE.

Чтобы избежать таких проблем, вы хотите гарантировать, что вы получите MOUSE_UP при каждом запуске MOUSE_UP, во время цикла обновления в реальном времени. Чтобы сделать это, добавьте прослушиватель событий на сцену, когда это необходимо, примерно так:

menFront.addEventListener(MouseEvent.MOUSE_DOWN, setAnchor);

function setAnchor(event:MouseEvent):void
{
    stage.addEventListener(MouseEvent.MOUSE_UP, completeRect);
    // your other functionality
}

function completeRect(event:MouseEvent):void
{
    stage.removeEventListener(MouseEvent.MOUSE_UP, completeRect);
    // your other functionality
}

чтобы ваш completeRect не вызывался по неосторожности, если вы нажали в другом месте.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...