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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.09.2013, 20:06
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 21  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
потом что событие MOUSE_MOVE висит на спрайте
Спасибо! Что то недоглядел.
А почему когда мышка выходит за ограничения то обьекты все равно двигаются, хотя слушатель удалён?
Или он не удаляется пока не завершиться его работа?
Код AS3:
private function this_mouseMoveHandler(event:MouseEvent):void 
		{
			if (mouseX >  this.width) 
			{
				trace('>');
				stage.removeEventListener(MouseEvent.MOUSE_MOVE, this_mouseMoveHandler);
				this.removeEventListener(MouseEvent.MOUSE_DOWN, this_mouseDownHandler);
			}
			_target.x =  mouseX - _distantion.x;
			_target.y = mouseY - _distantion.y;
			event.updateAfterEvent();
		}

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

Регистрация: Jun 2013
Сообщений: 133
Вероятно, потому что вы удаляете слушатель с спрайта, а подписаны на stage
Код AS3:
this.removeEventListener(MouseEvent.MOUSE_MOVE, this_mouseMoveHandler);
надо
Код AS3:
stage.removeEventListener(MouseEvent.MOUSE_MOVE, this_mouseMoveHandler);

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

Регистрация: Mar 2013
Сообщений: 1,864
Rivexe я опять внимания не обратил))) Спасибо!
Не знаю на сколько правильно ( очень надеюсь , что правильность прокомментируют ) но работает.
Код AS3:
package 
{
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
 
	public class Drag extends Sprite 
	{
		private var _container:Sprite;
 
		private var _spriteArray:Vector.<Sprite>;
 
		private var _conteinersArray:Vector.<Sprite>;
 
		private var _distantion:Point;
		private var _target:Sprite;
 
		private var _maxX:int;
		private var _maxY:int;
		private var _minX:int;
		private var _minY:int;
 
		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);
 
			_conteinersArray = Vector.<Sprite>([]);
 
			this.addEventListener(MouseEvent.MOUSE_DOWN, this_mouseDownHandler);
			_container = new Sprite();
			_conteinersArray.push(_container);
			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);
			}
 
			_maxX = this.width;
			_maxY = this.height;
 
			_minX = this.width - this.width;
			_minY = this.height - this.height;
 
		}
 
		private function this_mouseDownHandler(event:MouseEvent):void 
		{
			if (_conteinersArray.indexOf(event.target > 0))
			{
				this.addEventListener(MouseEvent.MOUSE_UP, this_mouseUpHandler);
				stage.addEventListener(MouseEvent.MOUSE_MOVE, this_mouseMoveHandler);
				_target = event.target.parent as Sprite;
				_distantion = new Point(event.localX, event.localY);
			}
		}
 
		private function this_mouseUpHandler(event:MouseEvent):void 
		{
			this.removeEventListener(MouseEvent.MOUSE_UP, this_mouseUpHandler);
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, this_mouseMoveHandler);
		}
		private function this_mouseMoveHandler(event:MouseEvent):void 
		{
			if (mouseX > _maxX || mouseX < _minX || mouseY > _maxY || mouseY < _minY) 
			{
				stage.removeEventListener(MouseEvent.MOUSE_MOVE, this_mouseMoveHandler);
				this.removeEventListener(MouseEvent.MOUSE_UP, this_mouseUpHandler);
				_target = null;
				_distantion = null;
				return;
			}
			_target.x =  mouseX - _distantion.x;
			_target.y = mouseY - _distantion.y;
			event.updateAfterEvent();
		}
 
	}
 
}

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

Регистрация: Jan 2012
Сообщений: 97
Цитата:
Сообщение от Akopalipsis Посмотреть сообщение
Rivexe я опять внимания не обратил))) Спасибо!
Не знаю на сколько правильно ( очень надеюсь , что правильность прокомментируют ) но работает.
Код AS3:
package 
{
	import flash.display.DisplayObject;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Point;
 
	public class Drag extends Sprite 
	{
		private var _container:Sprite;
 
		private var _spriteArray:Vector.<Sprite>;
 
		private var _conteinersArray:Vector.<Sprite>;
 
		private var _distantion:Point;
		private var _target:Sprite;
 
		private var _maxX:int;
		private var _maxY:int;
		private var _minX:int;
		private var _minY:int;
 
		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);
 
			_conteinersArray = Vector.<Sprite>([]);
 
			this.addEventListener(MouseEvent.MOUSE_DOWN, this_mouseDownHandler);
			_container = new Sprite();
			_conteinersArray.push(_container);
			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);
			}
 
			_maxX = this.width;
			_maxY = this.height;
 
			_minX = this.width - this.width;
			_minY = this.height - this.height;
 
		}
 
		private function this_mouseDownHandler(event:MouseEvent):void 
		{
			if (_conteinersArray.indexOf(event.target > 0))
			{
				this.addEventListener(MouseEvent.MOUSE_UP, this_mouseUpHandler);
				stage.addEventListener(MouseEvent.MOUSE_MOVE, this_mouseMoveHandler);
				_target = event.target.parent as Sprite;
				_distantion = new Point(event.localX, event.localY);
			}
		}
 
		private function this_mouseUpHandler(event:MouseEvent):void 
		{
			this.removeEventListener(MouseEvent.MOUSE_UP, this_mouseUpHandler);
			stage.removeEventListener(MouseEvent.MOUSE_MOVE, this_mouseMoveHandler);
		}
		private function this_mouseMoveHandler(event:MouseEvent):void 
		{
			if (mouseX > _maxX || mouseX < _minX || mouseY > _maxY || mouseY < _minY) 
			{
				stage.removeEventListener(MouseEvent.MOUSE_MOVE, this_mouseMoveHandler);
				this.removeEventListener(MouseEvent.MOUSE_UP, this_mouseUpHandler);
				_target = null;
				_distantion = null;
				return;
			}
			_target.x =  mouseX - _distantion.x;
			_target.y = mouseY - _distantion.y;
			event.updateAfterEvent();
		}
 
	}
 
}
примерно так и я сделал, разве что переменных столько не объявлял, мне не нравится такое решение, но наверно по другому не как не выйдет, ладно спасибо пусть так и будет

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

Регистрация: Dec 2012
Сообщений: 39
Попробуйте еще слушать вот это --
Код AS3:
 
stage.addEventListener(Event.MOUSE_LEAVE,leaveStage);
 
private function leaveStage(e:Event):void 
{
     //сработает когда курсор покинет флешку
}
параллельно можно менять булеву переменную - что ложь - если курсор за пределами,
истина если в границах сцены, и действовать в зависимости от этого


Последний раз редактировалось temp; 27.09.2013 в 20:27. Причина: поставил лишнюю "}" ;-)
Старый 27.09.2013, 20:37
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 26  
Ответить с цитированием
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
temp Спасибо! я помню, что есть какое то событие, которое за выход за сцену отвечает. Искал его, но в событиях мыши. Жалко, что нет события отвечающего за выход за рамку...

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

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

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


 


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


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