Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.09.2013, 04:24
kelod вне форума Посмотреть профиль Отправить личное сообщение для kelod Найти все сообщения от kelod
  № 1  
Ответить с цитированием
kelod

Регистрация: Jan 2012
Сообщений: 97
По умолчанию как сделать перемещение спрайта мышью

опишу суть проблемы:
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();
 
		}


Последний раз редактировалось kelod; 27.09.2013 в 16:22.
Старый 27.09.2013, 09:51
TexHuK вне форума Посмотреть профиль Отправить личное сообщение для TexHuK Найти все сообщения от TexHuK
  № 2  
Ответить с цитированием
TexHuK

Регистрация: Feb 2009
Сообщений: 57
можно сделать так
Вешаем на спрайты потомок слушатель
Код AS3:
for (var i:int = 0; i < fon.numChildren-1; i++)
this["spritePotomok" + i].addEventListener(MouseEvent.MOUSE_DOWN, nach);
а по поводу второй задачи еще не думал, тут можно подумать над тем что например запустить энтерфрейм, во время нажатия и отслеживать например положение курсора если она ушла за пределы, или достигла некой области, выключать перетаскивание, удалять слушатель, по нажатию снова создавать этот слушатель

Старый 27.09.2013, 14:34
kelod вне форума Посмотреть профиль Отправить личное сообщение для kelod Найти все сообщения от kelod
  № 3  
Ответить с цитированием
kelod

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

Старый 27.09.2013, 15:02
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 4  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Код 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();
		}
 
	}
 
}

Старый 27.09.2013, 15:18
kelod вне форума Посмотреть профиль Отправить личное сообщение для kelod Найти все сообщения от kelod
  № 5  
Ответить с цитированием
kelod

Регистрация: Jan 2012
Сообщений: 97
Akopalipsis, вопрос был про завершение перетаскивания, а не про его начало, начало перетаскивания я делаю так же
в ващем примере если добавитm событие out срыв мыши происходит так же как и у меня


Последний раз редактировалось kelod; 27.09.2013 в 16:21.
Старый 27.09.2013, 17:24
TexHuK вне форума Посмотреть профиль Отправить личное сообщение для TexHuK Найти все сообщения от TexHuK
  № 6  
Ответить с цитированием
TexHuK

Регистрация: Feb 2009
Сообщений: 57
Цитата:
Сообщение от kelod Посмотреть сообщение
дело в том что у меня будет очень много потомков, по-моему не очень разумно вешать на каждый слушатель.
про энтерфрайм я думал, но это не лучшее решение, так как в сцене могут присутствовать и другие элементы, при наведении на которых мышью перетаскивание тоже должно останавливаться, т.е. мне нужно просто узнать какой элемент находиться в данный момент под мышью, либо придумать как сделать так что бы слушатель на родителе работал не с одним потомком, а со всеми сразу
я же не предлагаю вешать конкретно на все потомки.
если не вешать слушатели на потомки, остается таскать именно сцену, но слушатель может быть один, а в зависимости от выбранного объекта на сцене, выполнять предназначенный функционал.

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

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

Старый 27.09.2013, 17:40
kelod вне форума Посмотреть профиль Отправить личное сообщение для kelod Найти все сообщения от kelod
  № 7  
Ответить с цитированием
kelod

Регистрация: Jan 2012
Сообщений: 97
Цитата:
Сообщение от TexHuK Посмотреть сообщение
я же не предлагаю вешать конкретно на все потомки.
если не вешать слушатели на потомки, остается таскать именно сцену, но слушатель может быть один, а в зависимости от выбранного объекта на сцене, выполнять предназначенный функционал.

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

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

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

Старый 27.09.2013, 18:03
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 8  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Код AS3:
public function mouseOut(event:Event):void
		{
 
			this.mouseChildren = true
			event.stopPropagation()
 
		}

Старый 27.09.2013, 18:09
Rivexe вне форума Посмотреть профиль Отправить личное сообщение для Rivexe Найти все сообщения от Rivexe
  № 9  
Ответить с цитированием
Rivexe
 
Аватар для Rivexe

Регистрация: Jun 2013
Сообщений: 133
Проверяй с какого объекта пришло событие и является ли он потомком.

Код AS1/AS2:
function kon(e:MouseEvent):void
{
	if(e.target.parent == fon || (e.relatedObject && e.relatedObject.parent == fon))
		return;
	fon.stopDrag();
}

Старый 27.09.2013, 18:22
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 10  
Ответить с цитированием
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
уберите страшный код пожалуйста

Создать новую тему Ответ Часовой пояс GMT +4, время: 09:43.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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