鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 网站制作教程 > flash > >

ActionforFlash5:海浪效果

来源:互联网 作者:佚名 时间:2016-03-14 10:14
我的思路是这样的,先制作一个框架,里面包含一些物体,当鼠标指针定位在框架内部时,我想要框架内的物体有大小和透明度的变化,而且这种变化还可以依据鼠标指针和物件的距离变化而变化,另一方面,当鼠标移到框架之外时,我就要框架内的物件回到初始状态,

            
             
              
             
            

            



            

我的思路是这样的,先制作一个框架,里面包含一些物体,当鼠标指针定位在框架内部时,我想要框架内的物体有大小和透明度的变化,而且这种变化还可以依据鼠标指针和物件的距离变化而变化,另一方面,当鼠标移到框架之外时,我就要框架内的物件回到初始状态,就像海浪似的,汹涌澎湃的冲到岸上来,然后又缓缓的退了回去。好,请先下载源文件。


结构


打开源文件,在主场景里,你可以看到一个名为“01-boundingbox”的MC,在第一帧上有三条行为动作,因为有些浏览者会将Flash影片全屏观看或者拖动改变它的大小,这样会使的这个例子的效果不明显,为了防止这样,我们在第一帧上设置如下行为动作:


FS Command ("fullscreen", "false")


FS Command ("allowscale", "false")


Stop


在“01-boundingbox”里,你将看到三个层,包含一个空的MC,一个框架和一些物件,物件的名字为“column1”,这里也只有一帧,一个行为动作,包含一段代码,一个名为“dragscale”的MC的中心显示在场景里,这是必须的,我们将利用它确定鼠标指针和物件之间的距离:


Start Drag ("dragscale", lockcenter)


在“column1”里的第二帧,是至关紧要的行为动作,第三帧的简单的Action可以保证第二帧不断的反复运行。


Go to and Play (2)


你可以注意到这里有二十个层,第一层包括行为动作和静止的物件,另外的第一到第十九层都是静止的物件,这样可以保证鼠标指针在框架外部时物件不会变化大小,每一个物件都取了一个名字,从“text1”到“text19”。


在第二帧,你可以看到如下的Action:


Set Variable: "colnum" = 1


Set Variable: "startnum" = 1


Set Variable: "endnum" = 19


Set Variable: "numberofItems" = 19


Set Variable: "mouseposX" = Int ( GetProperty ( "../dragscale", _x ) )


Set Variable: "mouseposY" = Int ( GetProperty ( "../dragscale", _y ) )


Set Variable: "I" = startnum


Set Variable: "m" = startnum+1


Set Variable: "filledSpace" = 0


Set Variable: "gapspace" = 0


If (myInit = FALSE)


Loop While (I <= endnum)


Set Variable: "textY" & I = GetProperty ("text" & I, _y )


Set Variable: "I" = I + 1


End Loop


Set Variable: "I" = startnum


Set Variable: "myInit" = TRUE


End If


Set Variable: "boundleft" = GetProperty ("../boundbox" & colnum, _x)


Set Variable: "boundright" = boundleft + GetProperty ("../boundbox" & colnum, _width)


Set Variable: "boundtop" = GetProperty ("../boundbox" & colnum, _y)


Set Variable: "boundbottom" = boundtop + GetProperty ("../boundbox" & colnum,_height)


第一个变量是指框架的数目,因此,我们定位在框架里的第一个“column1”,下面三个变量指第一个物件和最后一个物件,以及所有物件的数目,我们确定鼠标指针相关的两个变量“mouseposX”当前所在的X轴位置和“mouseposY”当前所在的Y轴位置,此外,我们要计数循环的次数,命名为“I”和“m”。最后,我们重新安排两个变量,“filledSpace”和“gapSpace”,我们将在后面讨论它们。


既然我们想要物件有一个原始的位置,我们需要建立一个数组,来保存这些原始的数值。当我们将每个物件的垂直位置都存储以后,我们将重新设置“I”以便保证行为动作只执行一次,设置“myInit”为真,如果“myInit”为假,则Action不执行。这里要提及的是,我们只需要物件的比例和透明度值变化,如果鼠标在框架内部,我们就得知道边界在哪里,下面四个变量将存储这些值。最后我们就得有两种变化,鼠标的位置在框架外面还是框架里面。好,接着我们就有了下面的代码:


If (mouseposX>= boundleft and mouseposX <= boundright and mouseposY>= boundtop and mouseposY <= boundbottom)


Loop While (I <= endnum)


Set Variable: "myDif" = (EVAL("textY" & I) ) - (mouseposY-boundtop)


Set Variable: "scaleAmount" = 250 - ((myDif*myDif) /16)


Set Variable: "alphaAmount" = 100 - ((myDif*myDif) / 6)


If (scaleAmount <100)


Set Variable: "scaleAmount" = 100


End If


If (alphaAmount <50)


Set Variable: "alphaAmount" = 50


End If


Set Property ("text" & I, X Scale) = scaleAmount


Set Property ("text" & I, Y Scale) = scaleAmount


Set Property ("text" & I, Alpha) = alphaAmount


Set Variable: "I" = I + 1


End Loop


Loop While (m <= endnum - 1)


Set Variable: "filledSpace" = filledSpace + GetProperty ( "text" & m, _height)


Set Variable: "m" = m + 1


End Loop


Set Variable: "totalheight" = GetProperty ( "text" & endnum, _y) - GetProperty ( "text" & startnum, _y)


Set Variable: "gapSpace" = totalheight - filledSpace


Set Variable: "avgDistance" = gapSpace / numberofitems


Set Variable: "m" = startnum + 1


Loop While (m <= endnum - 1)


Set Property ("text" & m, Y Position) = (GetProperty ( "text" & (m-1), _y) + GetProperty ( "text" & (m-1), _height)) + avgdistance


Set Variable: "m" = m + 1


End Loop


首先,如果鼠标在框架内部,我们就需要计算每一个物件和鼠标指针之间的距离,这将是一个多次的循环计算,我们首先得确定鼠标与顶部的距离,这是必须的,因为每一个物件和鼠标的距离都不一样,物件和鼠标的距离就是物件的垂直高度减去鼠标离顶部的高度,我们可以计算出来。当我们计算出了鼠标与物件的距离后,我们可以利用这个值“myDif”来确定物件的比例和透明度的值,你可以看到“scaleAmount”这个变量,注意到它是依靠“myDif”值变化的,如果“myDif”值为零,那么“scaleAmount”值为250(最大),“myDif”值越大,“scaleAmount”值越小,即距离越远,变化就越小,而“myDif”是一个正方形区域,所以鼠标周围的变化也是对称的。举个例子,有两个物件,“myDif”等于-5和5,这两个物件将是相同的变化,因为(-5)*(-5)=25,5*5=25,如果“myDif”不是正方形区域,只是用16来划分(数字越大,得到的变化越大),真实的距离可以得到真实的变化,这样的结果不是很完美,我们希望能得到像海浪那样的效果,有一个最高点的变化,透明度的值也是用同样的方法计算,唯一不同的是最大值为100,最小值50,我们用100代替250,用6代替16,因为_xscale和_yscale标准的百分数值默认设置为100,我们将在使用Set Property行为时使用他们。


最后,我们要确定物件的距离,当鼠标定位在框架内部时,同样,我们需要计算物件之间的平均距离。所以,我们需要找到物件之间的填充距离filledSpace,它是整个物件的高度,除了第一个和最后一个,因为他们是空的,和第一个与最后一个之间的全部空间。整个空间减去全部物件的高度值即为填充高度。为求得平均值,我们用这个高度去除以所有的物件数。计算除了平均距离以后,我们使用Set Property行为将值赋予物件,物件将依照前一个电影符号的位置和高度来确定增加平均值。


回到原始状态


Else


Set Variable: "I" = startnum


Loop While (I <= endnum)


If (int ( GetProperty ("text" & I, _yscale ) )> 100)


Set Property ("text" & I, Y Scale) = Int ( GetProperty ("text" & I, _yscale ) ) - 1


Set Property ("text" & I, X Scale) = Int ( GetProperty ("text" & I, _xscale ) ) -1


End If


If ( GetProperty ("text" & I, _y) EVAL("textY" & I))


Set Property ("text" & I, Y Position) = Int ( GetProperty ("text" & I, _y ) ) - 1


End If


If ( GetProperty ("text" & I, _Alpha)> 50)


Set Property ("text" & I, Alpha) = Int ( GetProperty ("text" & I, _alpha ) ) - 1


End If


Set Variable: "I" = I + 1


End Loop


End If


在一开始还有另外一种状态,即鼠标不在框架内部时所有的物件都将回到初始状态。因此,我们必须确定每一个物件的比例获透明度是否和初始时一样,他们的垂直位置是否大于或小于初始值,这里又是一个循环检查。如果比例大于初始值即100,我们将比例值减小1,如果透明度值大于初始值50,我们同样将其减少1,如果垂直位置大于初始值,我们将其减小1,如果垂直位置小于初始值,我们就增加1。


自定义文件


如果建立多个这样的例子,你需要在“01-boundingbox”里增加框架。第二个框架可以取名“boundbox2”,第三个可以取名“boundbox3”如此类推。增加好以后,物件都需安放好相应的框架里,而在第二帧里的四个变量将依照框架数,开始物件数,最后的物件数,和全部物件数确定。例如第二个物件群,在第二个框架内,你可以设置不同的框架内有不同的效果产生,只需设置变动最大值,最小值和拆分的变量“scaleAmount”和“alphaAmount”。


网友评论
<