Форум 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=148344)

passertm 28.12.2010 15:17

нормальный драг во флеш
 
уже долгое время не могу реализовать нормальный драг во флеш.

чем плох стандартный startDrag stopDrag:
если предмет маленкий. взял предмет. помохал мышкой. предмет оказался не под мышкой. отпустил мышу. а предмет никак не отцепится. это совсем не смешно.

невозможно ограничить движение обьекта по пути есди путь не горизонтальная и вертикальная линия.


второе не так важно в данный момент для меня. но первое как то нужно решать.
уна одном сайте нашел предложения поставить stopDrag на событие ROLL_OUT но тогда чуть мышу дернул обьект отвалился.

iflamberg 28.12.2010 15:29

Никогда не пользоваться startDrag stopDrag.
На зажатие вешать обработчик MOUSE_MOVE, по MOUSE_MOVE перемещать, на отжатие убивать обработчик.

alatar 28.12.2010 15:33

Цитата:

если предмет маленкий. взял предмет. помохал мышкой. предмет оказался не под мышкой. отпустил мышу. а предмет никак не отцепится. это совсем не смешно.
MOUSE_UP вешайте на на клип, а на stage.
Цитата:

невозможно ограничить движение обьекта по пути есди путь не горизонтальная и вертикальная линия.
В этом случае драг вообще не используется. Вешается MOUSE_MOVE и в зависимости от координат мыши высчитывается положение объекта.

Добавлено через 1 минуту
Цитата:

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

mikhailk 28.12.2010 15:36

Цитата:

На зажатие вешать обработчик MOUSE_MOVE, по MOUSE_MOVE перемещать, на отжатие убивать обработчик.
+1
либо MOUSE_MOVE, либо ENTER_FRAME, либо TIMER

Умом понять не могу, но в разных приложениях почему-то все по-разному происходит.
Бывает, что на MOUSE_MOVE возникает ощущение, что объект "не успевает" за мышкой, а по ENTER_FRAME нормально двигается.

alatar 28.12.2010 15:38

Цитата:

Бывает, что на MOUSE_MOVE возникает ощущение, что объект "не успевает" за мышкой, а по ENTER_FRAME нормально двигается.
MOUSE_MOVE срабатывает не сразу (не в тот же момент как мышка сдвинулась на пиксель), поэтому возникает такой эффект.

iflamberg 28.12.2010 15:43

Слушатель MOUSE_MOVE вешается на stage. Чтобы MOUSE_EVENT был обработан сразу, нужно в нём выполнить mouseEvent.updateAfterEvent(), ну элементарные же вещи.

passertm 28.12.2010 16:11

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

Добавлено через 3 минуты
Цитата:

Сообщение от iflamberg (Сообщение 960428)
Слушатель MOUSE_MOVE вешается на stage. Чтобы MOUSE_EVENT был обработан сразу, нужно в нём выполнить mouseEvent.updateAfterEvent(), ну элементарные же вещи.

хм... очень познавательно. учту.

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

terbooter 28.12.2010 16:18

я тоже методом startDrag никогда не пользуюсь.
Делаю что-то подобное
Код AS3:

private function onEnterFrame(e:Event):void {
                        //TODO оптимизировать
                        this.field.x = this.mouseX-this.clickPoint.x;
                        this.field.y = this.mouseY-this.clickPoint.y;
 
                        if (this.field.x > 0) {
                                this.field.x = 0;
                        }
                        if (this.field.y > 0) {
                                this.field.y = 0;
                        }
 
                        if (this.field.x < this.stage.stageWidth - this.field.width) {
                                this.field.x = this.stage.stageWidth - this.field.width;
                        }
                        if (this.field.y < this.stage.stageHeight - this.field.height) {
                                this.field.y = this.stage.stageHeight - this.field.height;
                        }
 
                }


incvizitor 28.12.2010 17:10

Цитата:

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

Код AS3:

stage.addEventListener(MouseEvent.MOUSE_UP,onMouseUp);
 
function onMouseUp(e:MouseEvent):void{
  obj.stopDrag();
}


Fernando Costa 29.12.2010 03:57

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


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

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