Flash好看的跟随鼠标的旋转星星 |
第一步: 打开FLASH,新建一个影片剪辑元件,命名为“星星”,在里面绘制一个星星出来,而且把它的 核心点和舞台注册点对齐,在第20帧和第40处各插入一个 要害帧 。选中第20帧,在它的 核心点和舞台的注册点对齐的状况下按住SHIFT键进行等比例缩短(你认为差不多就行了), 而后选中第1到20帧的任意一帧 缔造补间动画, 打开属性面板把它的转调成逆时针,选中第20到40帧的任意一帧 缔造补间动画, 打开属性面板把它的转调成顺时针 。 第二步: 在新建一个影片剪辑元件,命名为“转圈的星星”,在图层面板的地方找到“增加运动 疏导层”增加一个 疏导层出来,在选中该图层的状况下按住AIT+SHIFT键在舞台上绘制一个有边框无填充色的圆(大小你认为 合适就OK), 而后用鼠标圈住它的丝毫边选中后删除(这样做是给它一缺口),选中绘制好的圆,把它的左和上对齐舞台 核心的注册点,选中第40帧处增加一个帧,锁定该图层, 取舍第一个图层把我们库中的星星拖进来并把它的 核心点对齐 疏导层中圆的上边的那个缺口的地方,选中第四十帧插入一个 要害帧把它的 核心点对齐 疏导层中圆的下边的那个缺口的地方 。回到舞台,把库中转圈的星星放到舞台任意位置,并给它一个实例名称mc 。 第三步: 接续插入一个影片剪辑元件,命名为“as",选中第一帧增加以下代码: var k:Number=64;//用来定义星星的个数; var n:Number=16;//用来定义一圈星星的个数; var r:Number=2;X坐标和Y坐标的缓动,值越大尾随鼠标移动时就越慢; for(var i=1;i<=k;i++){ duplicateMovieClip("_root.mc","mc"+i,i); setProperty("_root.mc"+i,_rotation,360/n*i); setProperty("_root.mc"+i,_alpha,100/k*i); } setProperty(_root.mc,_visible,0); 选中第二帧处插入一个空白 要害帧增加以下代码: for(var j=1;j<=k;j++){ setProperty("_root.mc"+j,_x,_root["mc"+j]._x+(_root["mc"+(j-1)]._x-_root["mc"+j]._x)/r); setProperty("_root.mc"+j,_y,_root["mc"+j]._y+(_root["mc"+(j-1)]._y-_root["mc"+j]._y)/r); } 选中第三帧处插入一个空白 要害帧增加以下代码: gotoAndPlay(2); 增加完代码以后回到主场景; 第四步: 把库中名为as的元件拖放到舞台上,给它一个实例名称mc0.在主场景内增加一个图层在第一帧外加拖动代码: startDrag("_root.mc0",true); 留神这里是mc0不是mc, 固然你拖动的影片里面没有东西,在下面我后细说的; 做到现在就算 竣工了,我在这里就把重点的地方说一下 。N为何是它的一圈星星的个数 在第一个for循环语句里有这样一段, setProperty("_root.mc"+i,_rotation,360/n*i); 看它的_rotation的值是360/n*i 也便是"_root.mc"+i,_rotation=360/16*i 也便是 _root.mc1._rotation=360/16*1 _root.mc2._rotation=360/16*2 _root.mc3._rotation=360/16*3 _root.mc4._rotation=360/16*4 _root.mc5._rotation=360/16*5 _root.mc6._rotation=360/16*6 _root.mc7._rotation=360/16*7 _root.mc8._rotation=360/16*8 _root.mc9._rotation=360/16*9 _root.mc10._rotation=360/16*10 .............._root.mc64._rotation=360/16*64 也便是说把360度 均匀分成16份,它们的角度便是这个值,360/16=22.5 。 第一个MC的角度是从原MC角度22.5的地方开始复制出来的,第二个MC的角度是从原MC角度45的地方开始复制出来的,第三个MC的角度是从原MC角度67.5的地方开始复制出来的,直到乘到17的时候就重叠了,由于360/16*6=382.5,角最大值是360,当到382.5的时候它就把360看成0来计算了, 后果便是22.5,当你把N的值调大的时候, 比方36它就会有36个星星围成一圈了,360/36*i 也便是mc1角度是10*1,mc2的角度是10*2 ,mc3的角度是10*3 当乘到37的时候它的角度多了10也便是370,第37个MC的角度会是原MC角度的370-360也便是10,这便是N的值等于一圈星星的缘由 。 我们在主场景第一帧里放的代码明明是拖动的MC0,为何MC复制出来的影片会跟着鼠标走,把在AS第二帧设置X、Y坐标的循环代码拿下来 综合一下: for(var j=1;j<=k;j++){ setProperty("_root.mc"+j,_x,_root["mc"+j]._x+(_root["mc"+(j-1)]._x-_root["mc"+j]._x)/2); setProperty("_root.mc"+j,_y,_root["mc"+j]._y+(_root["mc"+(j-1)]._y-_root["mc"+j]._y)/2); } 看它的X坐标, setProperty("_root.mc"+j,_x,_root["mc"+j]._x+(_root["mc"+(j-1)]._x-_root["mc"+j]._x)/2); setProperty这句话是说设置括号内( 指标, 指标的属性,该属性的值); 我们现在的 指标便是主场景上面的mc1,mc2,mc3,mc4,mc5......mc64; 它们的X坐标值各是多少,为何会尾随鼠标移动,我们来 细心地看下它们的值 _root.mc+i._x_root["mc"+j]._x+(_root["mc"+(j-1)]._x-_root["mc"+j]._x)/2 也便是 mc1._x=mc1._x+(mc+(j-1)._x-mc1._x)/2 假如mc1现在的坐标是300 也便是mc1._x=300+(mc+(j-1)._x-300)/2 现在我们已经得到两个数字了,还有一个mc+(j-1)._x,先算括号内,j-1第一次运行循环的时候j的值是1,便是1-1,也便是0;也便是mc+0,也便是mc0,也便是我们拖动的那个没有东西的影片剪辑 。mc0是跟着我们的鼠标动的,上面搞清晰后,我们就在给mc0也便是我们鼠标的坐标 假如一个值 。 随便设定一个我们就 假如100吧,值有了我们在接着做算术 。 mc1._x=300+(100-300)/2 也便是 mc1._x=300+负200/2 也便是 mc1._x=300+负100 // 留神下负值是越乘负的越多,越除负的越少,加减相反 也便是 mc1._x=200; 当计算机运行到这里时,mc1的坐标是200了,但200还不 相符我们所看到的 动机,我们运行的时候是它的坐标是跟着鼠标走的,那么程序会接着往下走,它就会执行设定MC2的坐标了,MC2的坐标会是250,接着是MC3的坐标是275,总之是越往下它们坐标的 间隔就会越小,你自己 可以测试下看 。 当循环完64次以后程序跳出循环了,那么就会TOGO到下一帧,执行gotoAndPlay(2); 又回来了,接着又是循环64次,代码还是 雷同的代码,不一样的是这次的坐标都是已经设置过的了,我们在看一下MC1现在的坐标是多少了,上次设置过后是200,那么现在是 mc1._x=200+(100-200)/2 也便是 150 这个坐标值会离鼠标越来越近的,直到和鼠标的坐标一样,那么 雷同后面的MC也一样会近,直到它们的坐标和鼠标相等为止,而且它们的坐标永远也不会小于鼠标的坐标 。 |