Спрайты не перестают тянуть на MOUSE_UP - PullRequest
0 голосов
/ 01 марта 2011

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

    public function layOutEventListeners():void
    {

        var addSpriteEventListener:Function =
        function(spr:Dictionary, index:int, vector:Vector.<Dictionary>)
        {
            spr["sprite"].addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
            spr["sprite"].addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
        }

        gridVec.forEach(addSpriteEventListener);
    }`

и методы для обработки событий:

    public function mouseDownHandler(me:MouseEvent):void
    {
        trace(me.target.toString());
        trace(me.currentTarget.toString());

        this.drawSprite(me.target);
        this.growByTwo(me.target);
        me.stopImmediatePropagation();

        me.currentTarget.startDrag(me);
    }

    public function mouseUpHandler(me:MouseEvent):void
    {
        trace(me.target.toString());
        trace(me.currentTarget.toString());

        me.stopImmediatePropagation();
        this.originalSize(me.target);
        me.currentTarget.stopDrag();
    }`

Моя проблема: когда я нажимаю на спрайты, как толькоЯ перемещаю курсор, точка регистрации Sprite привязывается к курсору, и когда я отпускаю мышь, Sprite не прекращает следовать за курсором.Сначала я думал, что это проблема столкновения пикселей.Я думал, что курсор ничего не касается на MOUSE_UP, но после эксперимента это оказалось ложным.Я даже повторил те же методы добавления и обработки событий, запустив другой проект, и обнаружил, что у меня нет этой проблемы.Тестовый спрайт просто перетаскивался, как обычно, не привязывался к точке регистрации и не перетаскивался точкой, на которую нажал.

Единственное отличие, которое я вижу, и мое единственное подозрение, это то, что спрайтыв моем исходном коде они добавляются в Sprite, который затем добавляется на сцену, тогда как Sprite в тестовом проекте добавляется в корень DisplayObject.Я думаю, что Событие каким-то образом распространяется вниз к контейнеру Sprite и перетаскивает его, не опуская другой Sprite.Странная привязка, которую я вижу, может быть привязкой курсора к объекту позади другого спрайта.Еще одна важная вещь: когда я опускаю Спрайт поверх другого Спрайта, этот Спрайт перестает двигаться так, как я этого хочу, но все еще отстает от точки регистрации.

Несмотря на это, я действительно ошеломлен и действительноне знаю, что я бегу заЕсть идеи?

1 Ответ

1 голос
/ 01 марта 2011

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

Я не уверен, что это ваш случай, но в любом случае часто рекомендуется назначать событие MOUSE_UP на сцену, чтобы вы могли с уверенностью гарантировать, что оно всегда срабатывает. Обязательно удалите прослушиватель из обработчика mouseUp;)

spr["sprite"].addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
public function mouseDownHandler(me:MouseEvent):void {
   stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
}
public function mouseUpHandler(me:MouseEvent):void {
   stage.removeEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
}

Недостатком является то, что вы теряете ссылку на клип в mouseUp, но вы можете создать ссылку вручную в mouseDown или делать все это внутренне (в коде спрайта).

...