分享

Flash课件

 kaosaudi 2016-04-14
原文地址:http://www./kejianjiaocheng/kj (24).html
老虎注:照该文去作,效果出不来。但该文提出了“呈现运动轨迹”的思路和方法,这对初学动作脚本的我来说,简直就是指路明灯。按该思路和方法,自己可以试着去作:圆、椭圆、正弦曲线、抛物线及其他曲线等。
Flash有着丰富的脚本命令(ActionScript),flash课件制作者可以通过编制程序的方法来控制对象的运动或属性,以达到最佳的演示效果。在许多教学flash课件(尤其是物理flash课件)中,经常需要将对象运动的轨迹呈现出来,这是怎样实现的呢?
也许有些读者会说:这不容易吗?使用运动向导层,复制向导线到另一图层不就成了?!NO!NO!,我要强调指出,用向导层确实也可以实现运动效果或显示运动路线,但这种方法做出的是初级动画,充其量是Flash的初级运用,它不能实现flash课件的高级交互效果!设想一个物体做随机的抛体运动,你能用向导层使对象在运动时同时显现轨迹吗?答案是否定的。因此,笔者将在本文向大家介绍使用FlashActionScript来实现对象的运动并显示运动轨迹的方法,这是Flash课件制作的一个重要技巧之一。
也许我们可用VB或VC轻易绘出各类曲线、轨迹,但在Flash中显现运动轨迹却显得有点复杂,因为Flash5.0以下版本不支持画线功能,如果希望运动对象在运动时同时显现轨迹,那我们只好选取一个折中方案:复制对象!
Flash有一个复制对象命令:duplicateMovieClip,此命令可以复制影片剪辑(MovieClip)对象,是flash课件制作的重要命令。我们先来认识这个命令,该命令的语法是:
duplicateMovieClip(target, newname, depth);
语法中的“target”为要复制的目标对象名,“newname”为新对象名,“depth”为新对象的深度。
从数学角度看,所有的线都是由点组成的,如果点足够密,就可以变成直线、曲线了,甚至是面了!这也是我们呈现对象轨迹的脚本设计基本思想。如果按显示轨迹的常见类型看,我们可将其显示轨迹的情形分为两种:一种是直接显现物
体出现的各个位置,另一种是显现物体运动时经过的路线。这两种显示效果怎样才能实现呢?请往下看吧!
一、显现物体出现的各位置
为了更好说明问题,请启动Flash新建一个电影,用绘图工具中的椭圆工具(Oval
Tool)绘制一个填充色为渐进色的小球,再用箭头工具(Arrow Tool)选定小球图形后点击Insert → Convert toSymbol(F8)将图形转换成一个Movie Clip对象,继续点击Window → Panels →
Instance(Ctrl+I)开启Instance面板,将实例名命名为”boll”。这个小球实例将是我们下面要用Action控制运动的主要对象。
在图层Layer 1的第一帧上按一次F5键,插入一个帧(Frame),再在图层
Layer 1上点击右键,在弹出的菜单中选Properties,将图层名改为“symbol”后按“OK”。
点击Insert →Layer插入一个新图层,在此图层的第一帧上按一下F6插入一个关键帧(Keyframe),将此新的图层改名为“actions”。这里我说明一下:图层symbol是用于放置代码中调用的影片剪辑对象(文中提到的小球对象“boll”和下面提到的小点对象“dd”)用的,该图层有两帧;图层actions用于放置脚本命令,由两个关键帧组成,见图。
在actions图层的第一关键帧上点击右键弹出菜单选Actions,开启action编辑面板并输入以下代码:
t=t+0.1;
setProperty ('/boll', _x, 100*Math.sin(t)+300);
setProperty ('/boll', _y, 100*Math.cos(t)+200);
在actions图层的第二关键帧上输入以下代码:
gotoAndPlay(1);
请按Ctrl+Enter测试一下影片,你会看到上述代码执行后,小球“boll”对象以(300,200)(像素)位置为圆心,以半径100(像素)不停的做匀速圆周运动。如果要将对象经过的每个位置都显示出来,则可以利用复制影片剪辑命令duplicateMovieClip,让运动小球经过每个位置时都复制出一个同样的小球。请试着修改上面的代码为:
第一关键帧
t=t+0.1;
setProperty ('/boll', _x, 100*Math.sin(t)+300);
setProperty ('/boll', _y, 100*Math.cos(t)+200);
duplicateMovieClip (“/boll”, 'copy' + n, n);
n = Number (n) + 1;
第二关键帧:
gotoAndplay(1);
按Ctrl+Enter测试一下电影,看看效果,你看到了复制出的对象了吗?
上述代码由于使用了duplicateMovieClip命令,程序运行复制对象命令定时对小球boll进行同步复制。每执行一次第一帧,系统复制一个当前的boll对象,并取名为copyn,n是个递加的值,若n初始值为1,则复制出的对象将依次被命名为copy1、copy2、copy3等等,这些复制出的对象按照运动对象经过的位置依次排列,就将运动对象的轨迹呈现了出来。
随便指出;代码 n = Number (n) + 1 中的Number(n)是用于强制n为数值而不是字符,这点很重要,否则flash可能会把n视为字符而将其当成字符串来连接,不能实现递加。不过读者也会发现,这些密集的复制对象严重影响了flash课件的效果,而且变量t的累进值越小,复制出的对象越密。另外还有个问题就是随着运动的继续,复制出的对象也越来越多,众多的复制对象不仅会使flash课件运行速度变慢,还会使轨迹变得惨不忍睹。别急,我们有办法解决,请再修改上面的代码为:
第一关键帧
t=t+0.1;
j = j+0.1;//计数器
setProperty ('/boll', _x, 100*Math.sin(t)+300);
setProperty ('/boll', _y, 100*Math.cos(t)+200);
if (t<=6.28)>
if (j==0.5) {
duplicateMovieClip ('/boll', 'copy'+n, n);
n = Number(n)+1;
j = 0;//重新归零
}//判断j是否累加到了0.5,若是就复制对象
}//强制复制对象只在旋转不到一周时发生
第二关键帧:
gotoAndplay(1);
再测试一次看看,没事了吧!原来我们在代码中加入了条件语句,这样不仅可定时(t累加到0.5时)复制对象,而且只能让复制对象指令在小球运动不足一周时(t=6.28即为一周)进行,这样就解决了前面代码存在的问题。你看过闪光照相吗?这种显现物体运动位置的代码方法就很适宜制作模拟闪光照相效果的flash课件。
二、显现运动路线
前面那种方法是通过复制一定数量的对象,把对象经过的位置反映出来,但很多时候我们需要显示的只是对象运动时经过的路线,这时又该怎样实现呢?
思路也很简单,那就是再建立一个“小点”对象,让小点对象跟随物体做同样运动,然后在运动过程中即时复制出“小点”罢了。设想复制小点对象足够多且足够密,那不就成了一条路线了吗?我们来试试吧!
此法要建立一个新对象——小点,因此我们先准备好这个用于绘线的小点。选定 symbol图层,用绘图工具中的画笔工具(BrushTool)在工作区绘出一个足够小的圆点(1×1),用箭头工具选定后,点击Insert → Convert toSymbol(F8)将其转换成Movie Clip对象,名字就叫dd;再点击Window → Panels →Instance(Ctrl+I)开启Instance面板把对象实例名也取作dd。
在上述影片的action图层的关键帧上输入以下代码:
第一帧
t=t+0.1;
setProperty ('/boll', _x, 100*Math.sin(t)+300);
setProperty ('/boll', _y, 100*Math.cos(t)+200);
setProperty ('/dd', _x, 100*Math.sin(t)+300);
setProperty ('/dd', _y, 100*Math.cos(t)+200);
duplicateMovieClip ('/dd', 'copy'+n, n);
n = Number(n)+1;
第二帧
gotoAndplay(1);
点击测试影片就能看到小球运动的路线轨迹了,如果变量 t递加值足够小或复制出的小点对象足够多时,小球对象的运动路线就会变得很圆滑。此代码方法可用于一般的运动flash课件。
三、运动轨迹的优化
由于运动轨迹是由大量复制出的对象排列而成,我们可能会遇到以下几个需要解决的问题:
1、避免对象复制得过密或过疏影响轨迹美观;
2、限制对象复制数目,防止对象复制过多影响程序运行速度(flash中的Movie clip越多,运行速度越慢);
3、擦除轨迹。
关于第一个问题,解决办法是调节自变量的赋值速度,以上述圆周运动代码为例,我们可以将t的每次递加值增加或减少来控制复制对象的疏密。如把t+0.1改为 t+0.5 则可以使复制对象变疏,反之改为t+0.05 则变密。
第二个问题则可以用条件语句判断复制数目后对复制递加数n重新赋以初始值。请看以下代码:
第一帧
t = t + 0.1;
setProperty ('/boll', _x, 100*Math.sin(t)+300);
setProperty ('/boll', _y, 100*Math.cos(t)+200);
setProperty ('/dd', _x, 100*Math.sin(t)+300);
setProperty ('/dd', _y, 100*Math.cos(t)+200);
if (n >=800) {
n = 1;
}
duplicateMovieClip ('/dd', “copy” +n , n);
n = Number (n) + 1;
第二帧
gotoAndplay(1);
观察代码可以看出,上述代码通过条件语句,判断出复制对象数是否大于或等于800,如果是就将n重新赋值为1,让其从1开始重新递加,这样新复制的MovieClip会逐步替代以前的复制Movie Clip,确保了复制出的对象不会超过800个。
第三个问题通常解决办法是利用移除对象命令removeMovieClip,此命令的语法是:
removeMovieClip(target)
命令中的target是要移除的目标对象。由于要移除的对象较多,一般的办法是设计一个擦除按钮,利用循环控制语句来自动移除复制对象,例如在擦除按钮上输入以下代码:
on (release) {
while (Number(n) != 0) {
bn = 'copy'+n;
removeMovieClip (bn);
n = Number(n)-1;
}
}
点击按钮时就能移除所有的复制对象。当然我们还可以在帧命令中插入移除代码,利用条件语句来触发移除对象指令,具体怎样编制代码,请读者参照上述代码自己思考。
从上述分析我们可看出,呈现运动轨迹最简单的办法就是利用复制对象命令duplicateMovieClip,弄清这个道理,你也能让你的flash课件中的运动对象显示出美丽的轨迹!
老虎几个实例在下篇发布。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多