你的位置: Kiyo'Space首页 Flash/AS 阅读文章 欢迎留下您的足迹

动画制作中经常使用的一些AS详解

[ Flash/AS ] 分享

列表
五项实用技术
1:问得最多的问题---loading条的制作和扩展
2:动漫中经常使用的雪花和雨滴效果---复制函数的原理和扩展
3:attacthSound导入声音的方法和利用as动态控制环境声音
4:画中画效果的原理和attachMovie的使用
5:钟表的制作和旋转的动态实现
六项高级技术
1:几种打字机效果的实现和假打字机效果
2:获取系统信息与扩展
3:制作简单的问答题(简单猜谜问题的实现)
4:一个简单的密码窗口(登陆窗口的实现)
5:如何根据使用者的机器和要求动态更改动画的显示质量
6:如何利用简单的as代码实现一些基础的游戏制作(射击游戏,超级马里奥的制作)

 

1:问得最多的问题---loading条的制作和扩展

 

关于loading,已经有n个人发表过2*n篇教程讲了3*n种制作方法,
但是,仍然有很多人问起.
究其原因,可能是loading虽然简单,但是里面包含的知识却很多的原因.
所以我首先还是给各位动画高手讲讲不是loading的loading---假loading的实现

 

****制作方法1:假(伪)loading的实现
所谓假loading,就是模仿loading以达到预载的效果.
原理:比较已略氐亩∈齛和实际帧数b,如果a==b,那么可以播放动画
步骤:1.你需要知道自己的动画实际有多少帧,比如你制作了三个场景,场景1有100帧;
           场景2有250帧,场景3有300帧,那么你的总帧数是100+250+300=650帧
      2.你需要知道怎么将代码显示窗口由普通窗口转为专家窗口,并在里面输入代码-因为在
        专家模式下讲as问题比较方便: )
      3:"//"表示解释语句,不会被flash执行: )

 

实际代码:::

 

//==as for frame1(第一帧上面的as)

 

var a
var b
a = _root._totalframes;
b = _root._framesloaded;
//设已经下载的动画帧数a,实际帧数b
if (b == a) {
//如果下载的帧数和总帧数相等,那么就播放动画
gotoAndPlay(3);
}

 

//==as for frame2
gotoAndPlay(1);
//和第一帧构成循环,这样如果文件没有被下载完的画,将会一直停留在由frame1和frame2构成的loading画面里面

 

注意:这里只是举例子的需要,我在frame3(第三帧)上面添加了stop,实际应用中,frame3是不需要stop的,这样就可以直接向后面播放文件了: )

 

****制作方法2:真实loading的制作
所谓真实loading,就是建立在文件大小基础上的loading,因为文件大小被平均分配到每个时间里面下载,这样就可以得到精确的下载进度.
原理:比较已经下载的文件大小a和总文件大小b,如果a==b,那么就播放动画
步骤1:你需要知道自己swf文件的大小,这一步可以你事先声明,也可以让as来获得文件大小
    2:你需要在舞台上面放置一个动态文本以显示当前的loading进度
    3:你需要运用你的动画技术来使自己的进度画面多姿多彩: )

 

//==as for frame1
b = getBytesTotal();
//获取当前已经下载的文件大小(以byte为单位)
a = getBytesLoaded();
//获取总文件的体积大小
z = int(a/b*100);
//给变量z赋值为  已下载大小/总文件大小*100
aa_1 = z;
//aa_1为舞台上面的动态文本,这是显示用的

 

//==as for frame2

 

if (aa_1 == 100) {
//如果舞台上的动态文本aa_1等于100,那么播放动画文件
gotoAndPlay(3);
} else {
gotoAndPlay(1);
//否则,继续loading
}

 

以上只是loading的笨制作方法,如果你想了解更多的loading制作方法,请参看我写的
<<鬼火loading完全手册>>
闪吧地址::
http://www.flash8.net/tutorials_show.asp?id=471
个人主页地址::
http://www.judyji.com/ghostfire/ghostfire_as_loading.htm

 

源文件
个人主页地址::
http://www.judyji.com/download/flash8_loading.rar

 

附带几个不同门类的专门为动漫制作这制作的模板文件.
个人主页下载地址::

 

http://www.judyji.com/download/flash8_loading_mb.rar

2:动漫中经常使用的雪花和雨滴效果---复制函数的原理和扩展

这也是一个很老的问题了,但是也经常有人问起,因为这是一个变化很多的效果.可以变化出雪花
下雨,风沙,甚至瀑布等效果.瀑布效果是用复制+蒙板实现的,这里不再累诉.
****制作方法
原理:依*dupulicateMovieClip命令来复制出新的mc(电影夹子),并利用mc的property(属性)
     来调节新产生的电影夹子的位置,旋转角度等属性.
步骤1:在舞台上面添加一个需要复制的mc
    2:在代码区添加需要的代码
    3:你需要会查询更多的mc property: )
例子1::
for (i=1; i<20; i++) {
//设定复制次数为20次,如果想复制更多,可以将i<20中的20变大
duplicateMovieClip("mc_01", "mc"+i, i);
//这条语句的意思就是:复制舞台上的电影家子mc_01为新电影夹子"mc"+i,并放置于第i层
with (_root["mc"+i]) {
//with命令用于传递代码,可以查阅相关的帮助文件看看with的用法
  _x = i*20;
//设置"mc"+i的x坐标为i*20,因为i是1-20之间的整数,所以"mc"+i的名称和x位置都是因为i不同而不同的: )
}
}
/*
等价代码::
for (i=1; i<20; i++) {
duplicateMovieClip("mc_01", "mc"+i, i);
_root["mc"+i]._x = i*20;
}
*/

例子2::
for (i=1; i<20; i++) {
duplicateMovieClip("mc_01", "mc"+i, i);
with (_root["mc"+i]) {
//设定x坐标
  _x = i*20;
//设定y坐标
  _y = i*20;
//设定透明度
  _alpha = 100-i*5;
//设定x方向的放缩比例
  _xscale = 100+3*i;
//设定y方向的放缩比例
  _yscale = 100+3*i;
}
//设定舞台上的原mc_01为不可见
_root.mc_01._visible = 0;
}

/*等价代码
for (i=1; i<20; i++) {
duplicateMovieClip("mc_01", "mc"+i, i);
_root["mc"+i]._x = i*20;
_root["mc"+i]._y = i*20;
_root["mc"+i]._alpha = 100-i*5;
_root["mc"+i]._xscale = 100+3*i;
_root["mc"+i]._yscale = 100+3*i;
_root.mc_01._visible = 0;
}
*/

现在大家还看不到什么雪花和雨滴,主要是我们的mc_01还是不动的,现在我们要在mc_01上面做文章.
例子3:我们在例子三中把mc_01修改为一个从上向下落下的雨滴,这样复制后的动画就是下雨效果了,当然,你换成雪花等就是别的效果:)
for (i=1; i<100; i++) {
duplicateMovieClip("mc_01", "mc"+i, i);
with (_root["mc"+i]) {
//产生一个0-599的的随机整数
  _x = random(600);
//产生一个-100-0的随机整数
  _y = -100+random(100);
  _alpha = random(80)+20;
  _xscale = 50+random(50);
  _yscale = 50+random(50);
}
_root.mc_01._visible = 0;
}
stop();

这里面我们使用了随机函数random,更加精确的随机函数是math.random(),关于他们的用法,可以参考帮助文件: )

3:attacthSound导入声音的方法和利用as动态控制环境声音
在制作动画的过程中,有时候我们会遇到这种情况:声音文件在swf文件中变得粗糙难听.解决的办法,一是在publish选项中调高导出音乐的质量,但是文件会相应增大;另外一种解决方法就是
attachSound().attacthSound()方法是把双刃剑,它可以动态的从库中导入音乐文件,可以实现对音乐的动态控制,但是其弱点也是显而易见的---loading时候会在第一帧读取这个导入的音乐文件,造成一段空白.所以我们应该根据实际的情况来选择采取那种方法解决自己的音乐问题: )

****基本的attacthSound命令使用: )
原理:直接使用attacthSound命令来从库导入一个音乐文件,并且播放它
步骤1:向库中导入一个音乐文件(file>import to library)
    2:在库中的音乐文件上点击鼠标右键,然后选择 linkage
    3:选择出现的linkage窗口的export for actionscript系统会自动选择export in first;在indentifi窗口填写链接桥梁名称,假设为sound_01;
    4:使用attacthSound命令之前,必须先建立一个sound对象: )
    5:在帮助文档中查阅更多sound命令:)

//==as for frame1
mySound = new Sound();
mySound.attachSound("sound_01");
mySound.start(0, 100);
//mySound.start(0, 100);里面的0是延迟时间,也就是每次音乐播放是开始的时间点,如果填1000,那么就会延迟1秒钟,100是循环播放次数.你可以查阅帮助文档获取详细的帮助信息

****一些常用的sound对象命令组成的声音控制器
flash的sound命令虽然很少,但是仍然能够实现声音的"播放","停止","音量","声道"等基本功能,如果想实现更多的功能,那么我是无能为力的.不过现在flash出现了一个更新的版本,可以对导入的mp3文件信息进行一些修改,但是我不想重装flashmx,所以也就没有去研究那个东东了: )
原理:as原理很简单,就是用sound的几种命令堆砌出一个控制器.这个问题的关键是将声音的变化用舞台上的mc来控制: )
先把几个方法命令和作用写出来,大家好心里有数:)

Sound.attachSound
附加在参数中指定的声音。
Sound.getBytesLoaded
返回为指定声音加载的字节数。
Sound.getBytesTotal
以字节为单位返回声音的大小。
Sound.getPan
返回上一个 setPan 调用的值。
Sound.getTransform
返回上一个 setTransform 调用的值。
Sound.getVolume
返回上一个 setVolume 调用的值.
Sound.loadSound
将 MP3 文件加载到 Flash Player 中。
Sound.setPan
设置声音的左/右均衡。
Sound.setTransform
设置要在每个扬声器中播放的每个声道(左声道和右声道)的音量。
Sound.setVolume
设置声音的音量级别。
Sound.start
从头开始播放声音,或者可选择从参数中设置的某偏移点开始播放声音。  
Sound.stop
停止指定声音或当前播放的所有声音。

步骤1:重复上面一个例子的几步,将声音导入倒舞台: )
    2:在舞台上面建立控制不同内容的空间,如声音大小控制滑动条,声道控制滑动条.
我们这里的滑动条全部采用400象素长度,因为比较好计算放在台上也较为美观.
每个滑动条的as编写在滑动按钮上面,这样便于计算机的计算,也便于我们自己以后修改.
所以大家在看源文件的时候千万不要错过了里面的一些按钮和代码.

制作中我尽量将这个例子拆分为几个模块.
1:播放控制区
这里又两个按钮,一个是播放,一个是消声.
//==as for播放按钮
on (press) {
//停止所有声音,这是必须的,如果没有这条命令,用户不停的按这个按钮的话,就会重叠播放
stopAllSounds();
mySound.start(0, 100);
}

---------------------------------------------------
//==as for消声按钮
on (press) {
//停止所有声音
stopAllSounds();
}
---------------------------------------------------

2:效果控制区
这里是声道和音量两个控制滑块,他们都是从库中的控制条得来得.
一个命名为yl(音量),一个被命名为sd(声道).在滑块mc的内部,有一个按钮,
他是滑块的基础,我首先介绍它:
//==as for 按钮(named bo_01)
on (press) {
//当按钮被按下的时候,按钮开始鼠标跟随.后面的四个数字分别表示按钮移动的左上右下四个边界.
startDrag("bo_01", true, -200, 0, 200, 0);
}
on (release) {
//当鼠标释放是,停止跟随
stopDrag();
}

下面介绍一下声道和音量两个滑块
//==as for yl
onClipEvent (enterFrame) {
//因为音量的变化范围是0-100,而按钮bo_01在音量mc中的位置范围是-200~200,故需要用下面的公式转化一下.
vol = (_root.yl.bo_01._x+200)/4;
//setvolume就是设定音量的方法了: )
_root.mySound.setVolume(vol);
}

--------------------------
//==as for sd
onClipEvent (enterFrame) {
//同理,因为声道的变化范围是-100~100,所以我们也需要转化一下
vol = -(_root.sd.bo_01._x)/2;
_root.mySound.setPan(vol);
}
--------------------------------------

3:动态mp3显示器
这是一个可以省略的彩蛋,不过有时候却很有用,我将它命名为jump
------------------------------------------------------------------------------
//==as for jump
//下面的代码是为跳跃的方块写的
onClipEvent (load) {
//当电影夹子被读取时候,我们初始化jump为不可见,并声明一个变量jump_sep
var jump_sep;
_root.jump._visible = 0;
}
onClipEvent (enterFrame) {
//jump_sep是控制动态显示栏的移动区域的,可以修改参数280看看效果
//而里面的_root.sd.bo_01._x其实是来源于声道控制mc上的,大家可以看看声道mc上面的代码
//其意思就是声道mc的控制按钮的位置,因为我们不断的移动按钮的位置,结果造成了动态显示区的不断移动: )
jump_sep = 280+(_root.sd.bo_01._x);
for (i=0; i<10; i++) {
  duplicateMovieClip(_root.jump, "jump"+i, i);
  with (_root["jump"+i]) {
   //设定心复制出来的mp3显示器的位置,其位置以jump_sep为基础,以10为间距.大家可以修改参数10为其他数看看效果: )
   _x = i*10+100+jump_sep;
   //这个语句是为了制造出mp3变化效果
   _yscale = random(100);
   //对y的声明一定要放在最后因为我们事先改变了yscale的值,可能造成mp3的基点位置变化.最后声明_y=80,可以约束所有
   //的mp3显示器的y轴为80,也就是基点在同一直线上,大家可以修改一下y的值,看看效果: ).
   _y = 80;
  }
}
//我饿了: (

4:画中画效果的原理和attachMovie的使用
//新建一个object对象,用于储存各种属性
myObject = new Object();
myObject._x = 0;
myObject._y = 0;
//关于attachmovie方法在帮助文件里面有非常详细的描述.我这里就直接复制修改一些作为讲解
mc_01.attachMovie("mc", "mc_01", 2, myObject);
stop();

/*
用法

myMovieClip.attachMovie( idName, newName, depth [, initObject] )
参数
idName 库中要附加到舞台上某影片剪辑的影片剪辑元件的链接名称。
这是在“元件链接属性”对话框中的“标识符”字段中输入的名称。

newname 附加到该影片剪辑的影片剪辑实例的唯一名称。

depth 一个整数,指定影片所放位置的深度级别。

initObject 一个包含属性的对象,这些属性可用于填充新附加的影片剪辑。
此参数使动态创建的影片剪辑能够接收剪辑参数。如果 initObject 不是对象,
则将被忽略。initObject 的所有属性都会被拷贝到新实例中。
构造函数可使用由 initObject 指定的属性。此参数是可选的。

方法;从库中取一个元件并将其附加到舞台上由 MovieClip 指定的影片中。
使用 removeMovieClip 或 unloadMovie 动作或方法可删除用 attachMovie 附加的影片。
*/

//注意
//如果我们在上面的代码中不使用mc_01.attacthmovie()而直接使用attachmovie()的话,就是以舞台为基础导入库中的电影夹子的

======================================================================================================================
======================================================================================================================
当然,在实际的网络引用中,为了取得更大的载速度,我们经常采用外部导入swf文件的方法来使得动画的下载实现模块化.
这就是大名鼎鼎的,问题多多的loadmovie命令了: )

4:画中画效果的原理和attachMovie的使用
//新建一个object对象,用于储存各种属性
myObject = new Object();
myObject._x = 0;
myObject._y = 0;
//关于attachmovie方法在帮助文件里面有非常详细的描述.我这里就直接复制修改一些作为讲解
mc_01.attachMovie("mc", "mc_01", 2, myObject);
stop();

/*
用法

myMovieClip.attachMovie( idName, newName, depth [, initObject] )
参数
idName 库中要附加到舞台上某影片剪辑的影片剪辑元件的链接名称。
这是在“元件链接属性”对话框中的“标识符”字段中输入的名称。

newname 附加到该影片剪辑的影片剪辑实例的唯一名称。

depth 一个整数,指定影片所放位置的深度级别。

initObject 一个包含属性的对象,这些属性可用于填充新附加的影片剪辑。
此参数使动态创建的影片剪辑能够接收剪辑参数。如果 initObject 不是对象,
则将被忽略。initObject 的所有属性都会被拷贝到新实例中。
构造函数可使用由 initObject 指定的属性。此参数是可选的。

方法;从库中取一个元件并将其附加到舞台上由 MovieClip 指定的影片中。
使用 removeMovieClip 或 unloadMovie 动作或方法可删除用 attachMovie 附加的影片。
*/

//注意
//如果我们在上面的代码中不使用mc_01.attacthmovie()而直接使用attachmovie()的话,就是以舞台为基础导入库中的电影夹子的

======================================================================================================================
======================================================================================================================
当然,在实际的网络引用中,为了取得更大的载速度,我们经常采用外部导入swf文件的方法来使得动画的下载实现模块化.
这就是大名鼎鼎的,问题多多的loadmovie命令了: )


欢迎在此留下您的脚步






评论内容 (*必填):
(Ctrl + Enter 快速提交)