免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享

[AS3]Flash 3D特效商业范例随学随用(PDF扫描版+源码)

本文来自:★flash之路-flash技术交流★ 转帖请注明出处! 作者:网雨霏霏 您是第4170个浏览者

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
flashroad友情提示:
“点评”不是“回帖”!


本书是国内第一本介绍 Flash 3D 制作技术的专业图书。
从基本的 ActionScript 知识与动画原理讲起,重点介绍了与 Flash 3D 技术相关的 Tweener 类和 DocumentClass 类,以及开源 Flash 3D 渲染引擎 Papervision 3D。
购买主题 已购买人数:0  记录 本主题需向作者支付 70 金钱 才能浏览

获得 小福神卡 一张

卡片说明:网雨霏霏照顾了失踪的小狗,主人付出了3金钱以作感谢

卡片效果:+3

友情提示:单击下列任意一个表情,即可瞬间自动回复本帖!

好贴......
郁闷......
开心......
擦汗......
鄙视......
狂怒
谢谢
爱你呦
拜托了
嗯嗯
OMG
求关注
伤心......
无奈.....
无奈.....
无奈.....
无奈.....
无奈.....
哈哈哈
NO
OK
what
我来了

最近访问本帖者列表:

flashroad
访问时间:2020-02-16 10:36

打赏

取消

感谢您的支持,我会继续努力的!

扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

Powered by 爱秀代码,分享从这里开始,精彩与您同在

点评
B Color Smilies

您还可以输入:个字符
X

X


将下载的压缩包解压缩,如上图,会得到一个名为Flash3D的文件夹,打开后,请先阅读压缩包使用说明.txt文件,按照说明操作
电子书就是FLASH 3D特效商业范例随学随用.pdf文件,需要你的电脑中有pdf阅读器才可以打开


下面是fla源文件文件夹内的内容:


是对照pdf电子书内的章节的数码存放的:

每一章节都可以展开节点看到详细列表:
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

从本楼开始往后,乃是本人(网雨霏霏)自学《FLASH 3D特效商业范例随学随用》时,对教程中提及的一些重要的知识点所做的笔记。以方便自己以后的翻阅,供正在学习或已经学过本书的朋友翻阅。
笔记基本上是摘抄电子书的原文内容,但本人会替换原作者的一些用词,并补充一些自己的观点。

为方便将来的重新阅读,我会分楼层书写,且会将电子书所在页面的页码进行标注,书写格式如下:
【Pn】n代表电子书当前页的页码 <如果你是看的实体书,请将n-6 就是实体书当前页的页码>
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.

获得 小穷神卡 一张

卡片说明:网雨霏霏不小心破坏了公物,被警察叔叔扣掉3金钱

卡片效果:-3

点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

章标题:PART 01 Basic
1-2 学习 ActionScript 3.0 的12个理由

【P9】1.由于Flash本身是靠用户端的CPU做实时运算来呈现动画效果的,所以当CPU满负荷时,Flash运算也会跟着慢下来,会导致本来很流畅的动画变得时常被卡住。
【P12】2.AS2可以不用var这个关键字声明就直接指定变量,很容易让人搞不清楚该变量是局部变量还是全局变量;AS3则一定要通过var来声明变量。另外,AS3还新增了const关键字,用于声明常量。【所谓的常量,就是当该值被定义后,就无法再被重新写入。像Math.PI就是Math类下的静态常量PI,它代表圆周率π,也就是数字3.1415926....。常量通常用来存储不需改变也不可改变的值。】
【P13】3.在对象还不存在,或未经声明、未定义时,AS2依然可以调用该对象的方法或属性;AS3在对象未定义或值为null的情况下,若去调用该对象的方法,则会产生错误信息。
【P13】4.用AS2时,主时间轴本身虽然也是一个MovieClip类,但没办法方便地将它扩充为自定义的类;AS3则新增了文档类,让主时间轴可以方便地扩充成自定义类。
<注>:AS3新增的文档类功能,可以将美工绘制和代码编写这两块内容彻底分离开来,能极大地提高工作效率。虽然在AS3中我们还可以沿用AS2时代的习惯在时间轴上直接写代码,但是,flash在编译阶段会自动的将时间轴的代码编译为文档类和外部类的形式,使用反编译软件【比如“闪客精灵”】解析时就会发现该设定。

【P14】5.AS2既有_root属性、又有_level0属性,还可以通过_lockroot属性来改变root的指向,一个不小心就会让人搞混;AS3显示对象的root属性,对加载的SWF文件的显示对象而言,就是该SWF文件的显示清单树状结构的最上层显示对象。简单来说,不论a.swf是否被加载,其显示对象(如MovieClip、Button、TextField等等)的root属性永远都指向a.swf最上层的主时间轴。
【P14】6.AS2并无事件流的机制:每当一个MovieClip或Button被赋予onRelease等事件时,其容器下的子对象就会失去鼠标感应功能,从而无法接收鼠标事件;
AS3则可通过事件流机制,一层一层的捕捉事件,不受其容器的影响。
【P15】7.在AS3中新增了许多好用且高效的类,比如说ByteArray这个二进制数据类。由于计算机只懂得1和0这两个字符,所以只要能知道编码格式,就可以通过ByteArray类来编出各种文件。
例如:将Flash里的任何画面输出成BitmapData类,再通过编码将该类编码成ByteArray类,接着通过服务器程序语言进行处理,就可以产生一张实例的.jpg调用。甚至,当观众使用Flashplayer10来观看swf文件时,Flashplayer10还可以直接存成调用格式让用户下载,无需通过服务器程序语言!
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

章标题:PART 01 Basic
1-3 ActionScript 3.0 显示对象类表
【P16】1.若被载入的SWF文件是用AS1或AS2编写出来的SWF文件,并不是使用AS3编写的时候,则需要使用LocalConnection类来沟通才可调用对方的函数。
【P17】2.Loader可用于加载SWF文件或图像文件(jpg、png、gif静态),取代了AS2的MovieClipLoader类
【P17】3.Sprite是没有时间轴的MovieClip。很多情况下我们只需要一个容器对象来显示东西,不需要时间轴功能,为了节省资源开销,使用Sprite类最好。
【P17】4.MovieClip类似于Sprite,只不过MovieClip拥有时间轴,且是动态类
【P17】5.抽象类与动态类:
<1>抽象类:无法被实例化,只能用来继承。
以生物学为例,狮子和老虎都是被定义为猫科,而猫科本身只是用来定义一些描述,并没有真正的动物叫做“猫科”。在Flash的AS3中,猫科就是一个抽象类,狮子和老虎都是它的子类。
<2>动态类:该类能随时新增自定义的属性或方法。在AS3中只有少部分类是动态类,以下是几个例子:
【例1】
var clip:MovieClip=new MovieClip();//声明MovieClip类实例
clip.test=3;//为clip对象新增一个test属性,其值为3
【例2】
var sprite:Sprite=new Sprite();//声明Sprite类实例
sprite.test=3;//此时会发生编译器错误,因为Sprite类不是动态类,无法任意新增属性
【例3】
var obj:Object=new Object();//Object类是动态类,可以在运行时任意增加属性
obj.no = 98;
obj.stt = "网雨霏霏";
for (var i in obj)
{
trace(obj);
}
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

章标题:PART 01 Basic
1-4 侦听与发送事件
【P18】movieClip.addEventListener(MouseEvent.MOUSE_UP,onEventMouseUp);
侦听器函数onEventMouseUp会去侦听发送者movieClip所发出的MouseEvent.MOUSE_UP事件。事件类型其实是字符串类型,完全可以使用"mouseUp"字符串来指定侦听类型,但是一般不推荐这样写,原因是AS3编程时严格区分大小写,万一你将某一个字母的大小写给写错了,比如说写成了"MouseUp",代码就失效了【侦听器函数就会侦听发送者所发出的"MouseUp"事件,除非发送者能够发出该事件,否则不论用户怎么按对象,都不会有相应】
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.

获得 大怪兽卡 一张

卡片说明:网雨霏霏被风吹乱了秀发,花费了7金币请理发师整理了一个酷炫发型

卡片效果:-7

点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

章标题:PART 01 Basic
1-5 ActionScript 3.0 基本练习


【P19】1.MovieClip对象或Sprite对象.buttonMode=true//激活两类对象的按钮模式
默认情况下,MovieClip对象或Sprite对象在被单击的时候不会出现按钮的手势指针,需将其buttonMode属性设为true才会出现按钮的手势指针。该属性被定义在Sprite类里。
【P19】2.在AS3中,与鼠标单击的相关事件有3种:
<1>MouseEvent.CLICK
在实例对象上按下并松开鼠标,这两个动作都有才会发生此事件
<2>MouseEvent.MOUSE_DOWN
在实例对象上按下鼠标就会发生此事件。类似于AS2的onPress事件。
<3>MouseEvent.MOUSE_UP
在实例对象上松开鼠标就会发生此事件。即使在画面空白处按下鼠标、再滑入对象的感应区后松开鼠标,一样会发生该事件。类似于AS2的onRelease事件。
【P20】3.
this.buttonMode = true;//this指的是自己,亦即clip_mc对象
this.addEventListener(MouseEvent.CLICK,onClick);
function onClick(e:MouseEvent):void {
MovieClip(parent).gotoAndPlay(2);
}
此处如果直接写parent.gotoAndPlay(2);会有编译器错误。原因是:parent属性回传的类是DisplayObjectContainer,而该类并没有gotoAndPlay()方法,所以要多一个类型转换的语句。而parent指的是上一层,本处的上一层就是swf文件的主时间轴,我们使用类名称加上小括号的方式来将之转换为MovieClip类的对象,再使用gotoAndPlay()方法就不会产生错误。也可以写成(parent as MovieClip).gotoAndPlay(2);
【P20】4.在AS2中使用_parent属性指的是回传上一层的显示对象容器,其类型为MovieClip,故可直接写为_parent.gotoAndPlay(2);不会有问题。
AS3的类是很重要的,一定要转回该类才能使用该类的属性和方法。那么是不是可以任意的转换类呢?答案是否定的。可用1-3节的电玩游戏转职表来分析:
虽说所有的英雄都是剑士,也可说所有的英雄都是人类,但并非所有的人类都是英雄。对照回AS3的类,就是:所有的MovieClip都可以是DisplayObjectContainer类,但DisplayObjectContainer类就不一定是MovieClip类了。也就是说,类可以向上转型但不能向下转型。
【P21】5.让一个侦听器函数同时侦听多个发送者
发送者(事件源)在发出事件时,除了发送事件类型之外,还会一起发送相关参数。AS3的这种相关参数就是由Event类来处理的,故侦听器函数定有一Event(或其子类)的对应参数来接收。
通过“参数.currentTarget”可以取得发送者对象;“参数.currentTarget.name”可得到实例名
【P21】6.从库中把元件放置到场景中
AS2时代使用attachMovie()方法,在AS3中该方法已被停用,取而代之的是先实例化自定义类,再用addChild()方法将其加入指定显示对象容器内从而呈现在舞台上,做法如下:
<1>先做好影片剪辑,然后打开库面板,在“AS链接”那里直接输入ItemMC【只有flashCS5以后的版本才可以如此输入,老版本的需要按照电子书中的方式操作】这个ItemMC就是所谓的“自定义类”
<2>主时间轴第一帧写代码如下:
var item:MovieClip=new ItemMC();/*该行可修改为var item:ItemMC=new ItemMC()但推荐不要修改,原代码交代清楚了自定义的类是继承于MovieClip类的*/
item.x=item.y=50;
this.addChild(item);//AS3内必须使用addChild()方法才可以看到对象


【P23】7.在AS2中,Stage类并不是容器对象,主时间轴就是整个容器的最上层。
但是AS3中,最上一层的容器一定是Stage类,且它只有一个,也无法被实例化,接着是MainTimeLine主时间轴
【P24】8.事件流简介
AS2中,上层容器对象被赋予onRelease等事件时,其容器里的鼠标事件就会被覆盖掉。
但是AS3中由于事件流的关系,导致事件可以不停的由上往下传递,直至所单击的目标对象,再往上回传至Stage,这整个过程就是事件流。以代码为例:
<1>按照【P21】6的<1>内的手段设计好影片剪辑在库内的AS链接为ItemMC
<2>主时间轴第一帧写代码如下:
var contatiner:Sprite=new Sprite();
container.x=20;
container.y=60;
container.name="contatiner";//自定义显示对象的实例名,若不自定义,会被flash按照层级关系命名为“instance+数字”
container.addEventListener(MouseEvent.CLICK,onClick);
this.addChild(container);
for(var i:uint;i<5;i++){
var item:MovieClip=new ItemMC();
item.x=120*i;
item.y=10;
item.buttonMode=true;
item.name="item"+i;
container.addChild(item);
}


function onClick(e:MouseEvent):void{
trace("发送者对象:"+e.currentTarget.name);
trace("目标对象:"+e.target.name);
}


测试影片发现,单击舞台上的对象时,可在输出面板看到:无论点击的是哪一个对象,发送者都是container,因为我们是对该container对象注册的侦听。而,目标对象则会随着被点击的对象的不同而有所不同。明明对象是被包在了container里,且我们也没有对这些对象注册侦听,却依然可以捕捉到被单击的目标对象。


这是因为,当MouseEvent.CLICK事件发生时,事件都是由Stage往下传送,直至到达目标对象之后,才再往回传至Stage,因此能轻易地捕捉到目前被单击的目标对象时哪一个。
其中,侦听器函数的参数e的currentTarget指的一定是发送者对象(本例中的container对象),而target属性则可以捕捉到目前所单击的目标对象。
【P27】9.超链接语法
AS2要链接到网址时,仅需使用全局函数getURL("网址")即可。但AS3中被倾力修改了,使用的是Flash.net包内的navigateToURL()函数,且该函数需要使用URLRequest类来处理。


stage.addEventListener(MouseEvent.CLICK,gotoLink);
function gotoLink(e:MouseEvent)
{
var url:String = "http://www.baidu.com";
var req:URLRequest = new URLRequest(url);
navigateToURL(req,"_blank");/*"_blank"表示在新建窗口内打开链接,仅swf内嵌入网页时,该代码才有效。如果只是单纯的发布为swf文件,"_blank"可以省略不写*/
}
上述代码可简写为:
stage.addEventListener(MouseEvent.CLICK,gotoLink);
function gotoLink(e:MouseEvent)
{
navigateToURL(new URLRequest("http://www.baidu.com"),"_blank");
}


【P28】10.加载外部图像
AS2时代加载图像或SWF文件都是由MovieClip来执行,但AS3内MovieClip类已经不能加载任何东西,取而代之的是Loader类。又因Loader类继承自显示对象DisplayObject,故可被加至显示对象容器里。
var ldroader=new Loader();
var req:URLRequest = new URLRequest("demo.jpg");//需要在fla文件所在目录内有一个名为demo.jpg的图像文件,否则会报错。
ldr.load(req);
addChild(ldr);


【P29】11.载入外部SWF文件
加载外部swf文件的语法和加载图片文件的语法一样,但加载后,Loader对象里的构架会不太一样。详见电子书内的陈述。
【P30】12.加载SWF文件时的root属性值
假设以main.swf去加载相同目录下的child.swf文件。AS2中,不论是main.swf还是child.swf里指定_root属性,都一定指向最上层的时间轴,也就是main.swf里的最上层
但在AS3中,root属性(注意没有下划线)一定是指向该SWF本身的最上一层时间轴。因此在main.swf里使用root属性的话,会指到自己的最上层时间轴;在child.swf使用root属性也是指到child.swf自己的最上层时间轴、并不会指到main.swf中去。


因此,AS2时代,如果需要屏蔽被加载的swf文件的_root指向自身,需要做如下设置:
在child.swf文件内主时间轴加上如下一行代码
this._lockroot=true;
那么,child.swf文件内指定的_root属性都是child.swf文件的最上层,不会指到main.swf文件内


【P31】13.侦听外部加载的进度,并确认是否加载完成
AS3的Loader类有一个contentLoaderInfo属性,可传回正在加载对象的LoaderInfo对象。而LoaderInfo类会提供有关加载的SWF文件或图像文件的信息。简而言之,Loader只负责加载,而LoaderInfo则负责提供加载进度等相关的信息。
var ldroader=new Loader();
ldr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onLoaderProgress);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderComplete);
var req:URLRequest = new URLRequest("E:/swf/1.swf");//请将路径修改为合适自己电脑情况的
ldr.load(req);
addChild(ldr);
var tf:TextField=new TextField();//新建一个动态文本,用于显示加载进度的
tf.x=40;
tf.y=380;
tf.width=200;
addChild(tf);
function onLoaderProgress(erogressEvent)
{
var _percentage:uint = e.bytesLoaded / e.bytesTotal * 100;
tf.text="载入百分比:"+_percentage+"%";
}
function onLoaderComplete(e:Event)
{
ldr.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS,onLoaderProgress);
tf.text="加载完成!"
}


测试时,开启“视图 模拟下载”或者测试影片之后继续按一次快捷键Ctrl+Enter即可开启模拟下载的情况
【P32】14.控制外部加载的SWF文件
载入外部的SWF文件之后,可以控制其播放或调用其内部函数来执行,不过,上述操作都必须要在SWF文件完全加载成功后,才可以实现
打开“fla源文件”文件夹内的13_Loader_SWFAndGotoAndPlay.fla文件
var ldroader = new Loader();
ldr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onLoaderProgress);
ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoaderComplete);
var req:URLRequest = new URLRequest("loadedAS3.swf");
ldr.load(req);
this.addChild(ldr);


function onLoaderProgress(erogressEvent):void {
var _percentage:int = e.bytesLoaded / e.bytesTotal * 100;
trace("载入百分比:"+_percentage);
}
function onLoaderComplete(e:Event):void {
var _contentMC:MovieClip = ldr.content as MovieClip;
_contentMC.gotoAndPlay(2);
}
注:Loader对象的content属性可以取得其容器内的显示对象,该属性回传的类是DisplayObject。由于被加载的loadedAS3.swf文件是使用AS3编写的,所以对象是MovieClip,一样需将类传回MovieClip才能进一步操作它【使用as可以将对象更改类型】
同理,如果被加载的是图像,那么content属性取得的会是Bitmap对象
【P33】15.侦听主时间轴的加载进度
每个显示对象实例都有loaderInfo属性,利用该属性可以取得相关的加载信息,当然包括主时间轴。打开“fla源文件”文件夹内的14_loadMainSWF.fla文件,代码如下:
stop();//先让时间轴暂停。
this.addEventListener(Event.ENTER_FRAME, onRootEnterFrame);//侦听ENTER_FRAME事件。
function onRootEnterFrame(e:Event):void {
var _bytesLoaded:int = this.loaderInfo.bytesLoaded;//已载入元位组。
var _bytesTotal:int = this.loaderInfo.bytesTotal;//总档案大小元位组。
var _percentage:int = (_bytesLoaded / _bytesTotal * 100);//二者相除并乘上一百, 即可得到百分比。
if (_percentage >= 100) {//如果载入的百分比大于等于100, 表示载入完毕。
this.removeEventListener(Event.ENTER_FRAME, onRootEnterFrame);//取消侦听。
this.play();//播放时间轴。
} else {
percent_txt.text = "LOADING" + _percentage +"%";
}
}
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

后续可能会有补充 占位编辑
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.

获得 大财神卡 一张

卡片说明:网雨霏霏照顾了失踪的小狗,主人付出了2金钱以作感谢

卡片效果:+2

点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

后续可能会有补充 占位编辑
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

后续可能会有补充 占位编辑
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.

获得 小福神卡 一张

卡片说明:网雨霏霏照顾了失踪的小狗,主人付出了3金钱以作感谢

卡片效果:+3

点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

后续可能会有补充 占位编辑
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.

获得 土地神卡 一张

卡片说明:网雨霏霏帮助迷路的小朋友找到家长,家长为表达谢意,付出了5威望

卡片效果:+5

点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

后续可能会有补充 占位编辑
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

后续可能会有补充 占位编辑
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

后续可能会有补充 占位编辑
您所在的用户组只能看到部分内容.
如查看全部内容, 请先登录或者注册.
点评
B Color Smilies

您还可以输入:个字符
X

X

TOP

 

B Color Image Link Quote Code Smilies
高级模式 | 发新话题

您需要登录后才可以回帖 登录|立即注册

快速
返回顶部
返回首页