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

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

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

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
По умолчанию Drag не покидая пределов области

Есть такой пример.
Теперь представьте, что таскаемый квадрат (box1) раз в 10 больше и нужно также перемещать его, но чтобы его края все время были снаружи родительского контейнера (parentBox).
Что-то я всю голову сломал что в этих строках поменять, чтобы все сработало:
Код AS3:
box1.x = parentBox.mouseX - shiftX < 0 ? 0 : parentBox.mouseX - shiftX + box1.width > parentBox.width ? parentBox.width - box1.width : parentBox.mouseX - shiftX;
box1.y = parentBox.mouseY - shiftY < 0 ? 0 : parentBox.mouseY - shiftY + box1.height > parentBox.height ? parentBox.height - box1.height : parentBox.mouseY - shiftY;
__________________
In Code We Trust

Старый 04.09.2012, 18:33
DaFive вне форума Посмотреть профиль Отправить личное сообщение для DaFive Посетить домашнюю страницу DaFive Найти все сообщения от DaFive
  № 2  
Ответить с цитированием
DaFive
 
Аватар для DaFive

Регистрация: May 2008
Адрес: {0,0}
Сообщений: 754
Записей в блоге: 1
Отправить сообщение для DaFive с помощью ICQ
Эмм, немножко не понятно. Таскать его по серой области? Чтобы на белую не залезало?
__________________
Кодинг, багинг, алгоритминг. me @

Старый 04.09.2012, 18:38
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 3  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
я бы несколько иначе сделал драг, но если не трогать все остальное, то.

Код AS3:
private function onMoveInParentBox1(event:MouseEvent):void
		{
			var targetX : Number = parentBox.mouseX - shiftX;
			var targetY : Number = parentBox.mouseY - shiftY;
			var bounds : Rectangle = box1.getBounds(parentBox);
			var ownBounds : Rectangle = box1.getBounds(box1);
			var xDiff : Number = bounds.width - PARENT_SIZE;
			var yDiff : Number = bounds.height - PARENT_SIZE;
 
			bounds.x = targetX + ownBounds.x;
			bounds.y = targetY + ownBounds.y;
 
			if(bounds.x > 0)
			{
				targetX = -ownBounds.x;
			} 
			else if(bounds.x < -xDiff)
			{
				targetX = -xDiff - ownBounds.x;
			}
 
			if(bounds.y > 0)
			{
				targetY = -ownBounds.y;
			} 
			else if(bounds.y < -yDiff)
			{
				targetY = -yDiff - ownBounds.y;
			}
 
			box1.x = targetX;
			box1.y = targetY;
		}
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

Старый 04.09.2012, 19:00
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 4  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
ChuwY, спасибо, только что-то не так как нужно работает - резко от стенок левой и верхней отстает, а вверх, влево вообще меньше нуля не сдвигается.

Я поясню что нужно. Есть картинка в приложении (Flex mobile), она занимает все доступное ей пространство. Но экран маленький и я сделал зум (scale = 2). Теперь часть крупной картинки не видно за краями. Нужно её перетаскивать, чтобы можно было рассмотреть невидимые детали. Все нормально, но некрасиво когда картинка сдвигается и видно фон. Вот и хочу чтобы она сдвигалась не более краев видимой области.
__________________
In Code We Trust

Старый 04.09.2012, 19:03
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 5  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
Странно.
У меня все ок.
Вот пример того, как я, скорее всего, сделал бы:
Код AS3:
package
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.geom.Rectangle;
 
	[SWF(width="800", height="800")]
	public class dragTest extends Sprite
	{
		private static const PARENT_SIZE : Number = 50;
		private static const BOX_SIZE : Number = 300;
		//
		private var shiftX : Number;
		private var shiftY : Number;
		private var parentBox : Sprite;
		private var box1 : Sprite;
		private var prevPoint : Point;
		public function dragTest()
		{
			initBoxes();
			initListeners();
		}
 
		//*** private ***//
		private function initBoxes():void
		{
			parentBox = new Sprite();
			parentBox.graphics.beginFill(0x0, 0.5);
			parentBox.graphics.drawRect(0, 0, PARENT_SIZE, PARENT_SIZE);
 
			box1 = new Sprite();
			box1.graphics.beginFill(0x0, 0.5);
			box1.graphics.drawRect(50, 50, BOX_SIZE, BOX_SIZE);
 
			addChild(parentBox);
			addChild(box1);
 
			parentBox.x = (stage.stageWidth - parentBox.width)/2;
			parentBox.y = (stage.stageHeight - parentBox.height)/2;
 
			box1.x = (stage.stageWidth - box1.width)/2;
			box1.y = (stage.stageHeight - box1.height)/2;
		}
 
		private function initListeners():void
		{
			box1.addEventListener(MouseEvent.MOUSE_DOWN, onBox1MouseDown);
		}
 
		//*** handlers ***//	
		private function onBox1MouseDown(event:MouseEvent):void
		{
			prevPoint = new Point(stage.mouseX, stage.mouseY);
			stage.addEventListener(MouseEvent.MOUSE_UP,onMouseClick);
			stage.addEventListener(MouseEvent.MOUSE_MOVE,onMoveInParentBox1);
		}
 
		private function onMoveInParentBox1(event:MouseEvent):void
		{
			var currentPoint : Point = new Point(stage.mouseX, stage.mouseY);
			var diffPoint : Point = currentPoint.subtract(prevPoint);
			var bounds : Rectangle = box1.getBounds(parentBox);
			var ownBounds : Rectangle = box1.getBounds(box1);
			var xSizeDiff : Number = bounds.width - parentBox.width;
			var ySizeDiff : Number = bounds.height - parentBox.height;
 
			bounds.offsetPoint(diffPoint);
 
			if(bounds.x > 0)
			{
				bounds.x = 0;
			} 
			else if(bounds.x < -xSizeDiff)
			{
				bounds.x = -xSizeDiff;
			}
			if(bounds.y > 0)
			{
				bounds.y = 0;
			} 
			else if(bounds.y < -ySizeDiff)
			{
				bounds.y = -ySizeDiff;
			}
 
			box1.x = parentBox.x + bounds.x - ownBounds.x;
			box1.y = parentBox.y + bounds.y - ownBounds.y;
 
			prevPoint = currentPoint;
		}
 
		private function onMouseClick(event:MouseEvent):void
		{
			stage.removeEventListener(MouseEvent.MOUSE_UP,onMouseClick);
			stage.removeEventListener(MouseEvent.MOUSE_MOVE,onMoveInParentBox1);
		}
	}
}
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.


Последний раз редактировалось ChuwY; 04.09.2012 в 20:03.
Старый 04.09.2012, 19:30
Astraport вне форума Посмотреть профиль Отправить личное сообщение для Astraport Найти все сообщения от Astraport
  № 6  
Ответить с цитированием
Astraport
 
Аватар для Astraport

блогер
Регистрация: Sep 2009
Сообщений: 2,463
Записей в блоге: 2
Да, проверил, все отлично. Видимо это Flex чудит. Буду искать причину. О результатах сообщу дополнительно.
__________________
In Code We Trust

Старый 04.09.2012, 19:59
ChuwY вне форума Посмотреть профиль Отправить личное сообщение для ChuwY Посетить домашнюю страницу ChuwY Найти все сообщения от ChuwY
  № 7  
Ответить с цитированием
ChuwY
 
Аватар для ChuwY

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
А вот самый абстрактный вариант, что у меня получился
Для тех несуществующих случаев, когда изображение в обоих контейнерах может быть не на нулевых коррдинатах.

Код AS3:
private function onMoveInParentBox1(event:MouseEvent):void
		{
			var currentPoint : Point = new Point(stage.mouseX, stage.mouseY);
			var diff : Point = currentPoint.subtract(_prevPoint);
			var boxBound : Rectangle = box1.getBounds(stage);
			var parentBound : Rectangle = parentBox.getBounds(stage);
			var out : Point = new Point();
 
			boxBound.offsetPoint(diff);
 
			if(boxBound.containsRect(parentBound) == false)
			{
				var unionBound : Rectangle = parentBound.union(boxBound);
				var xMul : Number = unionBound.x < boxBound.x ? 1 : -1;
				var yMul : Number = unionBound.y < boxBound.y ? 1 : -1;
 
				out.x = (unionBound.width - boxBound.width) * xMul;
				out.y = (unionBound.height - boxBound.height) * yMul;
			}
 
			box1.x += diff.x - out.x;
			box1.y += diff.y - out.y;
 
			_prevPoint = currentPoint;
		}
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ"
Мои ачивки: художник-паразит.

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

Регистрация: Nov 2009
Сообщений: 176
итересно посмотреть как это будет выглядить с кругом или треугольником )))

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

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

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


 


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


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