Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   как можно указать границы перемещения в senocular TransformTool (http://www.flasher.ru/forum/showthread.php?t=130444)

acid_lab 25.09.2009 22:53

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

flash33 25.09.2009 23:49

Проверкой по событию CONTROL_MOVE
К примеру ваш transformTool
Код AS3:

transformTool.addEventListener(TransformTool.CONTROL_MOVE, onMoveEvent);
function onMoveEvent(event){
  if (transformTool.target.x>maxXPos) transformTool.target.x = maxXPos;
}

Надеюсь принцип ясен?

acid_lab 26.09.2009 14:29

Спасибо. Буду копаться в этом направлении. Упустил, что он эвенты шлет )

Добавлено через 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;
        }

Таким образом он работает кривовато. мечется при передвижении постоянно от мышки до указанного края и может при маус ап оставаться где угодно из двух локаций. Кто нибудь знает как это решить?

flash33 26.09.2009 18:17

Код 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;
  }
}

Сорри за предыдущую подсказку, писал без проверки

acid_lab 27.09.2009 12:32

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

Добавлено через 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);
                        }
                }


flash33 27.09.2009 15:34

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

acid_lab 27.09.2009 16:00

Есть проблема и в твоем и в моем скрипте.

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

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

При скалировании вроде нормально. Но при повороте -
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()

Где то циклит

flash33 27.09.2009 16:23

Вложений: 1
Глюки не в моем скрипте , а в кривой реализации скью в самом инструменте. Вот попробуй поиграть с моим скриптом и с голым трансом и убедись что лажа от рестрикта не зависит. А что он глючный - это давно известно

acid_lab 27.09.2009 16:32

Спасибо. Покопаемся

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

wvxvw 27.09.2009 16:57

http://code.google.com/p/e4xu/source...Transformer.as
Посмотри, мож пригодится... не довел еще до ума...


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

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