![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Aug 2009
Сообщений: 12
|
Кто нибудь знает, как можно указать границы перемещения в senocular TransformTool
А то нашел ограничители поворота и размера. а передвижения нет... |
|
|||||
|
Регистрация: Nov 2005
Сообщений: 1,155
|
Проверкой по событию CONTROL_MOVE
К примеру ваш transformTool Надеюсь принцип ясен? |
|
|||||
|
Регистрация: Aug 2009
Сообщений: 12
|
Спасибо. Буду копаться в этом направлении. Упустил, что он эвенты шлет )
Добавлено через 1 час 49 минут Ответ где то глубже... Проверка проходит, transformTool.target.x присваивается нужное значение, однако объект остается на месте и при следующем движении мышки возвращает былое значение. например 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 } 489 (x=505, y=558) 1. 489 2. 454 И так всегда. defaultTool.target.x=x2 - не помогает. что поможет? Добавлено через 2 часа 36 минут Нашел выход через Матрицы Таким образом он работает кривовато. мечется при передвижении постоянно от мышки до указанного края и может при маус ап оставаться где угодно из двух локаций. Кто нибудь знает как это решить? Последний раз редактировалось acid_lab; 26.09.2009 в 16:19. Причина: код подправил |
|
|||||
|
Регистрация: Nov 2005
Сообщений: 1,155
|
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; } } |
|
|||||
|
Регистрация: Aug 2009
Сообщений: 12
|
Но насколько я понимаю, теперь как только мыш попытается забрать объект из наших границ - объект просто будет брошен на данной границе и действие прекратиться. Правильно? ) Эт не есть хорошо. Есть другой выход? Или переписывать библиотеку?
Добавлено через 1 час 31 минуту Вобщем оптимально это решается действительно самой сменой библиотеки. Если кому надо решение - добавляем и переписываем TransformTool.as: 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. |
|
|||||
|
Регистрация: Nov 2005
Сообщений: 1,155
|
Можно и так, просто я никогда особо не заморачивался с рестриктом положений.
А насчет прекращения действий что вы имели в виду? Ничего не прекращается вроде, двигайте дальше, (в другую сторон) если пожелаете |
|
|||||
|
Регистрация: 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. |
|
|||||
|
Регистрация: Nov 2005
Сообщений: 1,155
|
Глюки не в моем скрипте , а в кривой реализации скью в самом инструменте. Вот попробуй поиграть с моим скриптом и с голым трансом и убедись что лажа от рестрикта не зависит. А что он глючный - это давно известно
|
|
|||||
|
Регистрация: Aug 2009
Сообщений: 12
|
Спасибо. Покопаемся
Добавлено через 7 минут У тебя там граница съезжает в зависимости от изменений параметров объекта. Задача нерешаема ) Если вдруг придет идейка - то пиши )) Спасибо |
|
|||||
|
Modus ponens
|
http://code.google.com/p/e4xu/source...Transformer.as
Посмотри, мож пригодится... не довел еще до ума...
__________________
Hell is the possibility of sanity |
![]() |
![]() |
Часовой пояс GMT +4, время: 23:10. |
|
|
« Предыдущая тема | Следующая тема » |
|
|