Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Перетаскивание спрайта и различные координаты мыши (http://www.flasher.ru/forum/showthread.php?t=148044)

orcpochta 20.12.2010 16:04

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

При перетаскивании объекта target в установленных рамках при отжатии мыши target.mouseX, target.mouseY, stage.mouseX, stage.mouseY имеют значения в точке зажатия объекта для перетаскивания, а не в точке, где была мышь во время дропа. Без установки рамок - все ок.

Переместите квадрат так, чтобы он уперся в правый нижний угол своих границ движения, отожмите мышь правее и ниже, чтобы квадрат не съехал из правого нижнего угла. Затем зажимайте мышь в середине квадрата и отпускайте в различных точках экрана, но в секторе ниже и правей, чтобы квадрат не съезжал. Смотрите за значениями в аутпуте - они должны быть примерно одинаковы в различных точках отпускания мыши.

Код AS3:

var s:Sprite = new Sprite();
addChild(s);
s.graphics.beginFill(0);
s.graphics.drawRect(0, 0, 100, 100);
 
s.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownListener);
function mouseDownListener(e:MouseEvent):void
{
        s.startDrag(false, new Rectangle(0, 0, 100, 100));
        //s.startDrag(false, null); - все ок!
}
 
stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpListener);
function mouseUpListener(e:MouseEvent):void
{
        s.stopDrag();
 
        trace(s.mouseX, s.mouseY);
        trace(stage.mouseX, stage.mouseY, "\n");                               
}

UPD: если при дропе мышь в рамках движения объекта, то вроде тоже все ок.

Как же вытащить реальные координаты мыши во время дропа?

mikhailk 20.12.2010 16:37

MouseEvent.MOUSE_MOVE

orcpochta 20.12.2010 16:47

Про эти костыли я догадался))) Можно еще короткий таймер наверно включать при дропе, чтобы он уже сверил координаты мыши)))

mikhailk 20.12.2010 17:14

это не костыли
события MouseEvent.MOUSE_DOWN и MouseEvent.MOUSE_UP возникают только в начале и конце перетаскивания

во время перетаскивания снимаем координаты по событиям:
- MouseEvent.MOUSE_MOVE
- Event.ENTER_FRAME
- TimerEvent.TIMER

orcpochta 20.12.2010 17:53

если внимательно читать, то интересует именно момент дропа - т.е. событие "MOUSE_UP")))

mikhailk 20.12.2010 18:09

Действительно занятное поведение.

Может дело в этом:
Цитата:

bounds:Rectangle (default = null) — Значение относительно координат родительского объекта Sprite, задающее для него закрепленный прямоугольник.
Кстати, возможно это просто глюк.
Если повесить на МаусМув выдачу координат стэйдж.маусИкс/Игрек, то они выдаются правильно, в обработчике mouseUpListener неправильно, а потом - опять правильно.

alatar 20.12.2010 18:46

ИМХО вполне логичное поведение при драге. Хотите реальные координаты, берите их из event.stageX / stageY.

orcpochta 20.12.2010 18:49

О, забыл про них)))

UPD:
А не, не забыл! Я просто не имею к ним доступа, т.к. подписываюсь на собственное событие компонента, который говорит, что произошло дропанье предмета, и ессно stageX, stageY не передает. Я думал, что можно, конечно, добавить эти поля, но они как-то совсем не к месту там в этом простеньком событии.


Часовой пояс GMT +4, время: 05:51.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.