流星的运动是很复杂的。在这里只能粗略地模拟一下。不过相信还是有很多朋友会感兴趣的。哈哈……
言归正传,这个流星效果实际上只是用了一个演员与一个行为就实现的了。一个演员就是指那颗星星,如果你有更好的星星,也可以自己换来看看效果的。下面和大家讨论一下这个行为。
在这里先以一颗星星是怎么样出现流星效果为例来说说原理。流星的运动可以归类为抛体运动。在这个例子中是用了抛体运动中最特殊的平抛运动的原理。平抛运动的特点是:可以看作水平方向的匀速直线运动与竖直方向上的自由落体运动这两个运动的合成(如果看不懂这些名词,请看看中学物理课本。哈哈……)。而匀速直线运动是指相同的时间段内,物体运动过的位移(路程或距离)是一样的;自由落体运动是指随着时间的增长,物体运动的速度越来越快,并且它的速度增长是符合特殊规律的。哈哈……,不说理论了,就开始。
先在舞台(640*480)中央上放上一颗星星(这时打开分镜表可以看到星星的位置是第一通道)。再为它加一个Behavior Script 。我们先来实现让它做平抛运动的效果,做好这颗星的运动,才为它加上尾巴。
首先给它一个水平方向的运动。Behavior Script的Lingo程序如下:
on exitframe me
-- 当退出当前帧时
sprite(1).loch = sprite(1).loch + 5
-- 1号通道中的精灵(即星星)的横坐标增加5
end
播放一下,星星就会向右运动的了。停止它,再加上几句,使程序变为:
property pTime
-- 定义一个局部变量pTime,
-- 用来记录时间用的。
on beginSprite me
-- 当加上这个行为的精灵第一次出现在舞台上时。
pTime =0
-- 设定初始时间为0。
end
on exitframe me
-- 当退出当前帧时
pTime = pTime + 1
-- 时间每次增加1
sprite(1).locH = sprite(1).locH + 10
-- 1号通道中的精灵(即星星)的横坐标增加10,是符合匀速直线运动规律的。
sprite(1).locV = sprite(1).locV + 0.5*(pTime*pTime-(pTime-1)*(pTime-1))
-- 1号通道中的精灵(即星星)的纵坐标增加0.5*(pTime*pTime-(pTime-1)*(pTime-1))
-- 0.5*(pTime*pTime-(pTime-1)*(pTime-1))是表示星星在pTime时刻与(pTime-1)时刻的纵坐标之差,是符合自由落体运动规律的。
end
然后再播放一下。就会看到星星在做平抛运动了,在舞台上划一个漂亮的弯弧。
程序中的:0.5*(pTime*pTime-(pTime-1)*(pTime-1))中的0.5是一个常数来的。可以加大或减小它。不同的数值会影响弯弧弯到什么样的情况。如果你有兴趣可以做一下改变它的尝试,看看会出现什么情况。
现在说说跟着这颗星后面出现的九颗星是怎么样出现的。这九颗星尾是有一定的规律的。首先,它们应是依次出现的,而不是一下子就出现齐九颗星的。其次,它们应是一颗星比前一颗星的大小要小点,一颗星比前一颗星的亮度要暗些。还有一个特点就是某个时刻某颗星的位置是前一颗星在前一个时刻的位置。
先说说怎么依次使一颗星比前一颗星的大小要小点,方法是有很多种的。在这儿用的是直接修改角色的height与width参数,例如:在上面那个一颗星沿弧线抛落的例子中的Lingo程序中的最后一个“end”之前加入下面这两句:
sprite(1). height = sprite(1). height - 1
-- 1号通道中的精灵(即星星)的高度比原来减少一个象素
sprite(1). width = sprite(1). width - 1
-- 1号通道中的精灵(即星星)的宽度比原来减少一个象素
那么沿弧线抛落的星星就会越落越小的了。在这儿是说明了一下height与width参数的使用方法,在做流星时就要灵活变一变才行。因为流星串中第一颗主星是不需要改变大小的(本例是如此)。而九颗尾星依次比前一颗小点就行。例如,第一颗尾星比主星小2个象素,第二颗尾星比主星小4个象素,第三颗尾星比主星小6个象素……
另外,还要实现第一颗尾星出现的位置应是主星前一时刻所在的位置,第二颗尾星出现的位置应是主星前二时刻所在的位置,第三颗尾星出现的位置应是主星前三时刻所在的位置……
可以用下面的循环结构的Lingo程序来实现这些。直接用下面的Lingo程序代替刚才修改角色的height与width参数的那两句即可。
repeat with i = 2 to 10
sprite(i).member= sprite(1).member
sprite(i).locZ = sprite(1).locZ - i
sprite(i).loc = sprite(1).loc - point(i*10,0.5*(pTime*pTime-(pTime-i)*(pTime-i)))
sprite(i).ink = sprite(1).ink
sprite(i).height = sprite(1).height - 2*i
sprite(i).width = sprite(1).width - 2*i
end repeat
这样就有九颗尾星了。
但是,从运行结果来看,这时候有点怪。因为在开始瞬间九颗尾星一下子全部出现了,呈现出一个弯的形状(会物理的朋友们可以理解它的形状),且后面的尾星更是超过了星星没化为流星之前的位置,这是不合理的。应该是化为流星的主星每移动一个位置,才在它后面增多一颗尾星。
该怎么实现呢?可以用一个循环体程序来实现。可以先定义一个局部变量n,然后把repeat with i = 2 to 10一句改为repeat with i = 2 to 2+n
再在最后一个“end”前加入以下程序语句:
if n < 8 then
n=n+1
end if
如果想这个流星过程不停出现,我们可以先定义一个局部变量pLoc0,然后用pLoc0来记录sprite(1)的Loc(语句为:pLoc0 = sprite(1).loc),再在最后一个“end”前加入以下程序语句:
if sprite(1).LocV >480 then
pTime = 0
n = 0
sprite(1).loc = pLoc0
end if
:angry:
这时候,整个程序变为:
property pTime,i,n,pLoc0
-- 定义一个局部变量pTime,
-- 用来记录时间用的。
on beginSprite me
-- 当加上这个行为的精灵第一次出现在舞台上时。
pTime =0
-- 设定初始时间为0。
n=0
pLoc0 = sprite(1).loc
end
on exitframe me
-- 当退出当前帧时
pTime = pTime + 1
-- 时间每次增加1
sprite(1).locH = sprite(1).locH + 10
-- 1号通道中的精灵(即星星)的横坐标增加10,是符合匀速直线运动规律的。
sprite(1).locV = sprite(1).locV + 0.5*(pTime*pTime-(pTime-1)*(pTime-1))
-- 1号通道中的精灵(即星星)的纵坐标增加0.5*(pTime*pTime-(pTime-1)*(pTime-1))
-- 0.5*(pTime*pTime-(pTime-1)*(pTime-1))是表示星星在pTime时刻与(pTime-1)时刻的纵坐标之差,是符合自由落体运动规律的。
repeat with i = 2 to 2+n
sprite(i).member= sprite(1).member
sprite(i).locZ = sprite(1).locZ - i
sprite(i).loc = sprite(1).loc - point(i*10,0.5*(pTime*pTime-(pTime-i)*(pTime-i)))
sprite(i).ink = sprite(1).ink
sprite(i).height = sprite(1).height - 2*i
sprite(i).width = sprite(1).width - 2*i
end repeat
if n < 8 then
n=n+1
end if
if sprite(1).LocV >480 then
pTime = 0
n = 0
sprite(1).loc = pLoc0
end if
end
本主题相关附件:kzwz.dir
