`
hereson
  • 浏览: 1428042 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

变形实例-source

阅读更多

涂抹原理

橡皮擦原理

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());

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics