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

kelod 27.09.2013 04:24

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

собственно ничего сложного, я создал один спрайт, добавил в него спрайтов-потомков, повешал на них события разные, всё работает, но есть проблемы, которые уже два дня не могу решить((
перемеoение осуществляю используя start/stop drag, при уходе курсора мышки за экран, всё останавливается и скачет при возвращении, это первое, плюс необходимо осуществитьсброс перетаскивания, при попадании мышки на другой объект или выходу за пределы, пробовал вешать событие OUT, возникла проблема, фокус почему то определяется не у родителя, а у потомка, хотя слушатель на родителе

Код AS3:

addChild(fon);
fon.addChild(spt1);
fon.addChild(spt2);
fon.addChild(spt3);
 
fon.addEventListener(MouseEvent.MOUSE_DOWN, nach);
fon.addEventListener(MouseEvent.MOUSE_UP, kon);
fon.addEventListener(MouseEvent.MOUSE_OUT, kon);

вызов функций такой
Код AS3:

private function kon(e:MouseEvent):void 
                {
                        fon.stopDrag();
                }
 
                private function nach(e:MouseEvent):void
                {
                        fon.startDrag();
 
                }


TexHuK 27.09.2013 09:51

можно сделать так
Вешаем на спрайты потомок слушатель
Код AS3:

for (var i:int = 0; i < fon.numChildren-1; i++)
this["spritePotomok" + i].addEventListener(MouseEvent.MOUSE_DOWN, nach);

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

kelod 27.09.2013 14:34

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

Akopalipsis 27.09.2013 15:02

Код AS3:

package
{
        import flash.display.DisplayObject;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
 
        public class Drag extends Sprite
        {
                private var _container:Sprite;
                private var _spriteArray:Vector.<Sprite>;
 
                public function Drag()
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(event:Event=null):void
                {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
 
                        addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
 
 
                        _container = new Sprite();
                        super.addChild(_container);
                        var circle:Sprite;
                        _spriteArray = Vector.<Sprite>([]);
 
                        for (var i:int = 0; i < 10; i++)
                        {
                                circle = new Sprite();
                                circle.graphics.beginFill(Math.random() * 0xf6f6f6);
                                circle.graphics.drawCircle(Math.random() * stage.stageWidth, Math.random() * stage.stageHeight, 30);
                                circle.graphics.endFill();
                                _spriteArray.push(circle);
                                _container.addChild(_spriteArray[i] as DisplayObject);
                        }
                }
 
                private function mouseDownHandler(event:MouseEvent):void
                {
                        event.target.parent.startDrag();
                }
 
        }
 
}


kelod 27.09.2013 15:18

Akopalipsis, вопрос был про завершение перетаскивания, а не про его начало, начало перетаскивания я делаю так же
в ващем примере если добавитm событие out срыв мыши происходит так же как и у меня

TexHuK 27.09.2013 17:24

Цитата:

Сообщение от kelod (Сообщение 1147058)
дело в том что у меня будет очень много потомков, по-моему не очень разумно вешать на каждый слушатель.
про энтерфрайм я думал, но это не лучшее решение, так как в сцене могут присутствовать и другие элементы, при наведении на которых мышью перетаскивание тоже должно останавливаться, т.е. мне нужно просто узнать какой элемент находиться в данный момент под мышью, либо придумать как сделать так что бы слушатель на родителе работал не с одним потомком, а со всеми сразу

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

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

или вы хотите таскать всю область хватая любой объект при этом не вешая на них слушатель? так не получится.

kelod 27.09.2013 17:40

Цитата:

Сообщение от TexHuK (Сообщение 1147077)
я же не предлагаю вешать конкретно на все потомки.
если не вешать слушатели на потомки, остается таскать именно сцену, но слушатель может быть один, а в зависимости от выбранного объекта на сцене, выполнять предназначенный функционал.

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

или вы хотите таскать всю область хватая любой объект при этом не вешая на них слушатель? так не получится.

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

PS: я конечно написал костыль, который позволяет это обойти, но хотелось бы нормальное решение услышать

Babylon 27.09.2013 18:03

Код AS3:

public function mouseOut(event:Event):void
                {
 
                        this.mouseChildren = true
                        event.stopPropagation()
 
                }


Rivexe 27.09.2013 18:09

Проверяй с какого объекта пришло событие и является ли он потомком.

Код AS1/AS2:

function kon(e:MouseEvent):void
{
        if(e.target.parent == fon || (e.relatedObject && e.relatedObject.parent == fon))
                return;
        fon.stopDrag();
}


Babylon 27.09.2013 18:22

уберите страшный код пожалуйста:)


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

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