涂抹原理
橡皮擦原理
import flash.geom.Point;
//产生多个图形
function crtShapes(_num:Number) {
for (var i:Number = 0; i<_num; i++) {
var line:MovieClip = _root.createEmptyMovieClip("line"+i, _root.getNextHighestDepth());
line.color_num = random(0xFFFFFF);
line.f_color_num = random(0xffffff);
line._rotation = random(360);
/**/
line.onEnterFrame = function() {
this._rotation++;
};
line._x = random(Stage.width);
line._y = random(Stage.height);
line.points = new Array();
crtDots(line, 10);
}
}
//产生每个图形的绘图坐标点序列
function crtDots(holder:MovieClip, _num:Number) {
var r:Number = 20+random(10);
var da:Number = Math.PI*2/(_num-1);
holder.points.push(new Point(r*Math.sin(da), r*Math.cos(da)));
for (var i:Number = 1; i<_num; i++) {
var temp_r:Number = r+random(5);
var ps:Point = new Point(temp_r*Math.sin(da*i), temp_r*Math.cos(da*i));
holder.points.push(ps);
}
drawShape(holder);
}
//绘制图形
function drawShape(_mc:MovieClip) {
_mc.clear();
_mc.lineStyle(1, _mc.color_num, 100);
_mc.beginFill(_mc.f_color_num, 50);
_mc.moveTo(_mc.points[0].x, _mc.points[0].y);
for (var i:Number = 1; i<_mc.points.length; i++) {
_mc.lineTo(_mc.points[i].x, _mc.points[i].y);
}
}
//利用mc1去涂抹mc2
function leave(mc1:MovieClip, mc2:MovieClip) {
if (mc1.hitTest(mc2)) {
//生成全局坐标序列pss
var c_pos:Point = mc1.pos.clone();
var pss:Array = new Array();
for (var i = 0; i<mc2.points.length; i++) {
var obj:Point = mc2.points[i].clone();
mc2.localToGlobal(obj);
pss.push(new Point(obj.x, obj.y));
}
//检查距离,同时生成被修改id序列
var change_id:Array = new Array();
for (var i = 0; i<pss.length; i++) {
var dis:Number = Point.distance(c_pos, pss[i]);
if (dis == 0) {
dis = .1;
}
if (dis<mc1.r) {
change_id.push(i);
if (mc1.type == "out") {
var rx:Number = (pss[i].x-c_pos.x)/dis;
var ry:Number = (pss[i].y-c_pos.y)/dis;
pss[i].x += (mc1.r-dis)*rx*mc1.a/5;
pss[i].y += (mc1.r-dis)*ry*mc1.a/5;
} else if (mc1.type == "in") {
var rx:Number = (pss[i].x-c_pos.x)/dis;
var ry:Number = (pss[i].y-c_pos.y)/dis;
pss[i].x -= (mc1.r-dis)*rx*mc1.a/5;
pss[i].y -= (mc1.r-dis)*ry*mc1.a/5;
} else if (mc1.type == "rotate") {
var angle:Number = Math.atan2(pss[i].x-c_pos.x, pss[i].y-c_pos.y);
var d_angle:Number = (mc1.r/dis-1)*(1-mc1.a)*.05+.02*mc1.a;
pss[i].x = c_pos.x+dis*Math.sin(angle+d_angle);
pss[i].y = c_pos.y+dis*Math.cos(angle+d_angle);
} else if (mc1.type == "rotate2") {
var angle:Number = Math.atan2(pss[i].x-c_pos.x, pss[i].y-c_pos.y);
var d_angle:Number = -(mc1.r/dis-1)*(1-mc1.a)*.05-.02*mc1.a;
pss[i].x = c_pos.x+dis*Math.sin(angle+d_angle);
pss[i].y = c_pos.y+dis*Math.cos(angle+d_angle);
}
//update temp_mc
temp_mc.moveTo(pss[i].x, pss[i].y);
temp_mc.lineTo(pss[i].x, pss[i].y+.5);
}
}
//将被改变的关键点坐标装化到mc2的local坐标,并回填到mc2的points中去
if (change_id.length) {
for (var i = 0; i<change_id.length; i++) {
var obj:Point = pss[change_id[i]].clone();
mc2.globalToLocal(obj);
mc2.points[change_id[i]] = new Point(obj.x, obj.y);
}
drawShape(mc2);
}
}
}
//涂抹初始化
function initDoub(_type:String, r:Number, a:Number) {
var doub:MovieClip = _root.createEmptyMovieClip("doub", _root.getNextHighestDepth());
doub.type = _type;
doub.r = r;
doub.a = a;
doub.lineStyle(r*2, 0, 20);
doub.lineTo(.5, 0);
doub.startDrag(true);
doub.onPress = function() {
mouse_down = true;
};
doub.onRelease = function() {
mouse_down = false;
temp_mc.clear();
};
doub.onEnterFrame = function() {
if (mouse_down) {
this.pos = new Point(this._x, this._y);
temp_mc.clear();
temp_mc.lineStyle(2, 0xFF0000);
for (i in _root) {
if (typeof (_root[i]) == "movieclip" && _root[i] != doub) {
leave(this, _root[i]);
}
}
}
};
}
//生成待变形形状
crtShapes(50);
//初始化涂抹工具 类型:_type:in/out/rotate/rotate2 半径:r 强度:a
initDoub("rotate", 100, .5);
//临时图层,显示被涂抹的关键点
_root.createEmptyMovieClip("temp_mc", _root.getNextHighestDepth());