greensock的transformManager还是很强大的,如果只是单纯实现鼠标操作变形的话,用起来也比较简单,创建一个实例,设置属性,然后把需要变形的元件addItem进去就可以了。
用Tweenlite的时候,往往一个to就够用了。但是在用transformManager的时候,经常需要加入一些限制或者扩展一些功能,实现起来就比较困难了。
之前就遇到过,选中的时候需要加入一个删除按钮,发现transformManager在MouseDown的时候就取消选择了,而我们一般都是要click才能删除,这样删除按钮就没办法和变形框同时消失。
限制变形区域比较简单,设置bounds属性就可以了。
限制缩放大小稍微麻烦一点,需要用TransformItem实例的setScaleConstraints方法。
其实最烦人的就是,要区分TransformManager,TransformItem,还有我们的DisplayObject,我们要不断的在这3个对象之间切换,所以很容易搞乱。
下面是重点,如何在使用TransformManager的同时,加入碰撞检测。
思路:
选中时,用变量trmLastState记录TransformManager的transform相关的属性(坐标,当前缩放比例,旋转角度);
变形时,先检测碰撞(用我们的DisplayObject),如果碰撞了,将TransformManager对象恢复到trmLastState状态(具体方法见下面源码),否则trmLastState记录TransformManager的当前状态。
具体代码:
package
{
import com.greensock.events.TransformEvent;
import com.greensock.transform.TransformItem;
import com.greensock.transform.TransformManager;
import flash.display.MovieClip;
import flash.geom.Rectangle;
public class Main extends MovieClip
{
public function Main()
{
// constructor code
var trm:TransformManager = new TransformManager();
trm.allowDelete = true;
trm.hideCenterHandle = true;
trm.scaleFromCenter = false;
trm.constrainScale = false;
trm.lockRotation = true;
trm.arrowKeysMove = true;
trm.allowDelete = false;
trm.addEventListener(TransformEvent.SCALE, onTransformHandler);
trm.addEventListener(TransformEvent.MOVE, onTransformHandler);
trm.addEventListener(TransformEvent.SELECTION_CHANGE, onTransformSelectionChange);
var clip1Item:TransformItem = trm.addItem(mc01);
var clip1Item2:TransformItem = trm.addItem(mc02);
var trmLastState:Object = {"sx": NaN, "sy": NaN, "mx": NaN, "my": NaN};
function onTransformHandler(e:TransformEvent):void
{
if (mc01.hitTestObject(mc02))
{
/*
//这样设置不行,属性是正确的,但是显示不对,应该是因为TransformManager里边是强制刷新的,这里如果想要改变显示状态,也要强制刷新才行。调用上面的方法来设置平移和缩放就可以了。
trm.selectionScaleX = trmLastState.sx;
trm.selectionScaleY = trmLastState.sy;
trm.selectionX = trmLastState.mx;
trm.selectionY = trmLastState.my;
trace(trmLastState.sx,trmLastState.sy,trmLastState.mx,trmLastState.my);
*/
}
else {
trmLastState.sx=trm.selectionScaleX;
trmLastState.sy=trm.selectionScaleY;
trmLastState.mx=trm.selectionX;
trmLastState.my=trm.selectionY;
}
}
function onTransformSelectionChange(event:TransformEvent):void
{
}
}
}
}效果如下,可以用鼠标拖动观察碰撞:
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。