您好!欢迎您光临坐标点的文字散射烟花效果_梅雪家园!

体育

I

交友

I

论坛

I

会员注册

I

本站搜索

I

收藏本站

当前位置:首页 >>>Flash教材>>>坐标点的文字散射烟花效果
坐标点的文字散射烟花效果
发表日期:2012/1/8 17:04:00 出处:未知 作者:未知 发布人:lv1211 已被访问 759

Flash as教程:文字散射效果

提示:这是个很妙的效果,说这句话是为了引起你的阅读兴趣,提供思路为主,以文字为例,更好的效果如把文字换成图片散射依照这个思路应当可以很完美的实现,同时,第三部分的BUG已经清除,所以我对本文章作下修改,谢谢各位的帮忙。

第一部分:同一坐标点散射,类似烟花效果

目标:大量文字从一个原点向四周散射

“大量”———————很显然,要用到duplicatemovieclip或者attachmovie,这里我选择attachmovie,至于

什么原因,以下我将阐述。
“散射”——————x,y偏移,结合Math.random()就是随机偏移.随机数的取值要有正且有负,因为散射是四面八方的X,Y偏移。
“一个原点”————这个效果的原理理解关键点就在这里,一个原点,换句话说就是将复制出来的MC坐标归于一个位置,这样任意一个x,y偏移值,播放起来就是一个散射,他不同于那种“不同坐标点散射”,即如果你把复制出来的坐标值随机设定,加上一个单纯的x,y偏移,MC会到处乱飞,画面会毫无规律。这一点一定要理解。

实现步骤

1,随便做个带文字的MC,在库中linkage名为mymc

2,舞台时间轴代码:

LEFT = 0;
TOP = 0;
RIGHT = Stage.width;
BOTTOM = Stage.height;
maxspeed=25
maxmc=100
minmc=20
function randrange(min,max){
       var randomnum=Math.floor(Math.random()*(max-min+1))+min
       return randomnum
}//自定义函数,取两数之间的随机数
mcnum=randrange(minmc,maxmc)
trace(mcnum)//测试用
for(i=0;i<=mcnum;i++){
dupmc=attachMovie("mymc","mymc"+i,10+i)
trace(dupmc)//测试用
dupmc._x=200
dupmc._y=200//设定同一个坐标位置
dupmc._xscale=dupmc._yscale=randrange(0,100)
dupmc.speedx=randrange(-maxspeed,maxspeed)
dupmc.speedy=randrange(-maxspeed,maxspeed)//每一个复制出来的MC都会有一个随机x,y偏移(从自己的负值到自身值,保证了坐标既有正也有负)
dupmc.onEnterFrame=function(){
       this._x+=this.speedx
       this._y+=this.speedy
        if (this._x < LEFT || this._x > RIGHT || this._y < TOP || this._y > BOTTOM) {
        this.removeMovieClip();
      }//end if
}
}

ok,代码结束,以下我谈谈我为什么不用duplicatemovieclip而用attachmovie
我们都知道把duplicatemovieclip或attachmovie前面加一个变量,很方便调整MC属性,书写也简单,但实

现方式有两种。
起初我是用duplicatemovieclip,前面设定了一个变量,即:
dupmc=duplicatemovieclip("mymc","mymc"+i,10+i)
trace(dupmc)//测试用
输出undefined,而换成attachmovie就能正常输出了
所以我选择了attachmovie,但说实在话,attachmovie也不是什么好鸟,MC一大,就会延迟进度,所以这是个问题,欢迎共同探讨,我就来抛砖引玉。

 

效果欣赏  源码下载

第二部分:不同坐标点的文字散射

目标:文字呈一种空间放射状散射出来,并不断循环,外加透明度,缩放比例动态调整塑造立体感,空间感。

要点:空间感和节奏感(动作执行有间隔,逐个出现并依次放射)
概念理解:MC内部时间轴的坐标系是制作空间感最好的坐标系,任何点无论在在哪个象限内,用坐标值乘

以一个递增的正变量,都可以达到放射的目的。
首先,得明白主时间轴和MC内部时间轴的坐标差别——————推出MC内部时间轴坐标特点:就是一个直角坐标系,中心为原点,分为四个象限,这正是我们所要的坐标系,因为我们要放射,坐标值的偏移应该有正有负,而在舞台的时间轴,画面只能显示_x>=0&&_y>=0的区域,是个不易操作的坐标系。下面来举个例子说明MC内部时间轴的坐标系是制作空间感最好的坐标系。
以一个公式开头(在头脑中画出高中数学的直角坐标系):

mymc._x = a*c
mymc._y = b*c

其中,a,b是坐标系中随机的一个点,它的x坐标为a,  y坐标为b, c是一个递增值。
那现在推算下是不是无论该点在哪个象限内,都可以达到放射的目的呢?

在第一象限:
a>0,b>0,c递增———X坐标不断增加,同时Y坐标也不断增加———放射

在第二象限:
a<0,b>0,c递增———X坐标不断递减,同时Y坐标不断增加———放射

在第三象限:
a<0,b<0,C递增———X坐标不断递减,同时Y坐标也不断递减———放射

在第四象限:
a>0,b<0,c递增———X坐标不断增加,同时Y坐标不断递减———放射

思路
首先,在限定范围内(最好小一点,为他的散射留出更多空间,这样会觉得字从很深的地方飘来,

以下我限定的是-10——9),为复制的MC设定一个随机位置,这就相当于我上面所举例子中的a和b,他们

其实是个坐标初值。
然后,要达到放射效果,还需要一个递增的正变量,即c,

所以我打了个字,转换成了MC,再次转换,命名为mymc,并延长至第3祯,新建一AS层。
为了让要出现的东西依次出现(既可以体现节奏感,又可以防止文字重叠现象),我选择祯循环的编程方式。

第一祯:设一些要用到的变量初值

mymc._alpha = 0;
i = 1;
numOfText = 20;
minOfZ = 1;
maxOfZ= 120;

第二祯:主程序

function randrange(min,max){
       var randomnum=Math.floor(Math.random()*(max-min+1))+min
       return randomnum
}//自定义函数,取两数之间的随机数
duplicateMovieClip("mymc", i, i);
this[i].x = randrange(-11,9);
this[i].y = randrange(-10,9)//我选择的初始坐标范围是-10到9
this[i].z = random(maxOfZ)+1;//1——120之间的整数
this[i].dz = -2;
this[i].gotoAndStop(random(this[i]._totalframes)+1);
this[i].onEnterFrame = function() {
       this.z += this.dz;//做加速运动
       if (this.z<minOfZ) {
              this.x = randrange(-11,9);
                            this.y = randrange(-10,9)//这里的this也可以改为this[i]
              this.z = maxOfZ;//this.z<minOfZindex时,也就是MC到达极限透明度,X,Y,比例

时,此时他已经超出了舞台,要不间断播放,需要重新设定他的初值
       }
       this.pers =600/this.z;//由于每次减2,所以this.z最小值为2,因为再减2就为0了,小于1
       this._x = this.x*this.pers;
       this._y = this.y*this.pers;//this.pers会越逐渐递增
       this._xscale = this._yscale=this.pers;
       this._alpha = 1000/this.z;//这里的1000你也可以改,不过别太小
};

第三祯:条件判断

i++;
if (i>=numOfText) {
       stop();//停在第二祯
}else{
       gotoAndPlay(_currentframe-1);
}

顺便提一下,我们要的c就是代码中的this.pers=600/this.z,他是个递增函数,且恒正。

很简单吧,测试下,思考下,也许你会比我想到的更多。

效果欣赏  源码下载

第三部分:XML控制散射内容

目标

我们先前散射出来的内容是固定的,在经典里前不久看到一篇帖子,说如何用XML控制显示内容,所以特来介绍。

思路

简单的XML载入

步骤

1,把第二部分中包含三祯的MC删除,重建一个MC,实例名为mymc,在内部拉一动态文本框,实例名为mytxt,变量名为content,这里要注意,这也就是我起先出现BUG的关键点所在,一定要设“嵌入字体”,把a-z,A-Z,0-9都嵌入进去,至于原因,蓝紫光解释得很清楚。

2,在MYMC内部时间轴加动作,我们荏苒采用祯循环方式变成

第一祯:定义初始变量,载入XML文件并取节点值

stop();
mymc._alpha = 0;
i = 1;
numOfText = 20;
minOfZ = 1;
maxOfZ= 120;
var myxml=new XML()
myxml.ignoreWhite=true
myxml.onLoad=function(suc){
       if(suc){
       gotoAndPlay(2);
             mylist=this.firstChild.childNodes
              }
       }
myxml.load("myxml.xml")

第二祯:主程序

function randrange(min,max){
       var randomnum=Math.floor(Math.random()*(max-min+1))+min
       return randomnum
}//自定义函数,取两数之间的随机数
duplicateMovieClip("mymc", i, 10+i);
this[i].x = randrange(-11,9);
this[i].y = randrange(-10,9)
this[i].z = random(maxOfZ)+1;//1——120之间的整数
this[i].dz = -4;
this[i].mytxt.text=mylist[i].attributes.content
this[i].onEnterFrame = function() {
       this.z += this.dz;
       if (this.z<minOfZ) {
              this.x = randrange(-11,9);
        this.y = randrange(-10,9)//这里的this也可以改为this[i]
              this.z = maxOfZ;//this.z<minOfZindex时,也就是MC到达极限透明度,X,Y,比例

时,此时他已经超出了舞台,要不间断播放,需要重新设定他的初值
       }
       this.pers =600/this.z;//由于每次减2,所以this.z最小值为2,因为再减2就为0了,小于1
       this._x = this.x*this.pers;
       this._y = this.y*this.pers;//this.pers会越逐渐递增
      
       this._xscale = this._yscale=this.pers;
       this._alpha = 1000/this.z;//这里的1000你也可以改,不过别太小

第三祯:条件判断

i++;
if (i>=mylist.length) {
       stop();
}else{
       gotoAndPlay(_currentframe-1);
}

注意点:载入延迟问题解决方案

第一祯代码我为什么要加个stop();,然后通过条件判断myxml.onLoad执行gotoAndPlay(2);?
还是一个载入延迟问题,参考 我的一篇帖子 ,和loadmovie差不多,如果我不加个STOP,影片就会从1到3毫无障碍地播放,由于XML载入的延迟性,在XML文件还没载入完毕之前(一般是一轮,从1到3播放完毕一遍的时间)所执行的程序里面根本无法取得节点,则mylist也将是NaN,那么紧跟的第二祯里面this[i].mytxt.text=mylist[i].attributes.content取不到值,文本内容会是undefined,也就是说不按我那样弄的话的直接后果将是所载入的MC中有一个文本内容为undefined。

欣赏地址:由于有XML,无法欣赏

源码下载

后续:我只是以文字形式具体讲解了散射特效,你可以把文字换成图片并用XML载入,鼠标控制空间移动,等等,需要我们共同去想。

[NextPage]

flash传参问题总结

今天有人问我FLASH传参的问题,即如何用loadMovieNum调用外部SWF文件的变量,现在想借此总结下,以免哪天我失忆给忘掉了。

假设主影片想载入外部影片myswf.swf并调用其舞台的一个变量bianliang,我赋值22
顺着提问者的要求,我用
loadMovieNum("myswf.swf",5["POST"])
trace(_level5.bianliang)
结果呢,undefined

纳闷了,没道理啊,我用onEnterFrame事件输出即
_root.onEnterFrame=function(){
   trace(_level5.bianliang)
}

输出为:undefined
       22
       22
       。
        。
        。

似乎明白了一点,为什么第一次输出是undefined,而后却正常呢


初步猜测:是第一次输出时SWF文件还没有载入完毕,所以是undefined
那该如何解决呢,该如何准确调用我想要的变量呢

于是想到了用movieClipLoader的loadClip方法,监视加载进度,当onLoadInit时执行trace
代码如下:
var myML=new movieClipLoader()
myML.addListener(this)
this.onLoadInit=function(){
   trace(_level5.bianliang)
}
myML.loadClip("myswf.swf",5,"POST")



所以在此强烈建议用movieClipLoader的loadClip方法传递外部FLASH参数
也许loadmovienum可以达到同样效果,只是我没发现,有其他想法的也可以补充上来,大家共同学习!!

最后添加一个问题,也是在解决那位朋友问题中会到的一个很棘手问题,如下:影片老是冲不过第三祯,举个例子,我在第一祯写入gotoAndPlay(4),在第三祯写入trace(“3”),在第四祯写入trace(“4”),测试输出3,但我单独新建一个影片,是正常的,请问有哪些因素会导致冲不过第三祯。

双击自动滚屏 【打印本页】 【关闭窗口
 相关评论:

没有相关评论

 发表评论:

身份选择:会员 游客(游客不需要输入密码)
用 户 名: 密 码:
评论内容:
(最多评论字数:500)

梅雪家园 | 设为首页 | 加入收藏 | 联系我们 | 进入管理 | 关于站长 | 本站搜索

联系电话:13805696928 联系人:倾城一刀

琼icp备09005167