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

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

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

Регистрация: Aug 2009
Сообщений: 12
По умолчанию как можно указать границы перемещения в senocular TransformTool

Кто нибудь знает, как можно указать границы перемещения в senocular TransformTool
А то нашел ограничители поворота и размера. а передвижения нет...

Старый 25.09.2009, 23:49
flash33 вне форума Посмотреть профиль Отправить личное сообщение для flash33 Найти все сообщения от flash33
  № 2  
Ответить с цитированием
flash33
 
Аватар для flash33

Регистрация: Nov 2005
Сообщений: 1,155
Проверкой по событию CONTROL_MOVE
К примеру ваш transformTool
Код AS3:
transformTool.addEventListener(TransformTool.CONTROL_MOVE, onMoveEvent);
function onMoveEvent(event){
   if (transformTool.target.x>maxXPos) transformTool.target.x = maxXPos;
}
Надеюсь принцип ясен?

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

Регистрация: Aug 2009
Сообщений: 12
Спасибо. Буду копаться в этом направлении. Упустил, что он эвенты шлет )

Добавлено через 1 час 49 минут
Ответ где то глубже...

Проверка проходит, transformTool.target.x присваивается нужное значение, однако объект остается на месте и при следующем движении мышки возвращает былое значение.

например


Код AS3:
	var currentPoint:Point=defaultTool.target.localToGlobal(zeroPoint);
 
	trace(defaultTool.target.x, currentPoint); // 490 (x=506, y=558)
 
	if (defaultTool.target.x > x2) {
		trace("1.",defaultTool.target.x); // 1. 490
		defaultTool.target.x=x2;
		trace("2.",defaultTool.target.x); // 2. 454
	}
однако на следующем витке (trace)
489 (x=505, y=558)
1. 489
2. 454

И так всегда. defaultTool.target.x=x2 - не помогает. что поможет?

Добавлено через 2 часа 36 минут
Нашел выход через Матрицы

Код AS3:
var tMatrix:Matrix = defaultTool.toolMatrix;
	if (defaultTool.target.x>x2) {
		tMatrix.tx = x2;
		defaultTool.toolMatrix = tMatrix;
	}
Таким образом он работает кривовато. мечется при передвижении постоянно от мышки до указанного края и может при маус ап оставаться где угодно из двух локаций. Кто нибудь знает как это решить?


Последний раз редактировалось acid_lab; 26.09.2009 в 16:19. Причина: код подправил
Старый 26.09.2009, 18:17
flash33 вне форума Посмотреть профиль Отправить личное сообщение для flash33 Найти все сообщения от flash33
  № 4  
Ответить с цитированием
flash33
 
Аватар для flash33

Регистрация: Nov 2005
Сообщений: 1,155
Код AS3:
import com.senocular.display.*;
 
var transformTool = new TransformTool();
addChild(transformTool);
transformTool.target = mc;
var maxXPos = 200;
transformTool.addEventListener(TransformTool.TRANSFORM_TARGET, onMoveEvent);
function onMoveEvent(event){
	if (event.target.target.x>maxXPos) {	  
	   event.target.target.x = maxXPos;
	   event.target.target = null;
	   event.target.target = mc;
   }
}
Сорри за предыдущую подсказку, писал без проверки

Старый 27.09.2009, 12:32
acid_lab вне форума Посмотреть профиль Отправить личное сообщение для acid_lab Найти все сообщения от acid_lab
  № 5  
Ответить с цитированием
acid_lab

Регистрация: Aug 2009
Сообщений: 12
Но насколько я понимаю, теперь как только мыш попытается забрать объект из наших границ - объект просто будет брошен на данной границе и действие прекратиться. Правильно? ) Эт не есть хорошо. Есть другой выход? Или переписывать библиотеку?

Добавлено через 1 час 31 минуту
Вобщем оптимально это решается действительно самой сменой библиотеки.

Если кому надо решение - добавляем и переписываем TransformTool.as:

Код AS3:
		private var _maxX1:Number = 0;
		private var _maxY1:Number = 0;
		private var _maxX2:Number = Infinity;
		private var _maxY2:Number = Infinity;
 
//..........
 
		public function get maxX1():Number { return _maxX1;	}
		public function set maxX1(n:Number):void { 	_maxX1 = n;	}
		public function get maxY1():Number { return _maxY1;	}
		public function set maxY1(n:Number):void { 	_maxY1 = n;	}
		public function get maxY2():Number { return _maxY2;	}
		public function set maxY2(n:Number):void { 	_maxY2 = n;	}
		public function get maxX2():Number { return _maxX2;	}
		public function set maxX2(n:Number):void { 	_maxX2 = n;	}
 
//.....................
 
		private function enforceLimits():void {
 
			var currScale:Number;
			var angle:Number;
			var enforced:Boolean = false;
 
			// use global matrix
			var _globalMatrix:Matrix = _toolMatrix.clone();
			_globalMatrix.concat(transform.concatenatedMatrix);
 
			// check current scale in X
			currScale = Math.sqrt(_globalMatrix.a * _globalMatrix.a + _globalMatrix.b * _globalMatrix.b);
			if (currScale > _maxScaleX) {
				// set scaleX to no greater than _maxScaleX
				angle = Math.atan2(_globalMatrix.b, _globalMatrix.a);
				_globalMatrix.a = Math.cos(angle) * _maxScaleX;
				_globalMatrix.b = Math.sin(angle) * _maxScaleX;
				enforced = true;
			}
 
			// check current scale in Y
			currScale = Math.sqrt(_globalMatrix.c * _globalMatrix.c + _globalMatrix.d * _globalMatrix.d);
			if (currScale > _maxScaleY) {
				// set scaleY to no greater than _maxScaleY
				angle= Math.atan2(_globalMatrix.c, _globalMatrix.d);
				_globalMatrix.d = Math.cos(angle) * _maxScaleY;
				_globalMatrix.c = Math.sin(angle) * _maxScaleY;
				enforced = true;
			}
 
 
			if (_globalMatrix.tx < _maxX1) {
				_globalMatrix.tx = _maxX1;
				enforced = true;
			}
 
			if (_globalMatrix.tx > _maxX2) {
				_globalMatrix.tx = _maxX2;
				enforced = true;
			}
 
			if (_globalMatrix.ty < _maxY1) {
				_globalMatrix.ty = _maxY1;
				enforced = true;
			}
 
			if (_globalMatrix.ty > _maxY2) {
				_globalMatrix.ty = _maxY2;
				enforced = true;
			}
 
 
 
			// if scale was enforced, apply to _toolMatrix
			if (enforced) {
				_toolMatrix = _globalMatrix;
				var current:Matrix = transform.concatenatedMatrix;
				current.invert();
				_toolMatrix.concat(current);
			}
		}


Последний раз редактировалось acid_lab; 27.09.2009 в 14:06.
Старый 27.09.2009, 15:34
flash33 вне форума Посмотреть профиль Отправить личное сообщение для flash33 Найти все сообщения от flash33
  № 6  
Ответить с цитированием
flash33
 
Аватар для flash33

Регистрация: Nov 2005
Сообщений: 1,155
Можно и так, просто я никогда особо не заморачивался с рестриктом положений. А насчет прекращения действий что вы имели в виду? Ничего не прекращается вроде, двигайте дальше, (в другую сторон) если пожелаете

Старый 27.09.2009, 16:00
acid_lab вне форума Посмотреть профиль Отправить личное сообщение для acid_lab Найти все сообщения от acid_lab
  № 7  
Ответить с цитированием
acid_lab

Регистрация: Aug 2009
Сообщений: 12
Есть проблема и в твоем и в моем скрипте.

Пока дело касается перемещения - все хорошо. Но если на краю начинаются действия (повороты или скалирование) то мой вариант перекидывает объект куда непонятно, а твой весит намертво приложение.

Будем искать решение дальше ))

При скалировании вроде нормально. Но при повороте -
Error: Error #2094: Event dispatch recursion overflow.
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/set target()
at ob_holder/onMoveEventX()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/apply()
at com.senocular.display::TransformTool/setupInteraction()
at com.senocular.display::TransformTool/startInteractionHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/set target()
at ob_holder/onMoveEventX()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/apply()
at com.senocular.display::TransformTool/setupInteraction()
at com.senocular.display::TransformTool/startInteractionHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/set target()
at ob_holder/onMoveEventX()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/apply()
at com.senocular.display::TransformTool/setupInteraction()
at com.senocular.display::TransformTool/startInteractionHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/set target()
at ob_holder/onMoveEventX()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/apply()
at com.senocular.display::TransformTool/setupInteraction()
at com.senocular.display::TransformTool/startInteractionHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/set target()
at ob_holder/onMoveEventX()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/apply()
at com.senocular.display::TransformTool/setupInteraction()
at com.senocular.display::TransformTool/startInteractionHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/set target()
at ob_holder/onMoveEventX()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/apply()
at com.senocular.display::TransformTool/setupInteraction()
at com.senocular.display::TransformTool/startInteractionHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/set target()
at ob_holder/onMoveEventX()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at com.senocular.display::TransformTool/apply()
at com.senocular.display::TransformTool/setupInteraction()
at com.senocular.display::TransformTool/startInteractionHandler()
at flash.events::EventDispatcher/dispatchEventFunction()

Где то циклит


Последний раз редактировалось acid_lab; 27.09.2009 в 16:07.
Старый 27.09.2009, 16:23
flash33 вне форума Посмотреть профиль Отправить личное сообщение для flash33 Найти все сообщения от flash33
  № 8  
Ответить с цитированием
flash33
 
Аватар для flash33

Регистрация: Nov 2005
Сообщений: 1,155
Глюки не в моем скрипте , а в кривой реализации скью в самом инструменте. Вот попробуй поиграть с моим скриптом и с голым трансом и убедись что лажа от рестрикта не зависит. А что он глючный - это давно известно
Вложения
Тип файла: rar testTool.rar (28.2 Кб, 54 просмотров)

Старый 27.09.2009, 16:32
acid_lab вне форума Посмотреть профиль Отправить личное сообщение для acid_lab Найти все сообщения от acid_lab
  № 9  
Ответить с цитированием
acid_lab

Регистрация: Aug 2009
Сообщений: 12
Спасибо. Покопаемся

Добавлено через 7 минут
У тебя там граница съезжает в зависимости от изменений параметров объекта. Задача нерешаема ) Если вдруг придет идейка - то пиши )) Спасибо

Старый 27.09.2009, 16:57
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
http://code.google.com/p/e4xu/source...Transformer.as
Посмотри, мож пригодится... не довел еще до ума...
__________________
Hell is the possibility of sanity

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

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

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


 


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


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