Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   startDrag объект не успевает за мышью (http://www.flasher.ru/forum/showthread.php?t=187770)

AlexLucas 23.11.2012 21:58

startDrag объект не успевает за мышью
 
Доброго времени суток.
Пытаюсь перетаскивать малые спрайты с помощью startDrag(). Они перетаскиваются, но проблема в том что при startDrag я на них вешаю MOUSE_MOVE, и соответственно из-за того что при быстром перемещении мыши они за ней не успевают, они его не ловят. Пробовал на простейшем примере, всё равно не успевает.
Попробовал демку флексовского DragManager - там прокси тащится идеально. Вроде почитал - так и DragManager использует startDrag() .
Объясните - почему так ?

Hauts 23.11.2012 22:19

Цитата:

я на них вешаю MOUSE_MOVE
На stage попробуйте повесить.

А вообще я startDrag никогда не уважал.

Isfet 24.11.2012 07:38

Цитата:

А вообще я startDrag никогда не уважал.
ага, вместо старт драг, и стоп драг используйте MOUSE_DOWN и MOUSE_UP

Hauts 24.11.2012 10:23

Isfet, и MOUSE_MOVE

FlashRus 24.11.2012 10:31

FPS поднимите. Вот все решение.

ChuwY 25.11.2012 16:10

Цитата:

Сообщение от AlexLucas (Сообщение 1105843)
Доброго времени суток.
Попробовал демку флексовского DragManager - там прокси тащится идеально. Вроде почитал - так и DragManager использует startDrag() .
Объясните - почему так ?

Наверняка, там используется updateAfterEvent.

alatar 25.11.2012 17:09

Цитата:

Сообщение от AlexLucas (Сообщение 1105843)
Вроде почитал - так и DragManager использует startDrag() .
Объясните - почему так ?

Не использует. DragManager вообще не занимается непосредственно перетаскиванием картинки, этим занимается DragProxy. И он тоже не использует startDrag().

AlexLucas 26.11.2012 18:15

У меня много таких объектов, при перетаскивании которых надо будет выполнять разные действия. Т.е. если прицепить MOUSE_MOVE/UP к stage, у меня будет один обработчик, он получит объект который надо тащить и при MOUSE_MOVE будет обновлять координаты этого объекта, и вызывать нужные мне методы.
То есть единственный выход написать какой-то свой DragManager, т.к. флексовый DragManager используется для немного других целей ?

Повышение fps не спасает.
И при MOUSE_UP/DOWN объект также не догоняет мышь.

И всё-таки может кто-то знает как это реализовано в DragManager? Там прокси как приклеенная к курсору.
Цитата:

DragManager вообще не занимается непосредственно перетаскиванием картинки, этим занимается DragProxy.
И что такое DragProxy? Я такого класса не нашёл.

alatar 26.11.2012 18:25

Цитата:

Сообщение от AlexLucas (Сообщение 1106364)
Я такого класса не нашёл.

В документации его нет. Можете найти в исходниках в пакете mx.managers.dragClasses.

AlexLucas 26.11.2012 18:54

Но я не понимаю, в обработчике mouseMoveHandler же нет никакой уличной магии, просто передаются координаты мыши и всё.

Hauts 26.11.2012 18:58

Может код покажите? И пример простой?

AlexLucas 26.11.2012 19:19

Вложений: 1
Блин... Там создаётся отдельный спрайт для курсора, а курсор прячется, и картинка с ним вместе обновляются, поэтому кажется что картинка к курсору приклеена . А по сути, я уверен там та же проблема.
Ну мне в любом случае прийдётся привязывать к stage.

Про вложение - тяните красный квадратик слева сверху, когда он словит MOUSE_MOVE - зелёный прямоугольник будет виден.
Кстати заметил, что в релизном плеере отстаёт гораздо меньше.

Hauts 26.11.2012 19:35

Код AS3:

package 
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.geom.Matrix;
        import flash.geom.Point;
        import flash.text.StyleSheet;
        import flash.text.TextField;
        import flash.display.DisplayObject;
 
        /**
        * ...
        * @author Hauts
        */

        public class Main extends Sprite
        {
                private var spr2:Sprite = new Sprite();
                private var spr3:Sprite = new Sprite();
                public function Main()
                {                       
                        //spr3.graphics.lineStyle(2, 0xFF0000);
                        spr3.graphics.beginFill(0xFF0000);
                        spr3.graphics.drawRect(0, 0, 10, 10);
                        //spr3.width = 390; spr3.height = 150;                       
                        spr2.x = 300; spr2.y = 50;
                        spr2.graphics.beginFill(0x00FF00);
                        spr2.graphics.drawRect(0, 0, 300, 50);
                        spr2.visible = false;
 
                        addChild(spr2);
                        addChild(spr3);
                        spr3.addEventListener(MouseEvent.MOUSE_DOWN, dragMe);
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, checkMM);
                        spr3.addEventListener(MouseEvent.MOUSE_OUT, hideThis);
 
                }
 
                private function hideThis(e:MouseEvent):void {
                        spr2.visible = false;
                }
 
                private function checkMM(e:MouseEvent):void {
                        spr2.visible = true;
                }
 
                private var posDif:Point = new Point();
                private function dragMe(e:MouseEvent):void {
                        posDif.x = e.target.mouseX;
                        posDif.y = e.target.mouseY;
                        stage.addEventListener(MouseEvent.MOUSE_MOVE, dragSprite);
                        stage.addEventListener(MouseEvent.MOUSE_UP, releaseSprite);                       
                }
 
                private function dragSprite(event:MouseEvent):void {
                        spr3.x = mouseX - posDif.x;
                        spr3.y = mouseY - posDif.y;
                        stage.invalidate();
                        event.updateAfterEvent()
                }
 
                private function releaseSprite(E:MouseEvent):void {
                        stage.removeEventListener(MouseEvent.MOUSE_MOVE, dragSprite);
                        stage.removeEventListener(MouseEvent.MOUSE_UP, releaseSprite);       
                }
 
                private function tracee (e:MouseEvent):void {
                        trace('MOUSE_MOVE');
                }
 
        }
 
}

По-моему, нормально таскается.

AlexLucas 26.11.2012 19:48

В дебажном плеере отстаёт, в релизном - с или без
Код AS3:

stage.invalidate();
event.updateAfterEvent();

ну я разницы не почувствовал, не отстаёт, всё отлично.


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

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