2005年09月24日

DV的采集、编辑和压缩[教学] 
影片拍好了,可以直接放在DV带上保存,以后就用DV机回放,也可以采集到计算机里,编辑后回录到DV带上,还可以采集到计算机里,直接把DVAVI文件刻到CDR上去保存,也可以压缩成MPG,刻成VCD或者SVCD,DVD保存。MPG是有损压缩,不管是压缩成什么格式,对画质都有损失,但是刻MPG盘保存还是最常用的方式,我想主要是这么几个原因:

1、DV影片的回放在电视机上的表现远强于在CRT上的表现,尽管CRT的分辨率要高得多,主要是因为电视的设计就是为了显示动态画面,所以在亮度、色彩鲜艳上都比显示静态为主的CRT要好,而普通电视的显示分辨率只有320线,那么DV的高达720×576的分辨率根本用不着,不管是VCD的352×288还是SVCD的480×576都够了,所以尽管压缩成MPG画质有损失,但是在电视上基本是看不出来的。在电脑上看,SVCD的分辨率也足够清晰了。

2、DV带的保存是个问题,毕竟是磁带,DV带还用得时间不长,但是以前的录音机磁带时间长了粘连和发霉大家估计都见过的。而CDR光盘蓝盘、绿盘一般是保存30~50年,金盘号称能保存100年,虽然光盘也有发霉的可能,但是毕竟好得多。

3、播放的方便性上,也是光盘强,DV带就得把DV机搬出来,还只能在电视上看,对磁头也是个磨损,倒带也很麻烦,而VCD,SVCD光盘有多方便就不用我说了。

4、再算个经济帐,DV带是25~30一盒,CDR是1.5一张,象我3月买机到现在,已经刻了45张左右的SVCD,CDR成本是不到70块,如果换成DV带,大概要30盘左右,就算用LP模式也要20盘,这就是好几百块啊。现在1394卡和刻录机都很便宜了,而且这两样东西买了也还可以做别的用的。

要做什么想好了,下面就是该怎么做了,现在的DV机上一般都有两个连接计算机的接口,其中一个是接串口或者接USB口的,这个一般是采集静象用的(有些带MPEG1压缩的DV可以通过USB口采集MPEG1格式,不过效果较差),另外一个就是我们采集DV视频要用到的1394口了,全称是IEEE1394,也叫FIRELINE(火线),SONY机上叫I。LINK,在DV机上是4针的小口,一般电脑上的1394口是个6针的大口。

采集的第一步是安装1394卡(当然有了1394口的计算机就没这一步了)。把卡插在你的计算机的PCI插槽里(笔记本要买PC卡的外置1394卡),然后开机,WIN98SE、WIN2000、WINXP这些**作系统都可以自动找到1394设备并且自动安装驱动程序。如果发现1394卡不能正常工作,请先把计算机的主板驱动和补丁程序装齐,不行再试试修改一下冲突设备的中断或者换个**作系统。必须说明的是,1394卡有不同公司的芯片,不是所有的1394卡都可以兼容所有的主板的,一般来说TI芯片因为做得比较早,和主板兼容性比较好,而VIA芯片的卡和VIA自己的主板当然没问题,但是在和别的主板配合时容易出问题。如果办法都用了还是不能正常工作,那就是主板和1394卡不兼容。所以购买1394卡时要和商家说明,不兼容的卡包换包退。

1394卡安装后,在设备管理器里能看到正常工作的1394设备就OK了。1394口是支持热插拔的,不过我的习惯是计算机不用关,但是DV还是关了再插线,主要是我觉得DV比较娇贵,计算机反正是个粗笨的东西,随便折腾。

采集的软件有很多,会声会影,PREMEIRE,DVSTUDIO7都是比较常用的。一般认为,采集功能上DVSTUDIO7是做的最好的,界面很漂亮,而且采集的画质也比别的软件好那么一点点。不过DVSTUDIO7是品尼高的软件,不是所有的1394卡都能用的,一般用会6或者PR6也就可以了。

采集对计算机的要求并不是很高,一般的塞样CPU,5400转硬盘都可以做到不掉帧,有些朋友采集的效果不好,一般是因为主板芯片组是VIA或者SIS的,这些公司芯片的主板磁盘性能不如INTEL的,而且需要装主板驱动才能打开DMA,如果DMA没打开磁盘性能会很差,一般情况下硬盘是不需要设置的,不过有时硬盘的DMA也没有打开,就需要到硬盘生产厂的网站上下载一个设置程序进行调整。采集时不要做别的事,也尽量减少后台程序的运行。笔记本电脑的性能普遍比PC机差,特别是磁盘性能,笔记本的硬盘现在也只做到4200转,单碟容量又小,老一点的笔记本采集掉帧很正常。所以笔记本来做采集编辑不是件明智的事情。

采集和视频制作推荐使用WIN2000系统,稳定,而且是NTFS文件格式,WIN98的FAT32文件格式最大只能生成4G的文件,DV采集1小时大概是14G,所以在FAT32下一次采集只能限制在18分钟以内。NTFS就没有这个限制了。

1394口采集到计算机里是未压缩的DVAVI文件,建议先编辑再压缩,压缩成MPG后再编辑当然也可以,不过要反复解码编码,速度慢很多。编辑软件一般家用就用会6就可以了,界面简单,容易上手,基本功能都有,买个正版也很便宜。追求一点准专业效果的可以考虑使用PR6.5,功能很强,还可以带各种插件增加功能,不过学起来就没那么容易。一般的编辑就是加点字幕,加点配音,调调亮度,做一点片头和转场,不过要记得一点,转场效果不要滥用,开始是新鲜,用多了就看得眼花缭乱冲淡了主题。学习软件的使用多看看帮助文件,特别是会6,全中文的帮助文件很详细。至于PR6,网上有电子教材可以下载。

编辑完了后,可以回录到DV带,一般就要开始压缩成MPG了。推荐压缩成SVCD(SUPERVCD)格式,VCD是MPEG1编码,效果比较差,达不到播放要求。而DVD格式现在DVD刻录机还很少,刻在CDR上的MiniDVD也不好,首先是MINIDVD和真正的DVD还是区别很大,5。1声道是没有的,而且MINIDVD相比SVCD画质的提高并不明显,但是存储文件却大了很多,性价比(这里借用这个词)不高,做MINIDVD还不如直接保存DVAVI文件算了。

所有的编辑软件都可以压缩,不过效果最好的还是TMPGENC,是个日本人写的免费软件(MPEG2功能要注册,不过可以破解),也就是我们一般说的小日本。新版本的TMPGENC都带了模板,模板中已经存储了各种压缩格式的参数,一般情况下这就是最佳参数了,所以不是真的很懂不要去自己调了。TMPGECN压缩的速度比较慢,因为压缩的速度和画质是成反比的,又快又好的软件是不存在的(又慢又差的倒是有可能),如果对画质要求不高,要求快一点,有很多软件的压缩速度都比TEMGPNC快得多,大家可以自己试试。我还是用TMPGENC,把多个项目文件做好,打开批处理,把项目文件加进去,然后运行,再选上压缩结束后自动关机,然后关掉显示器睡觉去,计算机又不怕辛苦,最多是多费点电而已。

PR6编辑过的AVI文件可能TMPGENC不认,这个问题只要在TMPGENC的系统设置里把DIRECTSHOW的优先级调高就可以了(选了DIRECTSHOW后按右键就知道怎么调了)。TMPGENC还有一个很实用的功能,它用来做MPG文件的剪切拼接是最方便不过了,在MPEG工具里就能看到,由于不进行重新编码,速度很快。

谈到这里,讲讲视频编辑用什么计算机好,其实采集本身对计算机要求很低,视频编辑对CPU和硬盘,主板性能都要求比较高(但是对显卡的3D能力完全不需要),论坛上也讨论过用INTEL还是AMD的CPU好,我的个人看法,还是INTEL,我知道AMD的东西价格便宜量又足,但是有三个原因让我选择INTEL:1、我看过微型计算机的测试,同频的CPU中INTEL的P4在视频流媒体处理上还是高出一筹。2、AMDCPU配的主板性能太差,特别是在对视频制作很重要的磁盘性能上,不管是VIA、SIS还是AMD自己的主板,都比INTEL的BX、815、845这些主板差一些。3、就是AMD的CPU发热大,而且温度保护做得不好,象我前面说的自己睡觉让计算机去压缩,换了是AMD的CPU我就会担心了,万一风扇不转了是会烧机器的,INTEL的最多死机而已。

压缩成MPG了,就要刻盘保存,当然还是刻SVCD盘,如果直接把MPG文件刻到盘上,就只能在电脑上看了。据说最好的刻SVCD软件是VIDEOPACK,我一直用的是刻录机带的NERO,我觉得也很好用,选了SUCD格式,把MPG文件拖到文件窗口就可以了,NERO会检测一下文件格式,如果不符合标准格式会要求重新编码,TMPGENC出来的文件都不会有问题,如果是什么超级解霸做出来的MPG一般就不认了。

刻好的SVCD盘有时候在VCD机上放不出来,首先要看你的VCD机是不是支持SVCD格式,然后注意刻盘的时候要封盘,如果还不行试一下降低刻录速度,再不行估计 是VCD机就不支持CDR刻录盘,因为市面上卖的光盘是压制的,CDR是染料烧制的,压制的盘信号反射比CDR强得多,如果是这个原因,那就没办法了。

DVD刻录全攻略 
1:DVD-VIDEO光盘文件结构 
  正常情况下DVD影碟有以下2个目录: 
  AUDIO_TS预留给DVD-AUDIO的目录 
  VIDEO_TS存储所有DVD-VIDEO(包括音频,视频,字幕等)所有数据的目录 
  注意:DVD-AUDIO是指只有AUDIO数据的DVD光盘,我们通常说的DVD影碟是指DVD-VIDEO碟一个标准的VIDEO-TS目录中包含有3种类型的文件VOB、IFO、BUP VOB文件视频目标文件(Video OBjects) 
  VOB文件有视频、声音、字幕数据流组成。视频数据流是MPEG2格式,音频数据流是AC-3或者LPCM、MPEG2、MP2、DTS等,AC3基本上是事实的标准,MPEG2多声道只在极少数2区碟上可以看到(比如In the line of fire,2区)。MP2只在非出版级DVD上有等。PCM是高质量的无压缩数字音频,因此需要太多的空间,并不适合用于DVD电影光碟。AC3的数据率介于192~448KBPS之间才, 192KBPS用于双声道,384~448KBPS用于5.1声道。 
  一个VOB文件可以包含一个主要的视频数据流和几个多语种伴音和字幕。最大视频数据率是9.8MBPS,视频和音频数据率总的上限是10MBPS。一张DVD最多可以有9种伴音和32种字幕。 
  IFO文件 - InFOrmation 
  IFO文件告诉DVD播放机浏览信息:比如章节的开始时间,伴音流在哪里,字幕在哪里。也就是讲,VOB文件是电影本身,而相 应的IFO文件把组成电影的各个片段有机连接起来。这样DVD机才"懂"得如何播放。 
  BUP文件 - 备份文件(BackUP) 
  和IFO文件完全相同,是留在如果IFO文件出错的时候,DVD播放机也可以通过IFO来得到相应信息。从这里你也可以看到IFO文件的重要性,所以还有相应的BUP备份文件。 
  一个实际的例子 

  VTS_TS.。IFO/BUP文件是第一个被播放的文件。就象程序安装光盘一样,第一个要找的就是AUTORUN文件,然后就可以自动执行。DVD机会先找到VTS_TS文件,然后再执行相应的**作。通常VTS_TS是版权信息FBI警告和杜比数字的介绍片段,有时包含菜单。(在我们的例子中,VTS_TS.。IFO/BUP就包含标题菜单,菜单的图像文件是VTS_TS.OB。)VTS_01_0.IFO前两个数字是标题数字。例如:VTS_01_*是标题1,VTS_02_*是标题二。很显然,最多可以有99个标题,每个标题最多可以有10个VOB文件。由于通常都有一个含有菜单信息的VTS_XX_0.VOB,因此每一个标题至少会有2个VOB文件。 

2:DVD-VIDEO兼容VIDEO,AUDIO标准 
DVD-VIDEO兼容的视频编码标准 
NTSC(525 lines @ 59.94 Hz) PAL (625 lines @ 50 Hz) 
帧尺寸(Frame size) 720 x 480 720 x 576 
帧速率Display frame rate 29.97 fps 25 fps 
Group of pictures (GOP) size 36 fields/18 frames maximum 30fields/15 frames recommended 30 fields/15 frames maximum 24fields/12 frames recommended 
GOP structure GOP结构 Closed. IBP or IBBP 
Output aspect ratio 4:3 (标准) or 16:9 (宽银幕) 
Bit-rate(CBR or VBR码率 Minimum 2.0 Mbps Maximum 8.0 Mbps 
Profile and level Main profile and main level (MP@MLVBV buffer size 224 KB (1,835,008 bits) 
GOP sequence header interval 1 per GOP (one sequence header before every GOP) 
Filename extension文件扩展名 .m2p, .m2v, .mp2, .mpg, .mpeg, .mpv 

DVD-VIDEO兼容的音频编码标准 
PCM MPEG2 MP2 AC-3 
Sample rate 48 kHz 48 kHz 48/96 kHz 
Sample size采样精度 16 bits 16 bits 16/24 bits 
Number of audio streams 1 
Number of audio channels声道数 1 (mono) or 2 (stereo) 1 or 2 2 or 5.1 
Filename extension文件扩展名 .aif, .aiff, .wav .MPA .MPA 

3:刻录软件 
  常见的支持DVD-VIDEO刻录功能的软件可分为三类: 
  纯刻录软件:主要是NERO 
  NERO从5.5.5.7版本以上支持DVD的刻录,但它没有文件生成功能,要先用其他软件生成。IFO/BUK/VOB结构的文件再用NERO来刻录。这种软件缺点是要配合其他软件才能使用,优点是对刻录机和盘片的兼容性好,刻碟也比较稳定。
  带文件转换功能的刻录软件:主要是VIDEO PACK ,VIDEO PACK从5。0开始支持DVD-VIDEO光盘的刻录,它集成文件转换功能,只要是符合标准的MPEG2文件就可以直接刻录(值得一提的是VIDEO PACK5有MPEG 文件的音视频分离和复合的功能,而且速度特别快),它的缺点就是有一些压缩卡或 软件压缩出来的MPEG2文件不符合VIDEO PACK的标准就无法刻录了。 
  
带编码和文件转换功能的刻录软件 
  严格来讲这种软件不能叫做刻录软件了,他们实际上是集成了DVD-VIDEO刻录功能的采集/非编软件。像: 
  ULEAD的 VIDEO STUDIO6 
  INTER VIDEO的WINDVD CREATOR 
  SONIC的SONIC MYDVD 
  MEDIOSTREAM的NEO DVDPLUS(通常这些公司还有一个把DVD刻录功能独立出来的软件,但基本上都不怎么样) 
  这些软件现在有很多,都支持从1394卡直接压缩成MPEG2文件(类似DV3000XP的功能),可以对这些文件进行非编处理,再转换成DVD格式文件进行刻录。
  也可以导入压缩卡(例如DV4000)或其他软件生成的MPEG2文件刻录成DVD-VIDEO碟。但由于兼容性的问题,有时会要把这些 MPEG2文件重编码,费时费力,还可能损失画质。 

具体评价见下表(个人意见) 
压缩质量 CPU要求 非编功能 转换和刻录 其他 
VIDEO STUDIO6 好 P4 1.8 最多 差 
WINDVD CREATOR 差 以上 简单 一般 
SONIC MYDVD 简单 还可以 对其他压缩卡或软件生成的MPEG2文件兼容性比较好 
NEODVD PLUS 很好 P41.8 只有剪切 对DVD-R兼容性不好 可以生成文件给NERO刻录,DVD菜单生成功能很好用。

4:总结 
  一个DVD-VIODEO盘的制作过程基本是: 
注意点: 
  1.用软件生成MPEG2文件的话,尽量用同一个公司的刻录软件,避免兼容性问题。 
  2.用硬件压缩卡的话,多试几个刻录软件,看哪一个对压缩卡生成的文件兼容性好一点。 
  3.因为VOB文件最大不超过1GB,所以不要一次录太大的MPEG2文件(建议一次录不超过十分钟)。

DVD 刻录名词解释(转) 
DVD 刻录名词解释
由于越来越大量档案的需求,或在影片的剪辑备份,DVD 刻录机已然成为近来的热门话题,也有越人越多人准备选购刻录机. 由于单片容量就高达 4.7GB,是一般 CD-R 光盘片容量的七倍之多. 要是您很久没有到市场晃晃,您会发现目前市场上可供选择的刻录机竟然有不少台,又依规格之不同,有 DVD-R/DVD-RW/DVD-RAM/DVD+R/DVD+RW 这五种规格,但以刻录机产品而言,使用者可以看到的会有三大类产品,这些产品统称为纪录型 DVD,可允许数据之纪录与保存,在您选购之前,我们先对各种规格作简要的介绍与说明.

什么是DVD-RAM?

  DVD-RAM这个规格,早在1997年就已经被DVD Forum 所完成确认,推出的时间最早. 负责主导开发的主要公司会社为日本Panasonic、日本HITACHI、日本TOSHIBA,以及后期才加入的日本Victor。DVD-RAM系统之所以这么早就被开发出来,而且这么快就被DVD Forum所承认,原因其实就是在于这几家负责主导的公司会社,就是负责制定DVD-VIDEO等DVD规格的原班人马,正因为这样,DVD-RAM规格成为了DVD Forum最初主要的可覆写式DVD 的代表。

  DVD-RAM 必须在专用的 DVD-RAM 刻录机或录放机上才能读取,所以兼容性相较于 DVD-RW 或是 DVD+RW 较差. 但是 DVD-RAM 的优点在于非线性的数据存取,可允许随机方式存取数据, 用起来就像硬盘一样,可以随意删除或增添档案片段,所以其最大的性能优越就在于数据的存取上,它的特点为具备卡匣式包装,最初开发的 DVD-RAM 1.0 版本 只有 2.6GB 以及双面5.2GB容量,必须放在专用塑料外壳内使用,像MO,MD一样,同样因为与DVD-ROM容量不兼容的问题,也发展出DVD-RAM 2.0 版本.具备 4.7GB(单面)与 9.4GB(双面) 的DVD-RAM盘片.

什么是DVD-RW?

  有鉴于DVD-RAM卡匣式设计,加上DVD-RAM 的种种不便,无法普遍应用在 DVD 相关家用器材,DVD-RW 因此而诞生。它也是受到 DVD Forum 所认可的唯一标准的规格, 此外, 因为DVD-R/RW的规格是世界DVD制定协会所制定的, 也是最具未来扩充性互换性的规格.

  DVD-RW全名为DVD Re-recordable, 思是可覆写型DVD-R,顾名思义它像DVD-R的功能一样,但是可以重复读写, 有点类似 CD-RW的延伸,它的规格由Pioneer主导建立, 容量为4.7GB.

  现今,具备高画质高音质的DVD,为新一代的娱乐开启另一片天空. 除了家用型DVD 播放机之外,DVD还有另一个鲜为人知的一面. CD音响,CD-ROM,甚至CD-R/RW已经广为被大众所接受,但现在我们也可以制作属于自己的DVD了!不论是与电视连接录像,与PC连接在DVD上纪录属于自己的影像作品等,都不再是梦想, 这些都是 DVD-RW 所提供的新娱乐功能.

  同时由于可重复写入之规格,使用者可以作为 DVD 影片的预录,尝试在 DVD 袯放机先试看效果,之后再决定烧入 DVD-R盘片之中,虽然不如 DVD-RAM 为非线性存取功能, 但低成本以及可靠的影像纪录为其最大之优点! 

什么是 DVD-R?

  由于越来越大量数据的需求, DVD FORUM在DVD-R规格的制定上,就采取了以下四点作为基础: 

DVD-R是采用和 CD-R相同的新型纪录系统 
DVD-R光盘片在记录完成之后,具有对于一般DVD拨放机100%的互换性。 
支持Multi Session的纪录方式。 
DVD-R光盘片具有极高的Cost/Performance值。 
  DVD-R是由Pioneer公司所主导发展的可写一次DVD规格, 最早发展的盘片容量是3.95GB,后来又发展出4.7GB的DVD-R光盘片, 版本 2.0. Pioneer 在推出 DVR-A03这款刻录机之后, 降低刻录机雷射头成本及盘片的染料成本,使得DVD-R价格得以大众化, 目前DVD-R 的应用主要为 DVD-R for General,意即为提供一般消费者使用, 市场上可以很容易买到的DVD-R空白片,一般都是DVD-R for General 的光盘片, 且为版本 2.0/ 4.7GB 之规格. 

DVD-R的应用br /> 
  DVD-R的使用方式如同CD-R一般,可以用来记录 DVD 影像及数据,除了 PC 用刻录机外, Pioneer 也同时推出采用 DVD-R 储存媒介的家庭影音用的录像机,例如DVR-2000, DVR-7000这些家用设备,使得DVD-R/RW可以完全取代过去的影带式录像机,得到高画质,搜寻快速,携带方便,兼容性高的影片不再是难事. 

DVD-R发展现况: 

  各家厂商无不积极生产兼容于DVD-R的刻录机,录像机等相关产品,像是日本松下在其DVD-RAM的刻录机及录像机上就力求可以兼容DVD-R的刻录工作,DVD-R发展成为下一代主流储存媒体的态势明确, 目前盘片价格也是目前成本最低, 使用者接受度最高的储存媒体. 目前所有于近期新推出的刻录机均支持了 DVD-R 刻录规格.

什么是DVD+RW? 

  DVD+RW 是由日本SONY、荷兰PHILIPS、日本RICHO以及美国HP这几家会社,所共同推出。其等在评估过由日本Pioneer所领军的DVD-RW系统之后,还是决定推除由其等所独自的另外一种DVD系统─DVD+RW规格。

  不过此规格并没有正式受到DVD Forum的承认,所以DVD+RW可以说是处在一种有些尴尬的状态,虽然强调和其它DVD家族成员有互换性,但是却又被DVD家族排拒于门外,原DVD Forum一直到目前还是不承认DVD+RW这个系统。因此DVD+RW虽然目前是设计成兼容于其它DVD家族成员,但是仍然没有正式受到DVD Forum的承认,其注册商标上只有 RW 两个字.

  目前推出的最新规格为 DVD+RW Version 2.0, 重点在于达成和 DVD 播放机的高度互换性,使之能够在 DVD 播放机上进行播放. 并具备类似 DVD-RAM 的非线性存取架构, 在储存资料上可以提供随机存取的功能. 不过由于发展时程较晚,因此在 DVD+RW 光盘片的成本以及能见度上都较低. 由于DVD Alliance已经放弃了原先片面记录容量3.0GB的DVD+RW Version 1.0规格,因此目前在市面上发售的机材制品,绝对都是属于DVD+RW Version 2.0的最新锐架构。

什么是DVD+R?

  既然 DVD Alliance已不顾原DVD Forum,自行开发其它更优秀的系统,那么干脆就一不做二不休,在一次写入DVD的方面也采取独自设计建构的路线DVD, 推出 DVD+R 规格, 与 DVD-R 互别苗头。正因为如此,在以日本SONY、荷兰PHILIPS、日本理光以及美国HP等主要会社为首的DVD Alliance也决定放弃原DVD FORUM所承认的DVD-R架构, 再推出另外一种新的方式─DVD+R架构。

DVD+R Version 1.0

  DVD Alliance就些微改进了原DVD-R系统的光盘片架构,以及雷射头的记录/播放方式,让DVD+R的光盘片采用和DVD+RW系统相同的分布式物理位址架构,这么一来,就可以实现让使用者在记录「一次」数据之后,还有可以继续使用剩余的光盘片数据记录空间!换句话说DVD+R系统是允许使用者用「多次」的方式来「分批」记录数据的, 与 DVD-R 同样属于一次写入的系统架构.

什么是DVD MULTI?

  从1975年民生用录像系统诞生到现在,中间虽然经历了无数次的系统规格大战,交战的双方都是来自于不同的系统规格,这当然是无可厚非。但是这一次系统大战的双方,却都是来自于相同的「DVD」规格,都是DVD Forum所承认的! 因此DVD Forum当然不会坐视不管。另外一方面,不顾DVD Forum反对,执意推出DVD+RW系统的DVD Alliance联盟中,亦也有许多主要会社如日本SONY、荷兰PHILIPS等,本身也是DVD Forum中的一员!这么一来,也就发生了敌我无法分别的奇特状况, 情况更为复杂!

DVD MULTI的提出

  在这种相同性质的各种系统相互乱立状况之下,由于各个DVD阵营之间相持不下,因而导致许多公司观望都不敢冒然使用,所以造成 DVD 刻录阵营更加延缓了其自身的普及速度!

  关于这样的严重问题,各个记录型DVD的阵营其实都是相当了解,不过,由于DVD-RAM以及DVD-RW都是两方阵营投下大笔资金所开发出来的成果,其中DVD-RAM更已经投入PC市场量产四年了,不可以说停就停,因此DVD Forum就想出了一个两全其美的方法。而这个解决自己人互斗之系统大战的方法,就是DVD MULTI!

什么是DVD MULTI?

   DVD Multi 并非是一种新规格,DVD MULTI为什么在「DVD」和「MULTI」之间没有一横,DVD Forum绝对没有再创造出何新的规格,DVD MULTI所定义的用意, 主要在于规格之整合, 并加速 DVD 阵营的快速普及.

DVD MULTI架构的现时状况

  这么一来,不但可以完全解决DVD-RAM以及DVD-RW自家人互斗的尴尬局面,也可以让使用者不必再花时间选择要用什么系统! 好处多多, 不过,由于采用DVD MULTI方式同时对应多种规格, 因此成本增加势难避免! 而这可能就是采用DVD MULTI架构下唯一的缺点吧。

  虽然DVD MULTI方式目前已经由DVD Forum完成其在架构上的规范,不过另外一方面,由于不受DVD规格制定小组承认的DVD+RW规格同样也是来势汹汹,再加上DVD+RW阵营也承认DVD-RW和DVD-R两规格的趋势,因此在由DVD MULTI统一DVD Forum所承认的纪录型DVD,也就是DVD-RAM以及DVD-RW之后,和DVD Forum相抗衡的DVD Alliance,亦会推出以DVD+RW、DVD-RW、DVD-R、DVD+R以及从来CD家族所组成的「另外一种DVD MULTI」兼容架构!这么一来,另外一场系统联盟大战,也就是势必难以避免…

DVD Multi 的两组人马

  所以以现实点来看,所谓的 DVD Multi 目前也发展出两个阵营,一为 DVD-RAM/DVD-RW/DVD-R 之复合规格,另一个就是 DVD-R/-RW DVD+R/+RW复合规格。目前已有不少刻录机成品推出到市面上,行成另一场 DVD 规格大战。比较诡异的是 Hiticha 也在 2003 三月宣布推出结合目前所有DVD规格包括 DVD-R/DVD-RW/DVD+R/DVD+RW/DVD-RAM 等五种规格的刻录机, 算是目前唯一的第一台


看懂DVD光盘的文件

说道DVD格式,一定很多用户都会说这有什么难的,DVD只不过就是把视频信息和音频信息放在不同的文件中。对,你说的没有错,不过说的不是很对,虽然DVD的音频和视频是分开播放的,但它们却存放在一个文件系统中。那么,DVD光盘中那么多文件到底是干什么用的,而DVD盘片里面到底存放了多少信息,以下我们就来简单看一下。 
  DVD确实分成两个部分,不过DVD的视频和音频部分都存放在一个文件中,这个文件的标准的存储格式在计算机文件格式中称为-MicroUDF文件系统,这种文件规范属于UDF文件的一个子集,那么很多用户可能又会对UDF文件格式感到茫然了。UDF文件格式其实是针对ISO9660文的不足而推出的文件格式,ISO9660是目前CD和CD-R读取/刻录使用的标准文件格式,光盘上存储数据的文件结构和目录形式在刻录之前就已确定,因此无法更改,当然也无法追加刻录新的数据。 
  另外,操作系统无法识别CD-R和CD-RW,用户必须要使用各种刻录软件才能进行ISO9660文件格式进行读写操作,这样就给用户带来很多不便。针对这一状况,国际标准化组织属下的光学存储技术协会(OSTA)于1996年发布了一种新的通用光盘文件系统――UDF文件系统。它采用Packet Writing包刻录方式,许在CD-R或CD-RW光盘上任意追加数据,为CD-R和CD-RW刻录机提供了类似于硬盘的随机读写特性。UDF的另一突出优点是可以防止出现缓存器欠载情况。 
  在使用包刻写方式时,刻录机可以在缓存器积累足够数据之前等待任意长的时间,即使主机输出的数据流速度大大低于刻写速度,也不会出现中断刻录过程而使盘片报废的情况。这么说可能大家还不是很容易理解,在著名刻录软件Nero-Burning Rom中的DirectCD刻录和Easy CD Creator中的Easy CD Creator Delux、Sony刻录软件中的FileCD程序都是遵循了UDF规范的软件,因此使用这种软件后我们可以像使用硬盘一样使用CD-RW光盘,不过前提是我们必须通过这些软件来把光盘变为UDF格式。另外如果光盘采用了UDF文件系统后只能在具有MulitRead功能的CD-ROM上读取。对不支持MulitRead功能的CD-ROM来说,使用相关软件的支持也可以读取UDF文件系统。UDF文件系统支持的操作系统为Windows9x/NT,OS/2,Linux,MAC OS等(或以上版本的)操作系统。 
  那么说了这么多东西,我们看起来MicroUDF文件系统和DVD有和联系呢?为何DVD又会采用MicronUDF格式的文件系统呢?其实很容易理解,因为ISO 9660的规范是目前所有光驱识别的格式,那么如果DVD采用这种文件格式,当然即使使用CD-ROM都可以识别DVD盘片了(呵呵,其实这个一个玩笑回答,因为DVD和CD盘片的密度是不同的根本不存在能识别的可能性)。其实使用UDF文件格式还是为了可写式DVD而服务的,因为目前DVD写入方式没有统一的标准,但如果再去开发复杂的文件格式,这样的话刻录出来的DVD盘片在普通的DVD驱动器上就无法实现了。并且采用UDF文件格式实现更加容易,可以节省DVD格式开发的周期。既然采用了MicronUDF格式,因此DVD盘片会在物理上遵循一定的规范,由于MicronUDF格式并没有指定一个头信息排序,因此如果要让DVD播放器可以识别就必须通过固定的文件存放规范或者格式。所DVD的视频内容都存放在一个固定的文件夹下--VIDEO_TS目录。 
  不过即使打开了这个目录还是会让很多不了解DVD格式的用户感到迷惑的,因为这个目录下包含三种类型的文件:.VOB文件、.IFO文件和.BUP文件。这些文件分别干什么用的呢?以下慢慢解释:.VOB文件用来保存所有MPEG-2或MPEG-1格式的音视频数据。这些数据不仅包含影片本身,而且还有供菜单和按钮用的画面以及多种字幕的子画面流。而.IFO文件则是控制.VOB文件播放的,这个文件中可以找到有关怎么样以及何时播放.VOB文件中数据的控制信息。由于.IFO文件对于保证光盘的正常播放是至关重要的,因此.IFO文件的副本保存在.BUP文件中。所以从这些文件的格式的作用我们也应该知道文件是如何排列的了:IFO-VOB-VOB…-BUP。在每一个DVD光盘中都应该有视频管理器 (VMG)。视频管理器存放在一个VIDEO_TS.IFO文件,它保存光盘的全局信息,比如光盘可以在哪个地区播放。同时,还保存如何显示可选菜单的信息。其中用于显示菜单的数据保存在VIDEO_TS.VOB文件中。当光盘插入到光驱中时播放器首先显示这个菜单。大多数菜单可以让观众跳到影片中指定场景,选择语言字幕以及观看增加或删除的场景等。在每一个DVD视频光盘中至少应该有一个视频节目(video title)。这个视频节目包含实际呈现给观众的信息,比如一部电影。其他的节目可以包含剪辑下来的场景、影片预告、拍摄花絮或者其他的信息。 
  不同的视频节目存储在名字为VTS_xx_y.VOB文件中,这里\"xx\"是节目编号(从01到99),\"y\"是从0到9的编号。由于MicroUDF系统中一个文件最大只能1 GB,因此大多数影片不得不保存在多个文件中。VTS_xx_y.IFO同样提供所有相应的VOB文件音视频格式的信息。 
以下是视频管理器(VMG)使用的IFO文件和其它IFO文件内存放的信息: 
视频管理器使用的IFO文件结构如下: 
1.视频管理器信息管理表:其主要包括区域代码管理、视频属性(MPEG-1还是MPEG-2,PAL还是NTSC,长宽比4:3还是16:9, 全景和扫描Pan&scan模式还是信箱模式Letterbox还是二者兼有以画面的分辨率),音频属性(杜比AC-3还是MPEG-2,MPEG-1或者PCM声音编码方案,量化还是动态范围控制数据、采样率以及通道个数)以及编码模式和子画面流的个数。 
2.节目搜索指针表:描述在哪个视频节目集可以找到哪个节目,怎么样连接到其他节目中以及相应VTS的起始地址。 
3.视频管理器菜单PGCI单元表:提供不同语言下VMG菜单的指针。 
4.父母锁定管理信息表(这个就不用解释了吧) 
5.视频节目集属性表:保存光盘中每个VTS属性信息的副本. 
6.文本数据管理器:保存光盘或者每个节目的卷名、节目名、唱片名和/或制片人名字 
7.视频管理器菜单单元地址表:存储视频管理器VOB中所有单元的起始和结束地址。 
8.视频管理器菜单视频对象单元地址图:提供所有VOB单元的起始地址。 
VTS使用的IFO文件结构如下: 
1.视频节目集信息管理表:包含VMG 信息表中描述的所有VTS信息,供VMG 使用 。 
2.视频节目集节目部分搜索指针表:仅保存节目部分的指针,通过它可以播放节目。 
3.视频节目集程序链信息表:这里保存指向程序链信息(PGCI)的指针。PGCI描述如何显示VOB文件(包括对不同音频/子画面流的控制,用户控制约束等)。 
4.视频节目集菜单PGCI单元表:提供不同语言下VTS菜单的指针。 
5.视频节目集时间图表:描述VOB文件中的图像在每个时间的位置。 
6.视频节目集菜单视频对象单元地址图:视频节目集单元地址表 
7.视频节目集视频对象单元地址图 
  通过以上的介绍,我们应该明白一个简单的DVD光盘的格式和每个文件的作用,由于目前DVD具有防拷贝功能,因此转录DVD或保存只能通过保存或者修改一些文件才能进行,不过具体这些方法属于机密,在这里我没有办法透露。希望大家不要生气哦。呵呵,其实这里还是留给大家一些可以去研究的问题比如DVD的区域破解、父母控制,怎样把DVD的播放顺序和时间更换,怎样剔除不必要的文件,怎样……,不成不能说了,否则DVD规范的制订者说不定会来砍我的。



找到一个很好的FLASH教程下载专区

http://bbs.flash8.net/bbs/dispbbs.asp?boardID=49&ID=219483&page=1

][设计资源]200多款PS笔刷(带展示图)
这是偶整理国外的royvered网站的photoshop设计笔刷,艺术价值很高,希望对大家的工作有帮助

技巧提示:如果嫌文件过多下载麻烦的话,可以通过“鼠标右键盘–用迅雷(网际快车)下载全部连接”

按此在新窗口浏览图片


点击浏览该文件

—————————————————————

按此在新窗口浏览图片

点击浏览该文件

—————————————————————

按此在新窗口浏览图片

点击浏览该文件


<<大量笔刷下载>>

第 2 章 ActionScript2.0 编程基础

通过第 1 章的学习,初步认识了 ActionScript2.0 。 是不是想马上动手制作 Flash 交互动画或者 Flash 应用程序了?别着急,万事开头难, ActionScript 编程基础很重要。要学会 ActionScript2.0 编程,必须先理解一些基本 的术语和概念。
本章将介绍变量和常量、变量的数据类型、运算符和表达式、路径等一些基本知识,在此基础上,认识 Flash 中的坐标、角度和影片剪辑的属性。利用这些知识,可以制作一些简单的效果如直线运动等。

2.4.2 相对路径
在一个学校中有校长、老师、学生,老师中又有语文老师、数学老师等。校长和老师之间有信息交流,老师和学生也有信息交流等。
一个 Flash 影片好比是一个学校,可以由多个影片剪辑组成,这些影片剪辑中,可以有自己的时间轴,有自己的变量等。影片剪辑之间是怎样进行交换信息的呢?这与 Flash 中的路径有关。

2.4.1 绝对路径
如果校长要找学生,可以这样进行,校长先找到下一级的老师,老师再找下一级的学生,表示如下:
校长 . 老师 . 学生
主场景( _root )好比是校长,主场景中的影片剪辑( mcA )好比是老师,影片剪辑( mcA )下的影片剪辑( mc1 )好比是学生,如果要在主场景中访问影片剪辑 mc1 ,用如下方式:

_root.mcA.mc1; 

在 Flash 影片中从起点(如从主场景开始)调用变量或影片剪辑,这样的语法称为绝对路径。它简单、容易理解,但移植性差。
范例 2-13 :使用绝对路径
( 1 )打开 Flash MX 2004 ,新建一个 Flash 文档。
: 当建立一个新文件时,出现在面前的场景即主场景,用 _root 表示。
( 2 )在主场景中建立一个实例名为“ mcA ”的影片剪辑实例,双击 mcA 进入元件的编辑场景,建立一个实例名为“ mc1 ”的影片剪辑实例。在【时间轴】的上方可以显示出影片剪辑实例的顺序。如图 2.18 所示。

图 2.18 影片剪辑实例的顺序
( 3 )返回主场景,新建一层,单击此层的第 1 帧,打开【动作】面板,输入下列代码:
trace(_root.mcA._width);
// 输出影片剪辑实例 mcA 的宽度
trace(_root.mcA.mc1._width);
// 输出影片剪辑 mc1 的宽度
( 4 )测试影片,观看【输出】面板中输出的数据。
( 5 )返回主场景,把主场景第 1 帧中的代码中改为:

trace(mcA._width); 
trace(mcA.mc1._width); 

测试影片,结果是一样的。
从测试结果可看出,在主场景中使用绝对路径,可省略 _root 。
( 6 )返回主场景,把第 1 帧中的代码加上注释,在主场景中加入一个按钮,单击按钮,打开【动作】面板,输入下列代码:

on (release) { 
trace(_root.mcA._width); 
trace(_root.mcA.mc1._width); 

测试影片,单击按钮,观看测试结果。
( 7 )返回主场景中,把按钮中的代码改为:

on (release) { 
trace(mcA._width); 
trace(mcA.mc1._width); 

测试影片,单击按钮,观看测试结果,测试结果不变。
从测试结果可看出,主场景中的按钮上的代码可以看成是在主场景中的时间轴上执行,所以可以不加 _root 。
( 8 )返回主场景,把按钮中的代码加上注释,双击场景中的影片剪辑实例,在第 1 帧上加上下列代码:

trace(_root.mcA._width); 
trace(_root.mcA.mc1._width); 

测试影片,结果与前面相同。
( 9 )关闭测试窗口,把第 1 帧上的代码改为:

trace(mcA._width); 
trace(mcA.mc1._width); 

测试影片,结果错误。
从测试结果可看出,影片剪辑有自己的时间轴,它的代码是在自己的时间轴上执行,所以必须加路径 _root 。
源文件见“ 2-13.fla ”(文件路径:配套光盘 \ 源文件 \part2 \2-13.fla )。
按此在新窗口浏览图片试一试: 在本例的基础上,做如下修改:

2.4.2 相对路径

  Flash 文件可以由多个影片组成,一个影片可从外部动态的导入到另一个影片的影片剪辑中,比如,影片“ 1.swf ”被导入到影片“ main.swf ”中的影片剪辑实例 mc 中,如果在影片“ 1.swf ”中的程序中有 _root ,导入到 mc 后,不再是主场景,所以路径改变,这时“ 1.swf ”的中的代码就不能正确的执行,这时,就要使用相对路径来解决这个问题。
相对路径是以自己所处的起点去访问其它的变量或影片剪辑。如在范例 2-13 中,以 mc1 为起点访问上一级的影片剪辑 mcA 就属于相对路径,这里的上一级用 _patent 表示。因为 mcA 是 mc1 的上一级,在 mc1 的时间轴上加上:
_parent._x ;
意思是访问 mc1 的上一级 mcA 的 x 坐标,转换为绝对路径即:
_root.mcA._x;
使用相对路径有两层意思,一是以自己为起点向上访问,需要用 _parent 。二是以自己为起点向下访问,只需用点运算符。
范例 2-14 :使用相对路径访问变量
( 1 )打开 Flash MX 2004 ,新建一个 Flash 文档。
( 2 )建立如图 2.20 所示影片剪辑实例及其结构,图 2.20 中的名称代表它们的实例名。

图 2.20 影片剪辑的关系
( 3 )单击主场景的第 1 帧,打开【动作】面板,输入下列代码:
var root_var = "_root"; 

// 在主场景中定义一个字符串变量,代表主场景
( 4 )在四个影片剪辑实例的时间轴的第 1 帧上分别定义一个变量,如下所示:
在 mcB 中:

var mcB_var = "mcB"; 

在 mc2 中:

var mc2_var = "mc2"; 

在 mcA 中:

var mcA_var = "mcA"; 

在 mc1 中:

var mc1_var = "mc1"; 

( 5 )在 mcB 的时间轴上的第 1 帧上输入下列代码:

trace(_parent.root_var); 

( 6 )测试影片,输出 _root 。
在这个范例中, _root 是 mcA 的上一级,即 _root 是 mcA 的父级,要在 mcA 的时间轴上访问 _root 中的变量 root_var ,只需向上访问一级,表示如下:

_parent.root_var; 

而 mcA 又是 mc1 的父级,要在 mc1 的时间轴上访问 _root 中的变量 root_var ,需向上访问两级,表示如下:

_parent._parent.root_var; 

mcB 是 _root 的下一级,即 mcB 是 _root 的子级。要在 _root 的时间轴中访问 mcB 的变量 mcB_var ,只需用点运算符,向下访问一级,表示如下:

mcB._mcB_var; 

同样的,要在 mcB 的时间轴上访问 mc2 中的变量,表示如下:

mc2._mc2_var; 

要在 _root 的时间轴上访问 mc2 中的变量,要向下访问二级,表示如下:

mcB.mc2._mc2_var; 

要在 mc2 的时间轴中访问 mc1 中的变量 mc1_var ,先向上访问二级,再向下访问二级,表示如下:

_parent._parent.mcA.mc1.mc1_var; 

源文件见“ 2-14.fla ”(文件路径:配套光盘 \ 源文件 \part2 \2-14.fla )。
试一试: 在本例的基础上,做如下修改:
( 1 )在 mcA 中访问 mc2 中的变量。
( 2 )在 mc2 中访问 mcA 中的变量。
分别用 trace() 语句输出。
注意: 在定义主场景中按钮的动作脚本时,访问主场景中的变量不用加路径。
通过【动作】面板的【插入目标路径】按钮可把实例的路径自动添加到【动作】面板中,这给编程带来了很多方便。
打开源文件“ 2-14.fla ”,单击第 1 帧,按 F9 打开【动作】面板,单击【动作】面板上的【插入目标路径】按钮 ,弹出【插入目标路径】对话框,如图 2.21 所示。

图 2.21 【插入目标路径】对话框
利用【插入目标路径】对话框可添加实例的相对路径和绝对路径。单击【插入目标路径】对话框中【绝对】单选按钮,再单击要插入目标路径的实例名,即可显示出相关实例的绝对路径,单击【确定】按钮可把路径添加到动作面板中。如图 2.22 所示。

图 2.22 实例的绝对路径
双击主场景中的实例 mcB ,单击时间轴的第 1 帧,打开【动作】面板上的【插入目标路径】对话框, 单击【相对】单选按钮,再单击要插入目标路径的实例名,可显示出相关实例的相对路径。
另外,要获取相对路径还可用上一节的方法:先获得绝对路径,理清楚各个影片剪辑实例的层次关系,再决定向上还是向下访问。
2.4.3 动态路径
影片剪辑一般通过手工创建,通过【属性】面板可以设定影片剪辑实例的实例名,通过实例名和路径就可以访问不同层次的影片剪辑实例。但有些影片剪辑的实例是通过程序来创建的,例如通过复制函数可以复制出若干个新的电影剪辑实例,它们的实例名也是在程序中指定的。要访问这些复制出来的影片剪辑实例,最好的方法是用动态路径。
动态路径是利用数组运算符来实现的,在范例 2-14 中可以使用绝对路径访问 mcA :
_root.mcA
如果用动态路径可以这样表示:
_root[“mc”+”A”]
注意: 动态路径使用数组运算符“ [ ] ”实现,路径和实例名间没有点运算符 。
使用动态路径的好处是可以批量实现路径。假如主场景中有影片剪辑实例 mc1 、 mc2 、 … 、 mc100 ,假如用绝对路径,要写 100 行程序,用动态路径就非常方便,因为这些实例名有一定的规律,开头两个字母是一样是,都是 mc ,后面的数字可用一个变量 n 来表示,因为变量是可以变化的,表示如下:
_root[“mc”+n]
Flash 中的关键字 this 代表自己,如果不用 _root ,可用 this 来指定,如:
this[“mc”+n]
使用 this 的前提是不使用其它路径,就是指当前路径,这里指的是主场景。
使用动态路径时也可以用相对路径,如:
_parent[“mc”+n]
如果有多重路径,要访问主场景下的 mcA 下的 mc1 到 mc100 ,可以这样表示:
_root.mcA[“mc”+n]
范例 2-15 :使用动态路径批量更改影片剪辑的属性
( 1 )打开 Flash MX 2004 ,新建一个 Flash 文档。
( 2 )在主场景的【图层 1 】上建立五个影片剪辑,实例名分别为 mc1 、 mc2 、 mc3 、 mc4 、 mc5 。
( 3 )新建一层,在此层第 1 帧上输入下列代码:

var n = 1; 
// 定义变量 n ,初始值为 1 

( 4 )在第 2 帧插入空白关键帧,输入下列代码:

_root["mc"+n]._visible = false; 
// 设置影片剪辑实例为不可见 

( 5 )在第 3 帧插入空白关键帧,输入下列代码:

n += 1; 
// 变量 n 加 1 
gotoAndPlay(2); 
// 跳到第 2 帧并播放 

( 6 )测试影片,可以看到全部的影片剪辑实例都变化不可见。
源文件见“ 2-15.fla ”(文件路径:配套光盘 \part2\ 源文件 \2-15.fla )。
分析 : 此范例中,在第 1 帧中定义一个初始值为 1 的变量 n ,当运行到第 2 帧时,因为 n=1 , _root["mc"+n]._visible = false 的作用是相当于 _root.mc1._visible=false ,所以 mc1 变为不可见。运行第 3 帧, n 加 1 ,变为 2 ,然后跳到第 2 帧,使 mc2 变为不可见。由于第 2 和 3 帧不断循环, n 不断加 1 ,使场景上影片剪辑实例一个个变为不可见。
试一试: :把第 2 帧上代码改为:

this["mc"+n]._visible = false; 

测试影片看看效果。
动态路径在实际编程中的运用非常广泛,它大大提高了程序的编写效率,有关动态路径的更多应用将在后面的章节中讲解。

  PII 应用程序开发
翻译:zjs35
zjs35.5dblog.com
这部分内容将教你怎样用ActionScript 2.0构建完整的应用程序,你将学会架起和建立一个OO对象的最好实践,并学会UI组件和MC怎样适合一个有好结构的flash应用程序,你还将学会怎样和其它开发者共享代码和使用其它人开发的代码库。这此都将帮助你建立一个可升级的、扩展的、稳定的应用程序。
第11章    一个纯OOP的应用程序框架
Flash is notoriously open-ended,If there are several of ways to skin a cat, there are even more ways to build a Flash application.(大致意思是flash建立应用程序的方法太多了)flash的弹性能让开发者混淆,特别是它们建立第一个应用程序时。通过提供一个清晰的怎样构建一个OOP的应用程序的例子,达到解决这种混淆的目标。这里介绍的这个例子决不是创建flash应用程序的唯一方法,但它对确是合理的、可复用的能为任何OOP工程打好基础的方法。我们先在抽象层次上考虑这个例子,此时并没有涉及任何特殊的应用。,我们的框架能够应用到从一个email应用程序到一个计算机游戏的任何东西。在下一章,我们将把我们的普通框架应用到一个真实的案例里――货币转换应用程序。
本章描述的应用程序的框架源自Java思想,更确切的说,是一个微软的VB风格。那也就是说,这个应用程序将是一个纯粹的OOP应用程序,所有的东西都在类里面,而fla文件只是用来加载类和提供组件联接。并不是每个flash应用程序都是纯粹OOP的。Flash也充分支持drag-and-drop(拖放)的可视的开发。可视开发的操作包括在创作时通过面板手工的把组件放在场景中、设置组件的属性和数据绑定,这些操作超出这本书的范围。(下面的部分内容教你怎样使用帮助和google查看信息,还有源文件下载。skip)
11.1 基本的目录结构
在我们开始创作之前,先建立应用程序的目录结构。
(步骤略,另和我说不会,哈哈)
创建目录结构如下,随便放在硬盘的哪个位置:
AppName/deploy/source
在我们的例子中,我们有一些外部的素材如文本,声音、图片等,如果这些素材很多,们应该建立一个AppName/assets目录来存放这些素材。
11.2 flash文档文件
每个flash应用程序至少包含一个fla文件,fla文件是用来导出影片(swf文件)的源文件,影片实际上是在播放器中展示内容的。许多应用程序都含有多个在运行时单个加载的swf。例如,在一个游戏中,一个swf可能代表某一级别的游戏,在一个站点中,一个swf可能代表如“联系我们”这部分内容。在一个含有多个swf的应用中,某个swf只是一个一个用来显示进度条的容器等等(moock可真会写)。
我们的基本的应用程序只包含一个swf文件,因此,只需一个fla文件。然而,我们的应用程序框架不排除其它swf的使用,这些swf可能是站点的某部分,一个表单或测验的某个场景,一个游戏的不同级别部分。
下面创建我们的应用程序的主要fla文件:
建立一个flash文档文件,存放在AppName/source目录中,文件名为AppName.fla。
下面让我们来创建应用程序的类文件。
11.3    类
由于我们建立的是一个纯粹OOP的应用程序,因此所有的内容都在类文件中创建。在flash中,大部分应用程序都是包括可视的用户界面图形,因此,一个典型的OOP应用程序中,由类文件创建和管理UI组件。但在我们的例子里,只有两个类。现在,把我们的焦点只放在框架的构建上,所以既不用类创建视觉元素,也不用类完成特定的实际任务。为了强调框架的一般性和自然性,我们把两个类命名为A和B。我们来看怎样创建组件和管理基于现在的框架的结构用户界面。
一个OOP应用程序可能有许多个类,但只有一个用来开始应用程序,在我们的例子中,类A用来开始应用程序,类A有一个通常命名为main()的方法,按照习惯,这个方法包含应用程序的开始代码。在真实的应用程序中,类A将被含一个用来完成开始任务的main()方法的类代替。例如,在一个测验应用程序中,主要的类可能是Quiz,main( )方法用来初始化测验和显示第一个问题。在一个聊天应用程序中,首要的类可能是ChatClient,main()方法可能用来连接服务器。在上面的两个例子中,应用程序的接下去的部分是从main()方法执行之后开始的。例如,第1个问题答案的出现可能使第2个问题出现,或者服务器的成功连接使聊天界面出现。
基于对我们的应用程序的框架的考虑,我们认为类A的开始任务是创建类B的一个实例。
注:类方法main()的使用是严格按照java方法的,在flash中,main()的使用是可以选择的。在java中,由于语言的需要,main()方法是必须的,main()方法会被自动调用。但在flash中,你必须手工调用main()方法,时间轴的第1帧要跟在应用程序预载之后。
我们将把类保存在包com.somedomain中,在你的应用程序中,你应让包com.somedomain与你的站点的蜮名相匹配。例如,我的站点的蜮名是moock.org,我创建的所有类都在包moock.org之内。
创建包:
1、    在AppName/source目录下建立一个名为com的文件夹
2、在AppName/source/com目录下,建立一个名为somedomain的子文件夹
创建类A:
1、建立一个动作脚本文件
2、输入下列代码:
import com.somedomain.B; 
class A { 
    private static var bInstance:B; 
    public function A() { 
        // 在这个例子中,类A的构造函数不使用 
    } 
    public static function main():Void { 
        trace("Starting application."); 
         bInstance = new B( ); 
    } 

3、保存到AppName/source/com/somedomain,文件名A.as
创建类B:

class com.somedomain.B { 
    public function B() { 
        trace("类B的一个实例被创建"); 
    } 

在我们的框架中,请注意,我们把类保存在AppName/source目录中,这是合理的,但这不是一定要这样做,理论上讲,类能保存在任何地方,只要这个目录能被添加到全局或文档类路径,些目录中的类就能在时间轴上或其它类中使用。
11.4 时间轴
现在我们已经创建两个类和一个flash文档,让我们看看AppName.fla怎样加载类和调用类方法A.main()来开始我们的应用程序。
在我们的应用程序框架中,将使用AppName.fla来创建基本的应用程序状态:loading 和 main,每种状态都是在相应的有标签的帧通过暂停播放头来实现,在帧标签loading中,当类加载时显示一个加载信息,在帧标签main中,调用A.main( )方法开始应用程序。
注:在应用程序中使用帧标签作为程序的状态是一个通常的做法(不管是OOP还是没有OOP),虽然这种用法是非常普遍的,但对于熟悉其它语言的程序员来说,这种做法很不适应,也很不熟悉。为了解决这个情况,flash引入了基于屏幕的表单应用程序,关于屏幕类更多的信息请看….
要加载类A和B,需要这些步骤:
1、在帧中为类指定输出帧
2、在AppName.fla的时间轴上添加帧标签loading 和 main
3、当影片加载时,添加代码显示加载信息
这些步骤的详细方法将在下面列出来:
1、打开AppName.fla文件
2、选择文件――发布设置
3、在发布设置对话框中,选择flash标签,单击设置按钮,在弹出的对话框中,在导出用于类的帧的文本框中输入10,这个10是任意的,但这个指定的帧须在显示加载信息的代码之后(也就是预载之后)。
4、单击两次确定按钮完成操作
在AppName.fla的时间轴上添加帧标签,
1、修改图层1的名称为scripts,我们将把代码放在这一层中,做为一个好的习惯,你应该把所有的代码放在scripts图层中,在时间轴中,这个图层位于最上层,它只包含代码,不含mc或其它内容,一些开发者用actions代替scripts,但目的是一样的。
2、选择scripts图层的第15帧
3、播放一关键帧
4、插入一个新的图层,
5、把新图层命名为labels.
6、在labels图层的第4和15帧,插入一关键帧,就像scipts图层只包含代码一样,labels图层专门用于设置帧标签,用帧标签代替帧数目指定某个帧是非常便利的、友好的。
7、在labels图层的第4帧,加入标签loading
8、在labels图层的第15帧,加入标签main
添加代码用来显示加载信息:
1、在scripts图层的第5帧插入一关键帧
2、在scripts图层的第5帧,输入下列代码:

if (_framesloaded == _totalframes) { 
    gotoAndStop("main"); 
} else { 
    gotoAndPlay("loading"); 

3、在scripts图层的第1帧,输入下列代码:

this.createTextField("loadmsg_txt", 0, 200, 200, 0, 0); 
loadmsg_txt.autoSize = true; 
loadmsg_txt.text = "Loading…Please wait."; 

4、在scripts图层的第15帧,输入下列代码:

loadmsg_txt.removeTextField( ); 

我们现在已经提供了基本的时间轴结构,接下去调用A.main()方法来开始应用程序,我们将在帧标签main处来完成它,下面是此帧的代码:

loadmsg_txt.removeTextField(); 
import com.somedomain.A; 
A.main(); 

在理论上讲,这是我们对AppName.fla的最后一次改动,除非我们要增加组件、声音或传统的图形。应用程序的所有代码都在通过A.main()方法直接引用或间接引用类中,在AppName.fla中将不放置任何代码。
我们的应用程序完成了,现在我们测试应用程序是否能正常运行,要进行测试,我们要输出一个swf文件,然后在flash播放器中运行。
11.5 输出flash影片
指定一个目录用来输出AppName.swf文件:
1、在AppName.fla打开的状态下,选择文件――发布设置――格式
2、在文件下面,输入:../deploy/AppName.swf.
3、单击确定按钮
4、为了在测试模式下测试我们的应用程序,选择控制――测试影片,实际上测试影片就是在AppName/deploy目录创建一个swf文件和立即把它加载进播放器的调试器。
对于我们的应用程序,我们将输出flash7格式,如果你想别人使用其它版本的播放器,你也可以输入其它版本的格式
如果你的应用程序能正常运行,在输出面板中将看到下列信息:
Starting application.
An instance of class B was constructed.
如果上述的信息没有出现,可尝试比较你的源文件和本书的源文件
发布html文件:略
在所有支持的flash播放器版本、所有的网页浏览器和所有的平台中测试是不个好想法,如果你等到所有项目完成之后才在各种各样的浏览器中测试,你可能会发现严重的问题,如果它们被尽早发现,修复起来也是容易的。
11.6 flash中的项目
为了在大的应用程序中管理文件,flash支持项目的概念,一个项目是一群有关系的文件,这些文件能通过项目面板进行管理,一个项目面板像资源管理器,有以下的特征:
l    综合了控制应用程序的源文件
l    容易访问关联的文件
l    即使在编辑类文件时,也可以发布应用程序
这个内容超出了本书的范围,更多内容请看帮助
11.7 小结
虽然这章感觉是非常概念化的,但它展示了非常重要的OOP开发的基础,也是这本书下面的许多例子的基础。
译自:Essential ActionScript 2.0 第二部分第11章

  货币转换应用程序这个例子只进行简单的货币转换,下图显示了这个程序所需的界面,包括一些UI组件实例(Button, ComboBox, Label, TextArea, and TextInput)。在这个应用程序中,用户必须输入一个加拿大元的数目,然后从下拉列表中选择货币类型,再单击转换按钮,就能在文本框中显示出转换后的等量的货币数值。 
图12-1 应用程序的界面
和第11章的使用的结构对应,我们将把元素放在下面的目录下,在创建目录时要注意, deploy和source都是CurrencyConverte文件夹的子目录,org/moock/tools是source文件夹的子目录。
CurrencyConverter/
deploy/
source/
org/
moock/
tools/
这个应用程序的主要部分是名为CurrencyConverter.fla的flash文档文件,为了创建这个文件,我们把AppName.fla(在第11章创建的)复制到CurrencyConverter/source目录中,然后把AppName.fla重命名为CurrencyConverter.fla。这样CurrencyConverter.fla就具有了基本的所需结构,包括类的预载等(详见第11章)。
这个应用程序只有一个CurrencyConverter类,这个类位于CurrencyConverter/source/org/moock/tools中,而导出的CurrencyConverter.swf位于CurrencyConverter/deploy目录中。
现在让我们开始货币转换应用程序的每个细节。
12.2 准备flash文档文件
CurrencyConverter类将在运行时实例化应用程序所需的组件。虽然我们是在运行时创建组件的实例,flash仍然要求把组件添加到CurrencyConverter.fla的库中。不幸的是,flash不允许直接从组件面板中把组件拖到库中。如果我们要在库中添加一个组件,必须在场景中先创建组件的实例。虽然组件实例可以直接留在了fla文件的场景中,但这种开发模式不是我们现在的重点,因此必须把场景中的组件实例删除。不管哪种方法,flash都把组件加入了库中(这是我们最初的目的)。
12.1.1 添加组件到flash文档文件
步骤:拖入组件,然后删除
如果我们在一个全新的fla文件中创作,组件就已准备好被实例化了,然而,回忆我们在第11章的fla文件中的创作,当类被加载时,在第10帧导出类和显示加载信息。由于这个预载结构,如果我们想使用组件,这些组件将不能工作,因此我们要把组件整合到预载结构里。
注:当一个类在fla文件中的第1帧以后被导出时,组件将不能工作,除非组件是在类导出帧的后面加载。
为了在第10帧以后加载组件,必须设定组件在第1帧不能导出,然后我们在第10帧后放置每个组件的虚的实例,这些虚的实例是不能被使用的,它只是用来加载组件。
下面的步骤就是阻止Button实例在第1帧导出,其它组件的设置方法与些类似:
1、在库中选中Button组件
2、单击库面板的右上角,从下拉菜单中选择“链接”
3、在链接属性对话框中的链接一栏,不选中“第1帧导出”多选按钮
4、单击确定按钮
当一个组件的“第1帧导出”多选按钮没选中时,除非一个组件实例被放在了时间轴上,否则组件将不被影片编译。组件将在放置它的实例的帧上导出,但是在组件导出之前,组件的初始化过程仍需要一个可用的类。因此,在CurrencyConverter.fla文件中,我们将在第12帧放置每个组件的实例。为了存放虚的组件实例,要创建新的图层和关键帧:
建立一个名为load components的图层,在第12和13帧插入关键帧,这两帧的作用是不让虚的实例显示在应用程序中,虚的实例只是用来加载,CurrencyConverter类是真正的组件实例的创造者。
当组件加载帧制作好后,把虚的实例放在时间轴上:
1、选中第12帧
2、从库中拖入每个组件到场景中
3、就像在图12-2中显示的一样,随便的使用组件检查器为组件实例增加虚的表示不被使用的文字。
图12-2 应用程序的时间轴和场景
12.2.2 开始应用程序
在第11章,我们知道了通过调用第一个类的mian()方法来开始应用程序,在这里,也将通过调用urrencyConverter类的mian()方法来开始应用程序,当类和组件被加载后,main方法将在CurrencyConverter.fla时间的scripts图层的第15帧被调用。下面是调用的代码:
import org.moock.tools.CurrencyConverter; 
CurrencyConverter.main(this, 0, 150, 100); 

注意:通过使用完整的、有效的包路径,import关键字允许我们通过CurrencyConverter类的类名访问CurrencyConverter。上述的代码的意思是,类的main( )方法要指定四个参数:拥有货币转换的mc、深度、水平位置和垂直位置。
fla文件现在已经准备好了,我们将把注意力转移到类的创建和管理应用程序本身。
12.3 CurrencyConverter类
CurrencyConverter类要实现3个任务:
l    提供一个方法开始应用程序
l    创建应用程序界面
l    响应用户的输入等操作
在调试完成上述任务的类代码之前,你应该快速浏览例12-1中代码清单。现在,你没有必要太仔细的阅读代码,在这章的后面将会对这些代码做详细的介绍。
例12-1: CurrencyConverter类
12.3.1 导入组件包
CurrencyConverter类需要用到各种各样的组件类,我们需要的组件类位于包mx.controls中。在CurrencyConverter类中,我们要通过组件类的类名来使用这些组件,如as mx.controls.Button 或 mx.controls.ComboBox,这个明显是很麻烦的,因此,在定义CurrencyConverter类之前,我们导入整个包:

import mx.controls.*; 

一旦这个包被导入,我们就不用使用完整的类名,可以直接使用如Button等组件类,要特别注意的是,并不是所有的组件都是位于mx.controls包中,如一些容器组件如Window 和 ScrollPane是位于包mx.containers中。要查看组件的包,可参考帮助。
12.3.2 CurrencyConverter类属性
CurrencyConverter类定义了两种一般的属性:类属性指定了货币的兑换率,实例属性保存了应用程序所需的组件:
代码略
出于对本例子的考虑,在类属性中的兑换率是不变的,在真实的货币转换应用程序中,它们更可能是通过动态的、保存在服务器中的数据代替。
要注意,不是所有UI组件都保存在实例属性中,如果一些组件不需要被再次使用,就不用保存在实例属性中。当创建一个组件时,我们保存对组件实例的一个引用只是设想类里的另一个方法稍后要使用它。
12.3.3 main()方法
这个应用程序开始的方法就是main()方法:

public static function main(target:MovieClip, depth:Number, x:Number, y:Number):Void { 
        var converter:CurrencyConverter = new CurrencyConverter(target, depth, x, y); 
    } 

main()方法是一个类方法,因为它是为完整的应用程序调用,并且没有和一个特别的类关联。Main()方法创建了CurrencyConverter类的第一个实例,并把实例保存在一个本地变量converter中。实际上, CurrencyConverter类创建了一个自己的实例,这个做法是合理的、普遍的。
就像我们先前看到的,main()方法从帧标签main处被调用,当main()方法消失时,指向实例的变量converter也将不存在,它会自动被删除。然而,应用程序将继续运行,创建的mc和组件实例即使没有被保存在变量或属性中,也继续留在场景上,直到它们被移除。
正如我们后面看到的,通过main()方法产生的实例在buildConverter( )方法中能继续存在,通过buildConverter( )方法创建的mc和组件实例也保持着一个对实例的指向,没有这个指向,应用程序将不会响应组件事件。
12.3.4 类的构造函数
这个类的构造函数是简单的,它只是调用了buildConverter( )方法来创建应用程序的用户界面。

public function CurrencyConverter(target:MovieClip, depth:Number, x:Number, y:Number) { 
        buildConverter(target, depth, x, y); 
    } 

这个构造函数传递参数给程序的另一个部分,在这个例子中,是传递给通过参数创建用户界面的buildConverter( )方法。
12.3.5 创建用户界面
正如刚才学的,这个应用程序的界面是通过buildConverter( )方法创建的,为了创建用户界面,buildConverter( )方法实例化了UI组件,定义了事件处理器来指示界面的行为。
你已经在前面的例12-1中看了buildConverter( )方法,现在让我们一行一行来看。
buildConverter( )方法的第一行对一些程序员可能是陌生的,它定义一个局部变量thisConverter,来保存对当前对象的一个引用。
var thisConverter:CurrencyConverter = this;
保存一个当前对象到一个局部变量,只是允许当前对象能被嵌套的函数调用,当这些嵌套的函数存在时,当前对象也是存在的。不久我们将看到,事件处理器能在嵌套的函数中执行。它们使用变量thisConverter来访问CurrencyConverter类的实例,关于这个技术的更多信息,在第14章还会提到。
12.3.5.1 界面容器
现在我们继续创建界面元素,首先,要创建一个影片剪辑容器用来放置所有的组件,我们将给这个容器命名为converter,放在指定深度的target影片剪辑里面,回忆在main()中的参数target和depth,这两个参数先传递给构造函数,再传递给buildConverter( )方法:
converter_mc = target.createEmptyMovieClip("converter", depth);
把所有的组件放在一个影片剪辑里,把这些组件做为一个群体来操作将变得非常容易。例如,要移动所有的组件,只需移动影片剪辑的坐标:

converter_mc._x = x; 
converter_mc._y = y; 

这时的x和y是提供给main()方法的参数。
注意:我们的影片剪辑容器保存在实例属性converter_mc中,保存影片剪辑到属性保证了它能被外部的buildConverter( )访问,或者说是出于重新设置或删除它的目的。在我们的这个案例里,我们没有重置或删除这个容器。因此,从理论上讲,我们能把它保存在代替属性的局部变量里。然而,我们把它保存在了实例属性converter_mc里,只是为了在将来能把类增加功能。
13.5.5.2 标签(Label)组件
现在我们的容器已经准备好了,我们就能把组件放在它的里面,通过使用Label组件,先给应用程序一个标题,Label组件常来显示一个单行的文本:
下面的代码是在converter_mc里创建一个名为title的Label组件实例,title的深度为0:
var title:Label = converter_mc.createClassObject(Label, "title", 0);
在我们这个应用程序里,所有的组件都是用UIObject 类的 createClassObject( )方法来创建,这个方法有三个参数,分别用来指定:
l    要创建的组件类
l    组件的实例名
l    在父影片剪辑或组件里的深度
createClassObject( )方法返回了一个新组件实例的指向,在这个案例的title实例里,我们把这个指向保存在了变量title里,之所以使用局部变量title,是因为在后面不需要使用title实例,如果在其它地方我们还要访问title,我们应把它保存在一个实例属性中。
注意那个实例名title,只是按照习惯要被使用,我们从来不会在代码中使用这个名字。在我们的应用程序中,我们都通过变量或属性来指向组件。在这个案例中,我们通过变量名title指向title实例,而不是通过它的实例名(这时变量名和实例名碰巧是相同的)。按照习惯,大部分的组件的实例名都与保存这个实例名的变量或属性相匹配。然而,没有规定实例名要和变量或属性名要匹配,只有变量或实例名与我们的应用程序有关(实例名被忽略)。
现在让我们近处看一下常用于创建Label实例的代码:

converter_mc.createClassObject(Label, "title", 0); 

MovieClip类有没有定义createClassObject( )方法,为什么能在MovieClip类的实例converter_mc里面调用createClassObject( )方法呢?因为在运行时,通过V2组件架构(连同各种各样的方法)把这个方法加入到了MovieClip类里。只有一个类声明为动态时,才能在运行时把方法或属性加到这个类里面,就像在MovieClip类里面定义一样。
因为我们是通过mc来访问createClassObject( )方法,所以我们也不用担心这个方法返回了一个数据类型为UIObject的对象。通过使用title变量,类型Label是不必需的。从理论上讲,下面的代码通常会出现类型不匹配的错误,因为createClassObject( )方法返回的是UIObject的类型,但是title的数据类型是Label。

var title:Label = converter_mc.createClassObject(Label, "title", 0); 

然而,没有错误发生是因为类型检查在运行时对动态加入的方法没有进行,但如果这个方法不是动态加入的,如任何组件都有createClassObject( )方法,如果你在一个组件中调用createClassObject( )方法,就要进行类型检查,此时这个不匹配错误就会发生。为了阻止一个编译错误,你必须指定返回值为你创建的对象的类型,例如,这里我们指定createClassObject( )方法的返回值为Label类型,如果converter_mc里用组件实例代替影片剪辑实例,下面的类型转换是必需的:

var title:Label = Label(converter_mc.createClassObject(Label, "title", 0)); 

现在,title实例已经被创建,我们将调整它的属性:

title.autoSize = "left"; 
title.text = "Canadian Currency Converter"; 
title.setStyle("color", 0×770000); 
title.setStyle("fontSize", 16); 

12.5.3 说明(Label)组件
要创建这个说明组件,我们将创建另一个Label组件,创建方法与title的类似,我们把label实例保存在名为instructions的变量中:

var instructions:Label = converter_mc.createClassObject(Label, "instructions", 1); 
instructions.autoSize = "left"; 
instructions.text = "Enter Amount in Canadian Dollars"; 
instructions.move(instructions.x, title.y+title.height+5); 

上述代码的最后一行是把instructions实例放在低于title实例5像素的位置。
注:设置组件位置的方法只有move()方法,通过读写属性x和y来设置组件的位置是没有用的,要注意,组件支持x,y,width等属性(没有下划线),而MovieClip实例支持_x等属性(有下划线)
12.3.5.4 输入(TextInput)组件
随着两个Label的创建,我们把目光移向接受用户输入的TextInput组件,第一个TextInput组件创建的代码如下:

input = converter_mc.createClassObject(TextInput, "input", 2); 
input.setSize(200, 25); 
input.move(input.x, instructions.y+instructions.height); 
input.restrict = "0-9."; 

注:设置组件的尺寸只能通过setSize()方法,不能使用width和height属性。
接下去要定义当用户按下ENTER键时发生什么,首先创建一个事件侦听器对象,用来接收事件:

var enterHandler:Object = new Object( ); 

在这个对象实例里面,定义一个enter()方法,当用户按下ENTER键时,这个方法会自动被调用:

enterHandler.enter = function(e:Object) { 
    thisConverter.convert(); 

enter()方法通过thisConverter变量访问了convert()方法,当input实例存在时,变量thisConverter是可以被嵌套的enterHandler.enter()方法访问:
最后,注册对象实例接收enter事件:
input.addEventListener("enter", enterHandler);
虽然使用一个对象实例处理事件是很合理的,但在更复杂的例子中,一个事件侦听器对象有充分的理由是一个独立的类的实例,不管怎样,当一个单一的事件产生单一的响应时,用事件处理函数比用对象实例处理事件更有可能的。在的应用程序转换按钮中,我们将使用事件处理函数来处理事件。后面我们也将学习MM为什么不鼓励使用事件处理函数。在这个特殊的enterHandler.enter()的例子中,由于Textinput类不能使用事件处理函数的bug,我们被迫使用一个侦听器对象。
12.3.5.5 货币拾取(ComboBox)组件
现在我们准备一个下拉菜单,来列出让用户进行转换的货币类型,ComboBox组件保存在currencyPicker属性中:

currencyPicker = converter_mc.createClassObject(ComboBox, "picker", 3); 
currencyPicker.setSize(200, currencyPicker.height); 
currencyPicker.move(currencyPicker.x, input.y+input.height+10); 

然后列出用户可以选择的货币类型,其中data属性将被convert( )方法使用:

currencyPicker.dataProvider = [ 
{label:"Select Target Currency", data:null}, 
{label:"Canadian to U.S. Dollar", data:"US"}, 
{label:"Canadian to UK Pound Sterling", data:"UK"}, 
{label:"Canadian to EURO", data:"EU"}]; 

12.3.5.5 转换按钮(Button)组件
在前面我们已经设置一个按键事件(ENTER),现在要为不喜欢使用按钮的用户增加一个可见的转换按钮。
我们这时创建是的mx.controls.Button组件类的实例,注意要和Button符号的实例区别开来。因为我们较早的导入mx.controls.*包,编译器就能知道它指向的是Button组件类的实例。
创建Button组件实例:

var convertButton:Button = converter_mc.createClassObject(Button, "convertButton", 4); 
convertButton.move(currencyPicker.x+currencyPicker.width+5, currencyPicker.y); 
convertButton.label = "Convert!"; 

最后,我们用事件处理函数定义一个click事件:

convertButton.clickHandler = function(e:Object) { 
    thisConverter.convert(); 
}; 

上面的代码示例了组件事件使用的一种方法,它定义了一个的匿名函数,当click事件发生时,这个函数能自动调用。
由于匿名函数是嵌套在buildConverter( )方法的里面,它已经访问了buildConverter( )的局部变量,因此,通过局部变量thisConverter ,convertButton能指向当前的CurrencyConverter类的实例。
13.3.5.7 结果(TextArea)组件
我们的界面几乎已经完成了,还需要一个TextArea组件实例显示货币转换的结果,下面是创建的代码:

result = converter_mc.createClassObject(TextArea, "result", 5); 
result.setSize(200, 25); 
result.move(result.x, currencyPicker.y+currencyPicker.height+10); 

为了阻止用户替换TextArea组件实例中的内容,要加上下面的代码,因为它缺省值是true,表示可编辑的:
result.editable = false;
12.3.6 基于用户的货币转换
在前面,我们创建了用户界面,当用户click转换按钮时,会调用convert( )方法,这个方法能够进行转换货币,也能显示出错误信息,方法中的代码提供了组件怎样被访问和操作的一个很好的例子,代码如下:
这个类方法首先创建两个局部变量,convertedAmount用来保存转换后的货币值,origAmount用来保存用户输入的值:

var convertedAmount:Number; 
var origAmount:Number = parseFloat(input.text); 

输入框的内容可能是空的,或者它不是一个有效的值,因此下面代码的任务是检查是否把这个值进行了String到Number的转换,如果转换不成功,origAmount的值将是NaN,因此当这个值是NaN时,我们说它不是一个有效值。
if (!isNaN(origAmount)) {
如果这个值是有效的,我们就检查currencyPicker.selectedItem.data(下拉列表中被选中的货币值), selectedItem属性保存了一个对ComboBBox中当前选项的指向,它是前面创建的dataProvider数组的一个对象,为了确定哪个选项被选中,我们参考对象的data属性,它可能是null, "US," "UK," or "EU."中的一个,如果data属性为null,说明没有选项被选中,我们就不用进行转换货币:
if (currencyPicker.selectedItem.data != null) {
如果是其它的几个之一,我们用switch语句来确定到底是哪个值,根据这个值进行相应的转换:

switch (currencyPicker.selectedItem.data) { 
                case "US" : 
                    convertedAmount = origAmount/CurrencyConverter.rateUS; 
                    break; 
                case "UK" : 
                    convertedAmount = origAmount/CurrencyConverter.rateUK; 
                    break; 
                case "EU" : 
                    convertedAmount = origAmount/CurrencyConverter.rateEU; 
                    break; 
                } 

一旦转换成功,我们将结果列出:

result.text = "Result: "+convertedAmount; 

当没有货币被选中时,我们提示用户进行选择:

result.text = "请选择一种货币"; 

如果是一个无效值,提示用户输入一个有效值:

result.text = "当前值是无效的"; 

12.3.7 导出最终的应用程序

导出时要注意版本,V2 组件要求播放器的版本是6.0.79.0 或更高,但我在6.0.40.0中测试时,应用程序能很好的执行。

  这章讨论在许多工程中和开发者之间共享类库的各种方法。在开始讨论之前,要注意:flash的类分配特征并不是很精炼,到目前为止,共享类最简单的方法是发布源代码。在讲不通过发布源代码怎样共享类之前,我们将先讲这种最简单的方法,因为当你出售一个专业类库的时候可能要那样做。
类库是一个通常的程序术语,只是简单的指一群类,不要把它和fla文件库、库面板、共享库(在创作时共享库资源)和运行共享库(在运行时共享库资源)混合起来,这些术语中的每一个都是唯一的,这不是当前讨论的内容。
类库只是程序员用来发布一群类到一个团队或其它地方的行话,在另一个方面,包是一个正式的用来定义类的语法命名空间(为了防止和其它类的命名冲突)。
类库可能通过as、swf和swc的形式分配给其它开发者,这章将讨论这三种方法。 
14.1 共享类的源文件
共享类库最可能的原因是为了在多个工程中重复使用它们。例如,假设你正在做一个名叫Spider Services的网上商店(http://www.spiderservices.com/),你已经写了一个处理各种文本效果的TextAnimation类,你要在你做的两个站点中使用这个类,比在两个工程的文件夹中放置一份拷贝更好的方法是,你把类放在中间,每个工程只是指向它,例如,在windows中,你应该把类保存在下面的目录中:
c:\data\actionscript\com\spiderservices\effects\TextAnimation.as
为了使这个类能被两个工程都能访问,你应把c:\data\actionscript增加到flash的全局类路径中。
如果在你的团队中有多个成员,你可能认为把类放在中间服务器是方便的,这样每个人都可以使用它。例如:你可能要把所有的共享类都放在叫codecentral的服务器上,存放目录与你公司域名相配(\com\spiderservices)。
\\codecentral\actionscript\com\spiderservices\effects\TextAnimation.as
这个方法是极度危险的,也是不推荐使用的。
注:
如果你把类放在一个中间服务器上并允许其它开发者直接修改,一个开发者容易覆盖另一个开发者的修改,而且,如果服务器和个人电脑的时钟不同步,在编译时,类的最后一个版本可能不会被包括在影片内。为了避免这个问题,你将总是使用版本控制软件去管理你的类文件。一个流行的选择是CVS (见 www.cvshome.org)。
在一个大的工程中,你可能使用一些工具使swf的输出自动化,例如Apache Ant (http://ant.apache.org).,为了那样做,你将执行JSFL告诉flash为每个fla创建swf文件,这些内容超出了本书的范围,但这有一个例子
// Code in exportPetSupplies.jsfl: 
// =============================== 
// Open the .fla file. 
var doc = fl.openDocument("file:///c|/data/projects/pet/petsupplies.fla"); 
// Export the .swf file. 
doc.exportSWF("file:///c|/data/projects/pet/petsupplies.swf", true); 
// Quit the Flash MX 2004 authoring tool (optional). 
fl.quit(false); 
// Command issued on command line from /pet/ directory: 
// ==================================================== 
"c:\program files\macromedia\flash mx 2004\flash.exe" exportPetSupplies.jsfl 

14.1.1 在运行时加载类
当使用同一个类制作多个swf文件时,把类编译到每个swf中是一种空间浪费,当文件的尺寸有关系时,为阻止这种事情发生,你可能把类库放到一个单独的swf文件并在运行时加载它,一旦这个库在第一时间加载,它可能隐藏在用户的机器中,然后不需重新下载它就能被其它swf利用。
注:一个类库在运行时加载称为动态类库
为了创建这个动态类库,我们编译类库到一个swf文件中,然后使用loadMovie()把它加载到任何一个需要类库的swf文件中。然而,为了使这种技术能正常工作,我们必须确定在库中的类被排除在加载它们的影片中。为了实现阻止类被编译到加载它们的影片中,我们使用排除XML文件。这个xml能让fla文件本地访问类,但能阻止这些类被包含在输入的swf文件,这样允许在运行时被加载。
为了创建运行加载的类库,我们返回到前面的例子:
下面这些步骤是必须要做的:
1、在类库中创建类
2、创建含类库的swf文件
3、创建加载含类库swf文件的影片
4、创建排除xml文件
14.1.1.1、在类库中创建类
创建一个类库的第一步是创建它包含的类,我们的角色类是TextAnimation,保存在c:\data\actionscript\com\spiderservices\effects\TextAnimation.as,对于这个例子,我们的焦点是类库的建立 ,因此我们没给出真实的类代码,只在构造函数中提供了一个trace()来检查这具类是否在工作。

class com.spiderservices.effects.TextAnimation { 
public function TextAnimation ( ) { 
trace("Imagine a text effect with great majesty."); 

现在类库已经建好,下一步创建含类的swf文件
14.1.1.2、创建类库(swf文件)
为了创建这个swf文件,跟随以下步骤
1、创建目录c:\data\spiderservices\spidercore。
2、增加全局类路径c:\data\actionscript
3、建立一个fla文件,保存在c:\data\spiderservices\spidercore\spidercore_runtime.fla
4、第1帧输入:

com.spiderservices.effects.TextAnimation 

如果类库中含有更多有类,这些类都应列在第1帧,编译器会自动查找并包括所有有关的类(例如,在TextAnimation中使用了Tween,Tween类就会自动的包括到swf文件中),这样,我们就不用一个个导入TextAnimation类中所需的类。
5、在第2帧插入一关键帧,输入:
6、在第2帧输入代码:

_parent.spidercoreLoaded(); 
stop(); 

7、输出swf文件。
8、保存fla文件
类库创建好后,就可以在任何一个影片中使用它们
14.4.1.3、创建加载类库的影片
在这个例子中,加载spidercore_runtime.swf是公司的主页,创建主页影片:
1、增加目录c:\data\spiderservices\barkys
2、新建一个fla文件,保存在c:\data\spiderservices\barkys\barkyshome.fla
3、在第1帧输入:

import as.TextAnimation; 
function spidercoreLoaded():Void { 
    var ta:TextAnimation = new TextAnimation(); 

// Load class library. 
this.createEmptyMovieClip("spidercore", 0); 
this.spidercore.loadMovie("../spidercore/spidercore_runtime.swf"); 

homepage这个影片是准备用来使用类库的,这里有个问题:如果在当前使用,它会自动包含TextAnimation类到影片中,我们可不想让这种事情发生,因为我们要通过spidercore_runtime.swf来加载类。我们不需要加载两次类,因此,需要创建一个特殊的xml文件,告诉编译器不要把TextAnimation包含进barkyshome.swf中。
你可能设想只通过移除c:\data\actionscript路径,就能使TextAnimation类不被包含到barkyshome.swf中。事实上,就是可以的,但由于类型检查的原因也阻止编译器查找TextAnimation类,因此,类型错误将发生,barkyshome.swf将不能被编译,因此,虽然我们在运行时加载类,我们仍需在创作时访问这些类。
14.1.14、创建xml文件
在这个文件中,指定哪些类将被编译进相关的swf文件中,我们将阻止在运行时动态加载的类编译进应用的swf文件中。
1、创建一个名为barkyshome_exclude.xml文件,保存在c:\data\spiderservices\barkys\barkyshome_exclude.xml。
排除文件的精确名字是很重要的,这必须与应用它的fla文件名正确匹配。
2、这个排除文件阻止指定类被编译进相关的swf文件,为了阻止TextAnimation类被编译到swf文件,在barkyshome_exclude.xml中增加代码:

<excludeAssets> 
<asset name="com.spiderservices.effects.TextAnimation"></asset> 
</excludeAssets> 

这时有一个假定的排除文件,显示怎样来排除多个类,它排除了下面列出的三个类

<excludeAssets> 
<asset name="com.spiderservices.effects.TextAnimation"></asset> 
<asset name="com.spiderservices.effects.Tween"></asset> 
<asset name="com.spiderservices.util.Randomizer"></asset> 
</excludeAssets> 

3、保存
在<asset>标签中通过列出TextAnimation类,我们强迫它排除在barkyshome.swf文件中。在spidercore_runtime.swf类库中的每个类都应该列在<asset>标签中。
注:编译不会自动排除依赖的类,例如:要spidercore类库包含一个被TextAnimation 使用的Tween类,但barkyshome_exclude.xml没有在<asset>标签列出此类,Tween将被包含在barkyshome.swf中。
我们的spidercore类库现在已经准备好使用了
14.1.1.5 测试
通过输出barkyshome .swf文件来测试这个类库,barkyshome.sw将不包含TextAnimation类,但通过动态类库spidercore_runtime.swf可以访问它,记住,类库能加载是因为我们告诉它:

// Load class library. 
this.createEmptyMovieClip("spidercore", 0); 
this.spidercore.loadMovie("../spidercore/spidercore_runtime.swf"); 

你将在输出面板中看到:
Imagine a text effect with great majesty.
如果我们想要加载另一个类库,第2版本的类库不会覆盖第一个版本的,它将被hu略,为了防止命名冲突,特别我们使用动态类库的时候,让你的类在有唯一名字的包里。

  前些天看到有朋友在许多论坛问同样一个问题——

多SWF打包发布成EXE问题?
多SWF打包发布成EXE问题?

做一个FLASH中有 index.swf 1.swf 2.swf 3.swf 4.swf 5.swf 6.swf 7.swf 8.swf 9.swf 这样10个SWF文件 其中index.swf 有调用 其它的SWF文件..

我想把他们发布成一个 EXE 文件请问我应该怎么做?

我想要的最终效果是.10个swf打包成一个 .exe 文件.能正常调用执行.

这种功能用flash是不好做的,当然要使用第三方软件。

不过这个软件很普及,几乎人人都用——WINRAR!! 怎么做?跟我来——

1、准备好你的所有swf文件和一个你中意的ICO图标文件——它就是你打包后的图标。

按此在新窗口浏览图片
我这里,main.swf是主文件(最好用flash player 导成exe 文件,但是…),其它是main调用的文件。

2、选中所有文件,右击选择"winrar 添加到压缩文件…"

按此在新窗口浏览图片

把A选中,在B处写上你EXE文件的名字

3、更改设置

按此在新窗口浏览图片

选C——点D——出现下图

按此在新窗口浏览图片

在常规里设置好,解压后调用的主文件名。(很关键,名字不要错,注意选解压后的!!)

再选择“模式”标签,E——F——G 一个都不能少,

这里设置文件的解压到"临时文件夹",过程中不出现任何提示窗,复盖旧文件(也是为防止出现提示的)
按此在新窗口浏览图片

再选择“文本和图标”标签,设好图标

按此在新窗口浏览图片

4、开始压缩吧!!

压缩后的文件图标是自定义的,解压到机子的临时文件夹(中间不会出现任何的窗口或提示!!),解压后自动调用main文件。

使用时就像是双击了我们的压缩文件直接执行main文件的感觉一样(当然这与你机子的性能和文件大小有相当关系,否则会等相当一段时间才会开始)!!!如果你把FLash Player的图标导入,加在压缩文件里……会和真的播放器一样的,以假乱真!!

再没有多个swf文件烦心了。而且在关闭显示文件后,临时文件夹中的内容会全部删!!开心。

5、但是——这种方法极意被恶意者利用,比如在里面加上一个木马软件,先期调用了,而我们只看flash去了,也不晓得…………后果……
在EXE属性里可以看到压缩文件的注释,如果里面写明了调用EXE文件……就有些可疑!如果是我,不会冒然使用的。


6、声明
请不要利用这个东东搞&*#$@……
请不要不查毒直接调用不明EXE文件……
请不要想用这种方法保护作品,一点做用不起……
但是压缩时加上密码,也是一种防君子偷偷使用的一种方法。

 这是一份由LogoLounge.com发布的第3 份年度标志视觉趋势报告,全文较长,我认真的看了一遍,挺有收获。了解最新的流行趋势,学习前沿的设计手法。我大概的总结一下吧:) 
原文在此 http://www.gdusa.com/issue_2005/04_…ure/feat_01.php 。建议英文较好的同学看看原文吧,我的翻译能力有限:) 
注:本文图中的文字说明,前为设计公司,后为客户。比如Landor为朗涛,The Bank Of New York代表纽约银行。  

趋势之一 —— 可爱星形
按此在新窗口浏览图片
星形从一开始就成为标志设计的基础图形,今天它的地位同样重要,它像一个人形,有自己的头、手臂、腿等等。

趋势之二 —— 混合

  按此在新窗口浏览图片
将相关的元素图形混合交织组成一个新的图形,每一个元素在整体中的表现都比它单独呈现出来要好。标志的细节看起来就像一个谜或者像味浓的番茄酱一样过瘾。

趋势之三 —— 爆裂/迸发

 这是一个设计趋势中的叛逆者,它打破传统的标志设计规则,将矢量化的边缘摒弃,采用爆裂/迸发状的形态。
按此在新窗口浏览图片

趋势之四 —— CMYK

 CMYK是印刷的四原色,长期作为设计师为打印或者色彩等行业设计形象的手段。现在CMYK似乎成为了一个视觉社会的基本组成部分。它们长期被设计师们所摒弃拒绝,现在却似乎成为了消费者的新宠。比如为了解释一个概念,就必须涉及其本质性的东西,而CMYK正好就成了一个这样的大众理解的新鲜元素。
按此在新窗口浏览图片  

趋势之五 —— 火焰

 我们认为火焰能够和热力和速度联系起来。
按此在新窗口浏览图片 

趋势之六 —— 条状球

 球体还是目前作为代表公司国际性事务和活动的流行图案。除了本身的地球或球体意义之外,它还能呈现一种优雅并且还经常能代表被层层联结组织的力量和复杂性。
按此在新窗口浏览图片 

趋势之七 —— 编织

一条线就只是一条线,但是编织在一起了就成了一个整体结构。线条的灵活织法将内在的实质和个性附给了标志,并且连锁的线条增加了力量感。这种重复给眼睛带来节奏感。比如上图中第一个标志,纽约银行的新标志就采用这种方法,巧妙雕上国际货币的线和金融资料引出公司的全球服务。
按此在新窗口浏览图片 

趋势之八 —— 瞬间位移

从点A到B 点滑动过天空,看起来就像是嗖的一声发射状的一个遗传。不同的是,它有一次明确的开始和结束。例如Landor朗涛给Delta航空做的低票价搬运Song的品牌标识,就采用这样的手法,带了少许顽皮的自然。
按此在新窗口浏览图片 

趋势之九 —— 瞬间位移

 它像是用空气膨胀至33磅/平方英寸的漂浮玩具一样,因为坡度而破坏了传统的标志设计规则。三维的标志将继续在一个二维的世界繁荣。
按此在新窗口浏览图片 

趋势之十 —— 线连点

  这好像到处都是,各种各样的变换方式。他们使人想起分子结构、原子粒子、电路学板和dot-dot-dot的连接性。 充满象征主义,非常有延伸性,这是一种语言。
按此在新窗口浏览图片
  很棒的水滴滴在水里面泛起涟漪。当所有的概念反复却始终不尽人意的时候,它像一个聪明的设计师拧出来一个想不到的涟漪,突然见你发现了一个以前从来没有遇到过的解决方法。
按此在新窗口浏览图片
  叶子目前仍是生态方面标志设计的主要元素,但它们也象变色龙一样,带有惊人宽的范围: 一片叶子能描述生和死, 一种生活,自然的溶液,太阳和荫凉,食品和营养,美容,发展等等循环。 因为叶子的身体状况戏剧性变化,设计师能操作它们的形式来满足他们的需求。
按此在新窗口浏览图片
  运动的想法当然对标识来说并不陌生,模糊是运动这个概念更自然的一种阐释,它有一种力量使你对着标志看上两遍。
按此在新窗口浏览图片
这种风格合并斯宾塞手迹和手绘的人性一步一步增加了优雅的商数。 对精心设计得好的这种类型的标志来说,与单纯的线装标志作比较,有更多的来自空间上的轻盈和灵活。
按此在新窗口浏览图片 
2005年09月22日


第一部《霍元甲》

    《霍元甲》摄于1981年,20集。犹记《霍元甲》播放的时候那绝对是万人空巷,那时只有一部分家庭买有电视机,而且还是那种12寸的黑白电视机,什么孔雀牌、西湖牌、北京牌等等。记得当时每到播放《霍元甲》的时候,外婆家的电视前面肯定是坐满了左邻右舍,那个七嘴八舌讨论剧情的场景我现在还记忆犹新。
  《霍元甲》是第一部在内地播出的港台电视剧,也是当时的当红小生黄元申的最后一部代表作。黄元申在成功扮演了霍元甲之后不久,突然宣布割绝红尘,毅然去了九华山出家。黄元申的电影作品主要有《反碗底》、《漩涡》(与赵雅芝搭档演出)。在拍摄新版《霍元甲》时,剧组曾通过各种渠道与黄元申联系,欲力邀黄元申友情客串,扮霍元甲之父。黄元申现出家在美国某寺庙。




第二部《射雕英雄传》

  《射雕英雄传》摄于1983年,重提此剧,眼前立刻浮现一片广褒的草原,牛羊跳跃,郭靖策马驰骋,手拾弯弓射大雕.还有蓉儿的巧笑嫣然,她扬着脸娇声唤着‘靖哥哥’。在我的心目中,黄日华就是郭靖,翁美玲就是黄蓉,他们已随着岁月的流失永远定格在我少年的记忆里,那么美丽,那么清晰,触手可及。曾经因为他们的演绎而遍寻金庸的作品,一次次沉醉在风云变幻的江湖恩怨里,为了大侠的豪情万丈,儿女情长而唏嘘。如今已是而立之年,忆起当年,仍是激动,那些经典的画面,翁美玲的红颜早逝,都如歌中所唱‘依稀往梦似曾见,心内波澜现’。




第三部《上海滩》

  “浪奔,浪流,万里滔滔江水永不休”《上海滩》摄于1980年,这部讲述许文强和冯程程的爱情故事,使周润发红遍中国内地。当年班上的女生个人都在语文笔记本上画许文强,白色的围巾,黑色的礼帽,觉得许文强的形象简直帅呆了。之后,无论许文强和冯程程的故事被多少人演绎过,也无论周润发和赵雅芝又和多少人扮演过情侣,在《上海滩》里的这一对,才是观众心目中无可替代的完美组合。就连周润发自己也认为拍过的最经典镜头就是《上海滩》中撑着伞和程程漫步雪中那一幕。时光荏苒,可每当想到许文强和冯程程,看过这部戏的观众脑海中浮现的,一定是周润发和赵雅芝深情相拥的样子。




第四部《八仙过海》

  《八仙过海》摄于1985年,20集。在当年电视节目严重匮乏的内地,这部香港神话连续剧当时非常受欢迎。但对于部戏中的八位主演(潘志文,曾伟权、阮佩珍、黄曙光、凌文海、梁汉威、林迪安、唐品昌、蔡国庆)我已没多少记忆了。不过对于这部剧的主题曲还蛮熟悉的,记得当年满街都是“人说仙山好,神仙乐逍遥,不知不觉地来到了”。





第五部《再向虎山行》

  《再向虎山行》摄于1985年,由徐小明执导,梁小龙 董骠 米雪 张铮 曹达华主演。记得是在我念小学的时候,《再向虎山行》在大陆首播,顿时掀起巨大波澜。随着此剧的热播,街头巷尾随处都能听到人们唱着“老包!喂,老包!”,那本是《再向虎山行》的插曲兼片尾曲。直到近几年,人们才知道那应是“留步!喂,留步!”。


第六部《一剪梅》

  《一剪梅》摄于1984年,从此剧开始,台湾戏打入大陆市场,而且占领了很长一段时间。此剧最经典的是由费玉清演唱的那首主题曲《一剪梅》,那简直是风靡一时,大街小巷,家家户户都在传唱。而此剧的男主角寇世勋更是红遍整个内陆,后来好多台湾电视剧都是由他主演的。


第七部《星星知我心》

  《星星知我心》摄于1984年,这是一部绝对轰动的台湾电视剧。此剧让大陆观众哭得眼泪加起来也要流成河了。而此剧让内地的观众记住了一位母亲的典范——古秋霞(吴静娴饰)。当年该剧创台湾三大电视台最高收视率。许多关心同情古秋霞命运的观众,纷纷要求电视台不要让身患绝症的古秋霞死去。编导们只好尽量延长她的生命,最后迫不得已才让她离开人世。由于观众还关心她的5个子女的命运,于是又拍了后来的续集《星星的故乡》。而电视剧主题歌就是由这位伟大的母亲饰演者吴静娴演唱的。


第八部《情义无价》

  《情义无价》摄于台湾电视剧的代表之作之一,此剧可谓黄金的组合,钻石的剧情,出色的演绎,成就了一个宝岛电视史的传奇。当年该剧主题歌又是一首街知巷闻,朗朗上口的歌曲,这部电视剧成功的捧出了不少新人,除寇世勋外,张晨光,戚美珍都是由这部剧打入内地的。而对于张晨光来说,后来的台湾言情剧基本是他的天下。


第九部《流氓大亨》

  《流氓大亨》摄于1986年,此剧是万梓良的成名作,但此剧1989年才进入内地。也由此剧开始,香港无线时装电视剧有相当一段时间独领风骚,很多几年前在香港武侠剧里面露过面的演员又在时装剧里见到,倍感亲切。我最早知道刘嘉玲也应该是在此剧中,以后在银幕或荧屏上看到刘嘉玲的时候,总会想到《流氓大亨》。而该剧的主题曲由徐小凤演唱的“婚纱背后”也红极一时。记得播完此剧后,某报还开展了一场“谁是流氓大亨”的讨论,因为在人们观念中正面人物怎么会有流氓的手法呢?大家不能认同方法是为目的服务的。


第十部《义不容情》

  《义不容情》摄于1992年,此剧众星云集,由黄日华、温兆伦、刘嘉玲、周海媚、蓝洁瑛、商天娥、邵美琪主演。《义不容情》的确称得上是一部经典之作,就如同很多tvb电视同大陆很多电视的区别,因为演技和风格,我看到的戏里的人们,不是在演戏,而是在生活。我现在只能称赞他们的演技好,因为坏人坏到让人恨不得远而避之,恨不得杀死他,而好人却好到人忍不住要去跟随他助他一臂之力。之所以有这种效果,最重要的是因为它有一种吸引力让你进入他们的世界,这一点也是同好书一样。这种感觉读金庸小说的时候体会过,看其他经典的电视作品时也体会过。再则这部剧集让我们听到了陈百强的《一生何求》及片尾曲王杰的《一场游戏一场梦》。一首主题曲由如剧集一般经典,这些都是值得记忆的。


第十一部《绝代双骄》

  《绝代双骄》摄于1988年,梁朝伟这部是第二版本的《绝代双骄》,第一版本是1978年由黄元申和石修主演的,但时代久远,内地观众基本上都没看过。但能够堪称经典的我想只有梁朝伟这版才算。这部也是最如实还原古龙原著的版本了。由梁朝伟、吴岱融双双领衔小鱼儿与花无缺,成为梁朝伟的代表作品之一,其中还有谢宁、黎美娴、苗侨伟、关礼杰、陈美琪等,苗侨伟扮演的“燕大侠”也成为剧中非常瞩目的人物之一。


第十二部《戏说乾隆》

  《戏说乾隆》摄于1991年,主角郑少秋、赵雅芝自此剧后成为“荧屏情侣”的最佳搭档,一个风流倜傥的皇帝,三个温柔端庄的民女,历史武打言情三味俱全,惊险缠绵搞笑件件出彩,乾隆爷的传奇,是“戏说”中的精品。两人配合默契,红遍大江南北,一时间传遍大街小巷,当时非常轰动。而此剧中的小答应春喜(江淑娜饰)是我最喜欢的角色。记得前一阵子在某个网站看到《戏说乾隆》续篇,说的是淮秀生了一双女儿的故事,现在再看《戏说》,竟觉得如果真是这样,那真的是太好了。


第十三部《包青天》

  《包青天》摄于1993年,这部最初由台湾推出的大型电视连续剧(上百集)轰动了整个华人地区,除了塑造包青天的刚直不阿、公正严明之外,这部作品还注重用情感来打动观众。包青天的扮演者金超群是台湾资深演员,他以前的角色大多是反派。星运不佳时,金超群曾经无钱过年。包青天使他一夜成名,人人认可。金超群非常强调情感的把握,当观众看到威严的包青天经常掉泪时大为感动。与剧中人一样,观众也在情与法的冲突中陷入两难,情法难分的确非常有中国传统文化特色。而由何家劲饰演的展昭更是深入人心,其中还有无数明星在剧集中客串。但此剧最红的应该算是他的片尾曲,由黄安唱的那首《新鸳鸯蝴蝶梦》,这首歌当年也是唱遍大江南北呀!


第十四部《新白娘子传奇》

  《新白娘子传奇》摄于1992年,又是一部赵雅芝的作品,往前数数,赵雅芝好像每部作品都很经典。当年一部《新白娘子传奇》掀起举国之“白蛇”热,民间传奇故事《白蛇传》又一次广泛的普及全国。而此剧更值一提的便是反串许仙的叶童,当年有不少内地观众还以为她是专事“反串”角色的“特型演员”呢。可当叶童如一叶秋风飘然而至,坐在你面前时,你会觉得她的柔媚、她的风情甚至超过了与她同龄的女性。好像每部经典的剧集都会配有一首经典的主题歌,由高胜美演唱的“千年等一回”成了卡啦OK的最热歌曲。


第十五部《大时代》

  《大时代》摄于1992年,但此片于1994年才进入内地,该剧应该算是无线精品。郑少秋演了个反派丁蟹,备受好评,刘青云的表演也很出彩,还有周慧敏演的小犹太(犹记周慧敏在剧中唱的那首“红河村”超好听)。香港《明报》曾经这样评论“如果没有《大时代》,郑少秋永远都是公子哥;如果没有《大时代》,刘青云也只会演呆傻的角色;如果没有《大时代》,周惠敏就是一个花瓶;如果没有《大时代》,郭蔼明不可能走红。”所以《大时代》造就出了一批巨星,堪称经典之作。


第十六部《昨夜星辰》

  《昨夜星辰》摄于1988年,当年该剧在全国十分流行,曾捧红了寇世勋、陈莎莉等人,也成为内地观众熟知的言情剧。而同名主题曲当年是电台点播率最高的歌曲,还发行了只收录了该主题歌与电视剧《一剪梅》主题歌的磁带,后被多次翻唱。如今连续剧《昨夜星辰》引起的轰动早已成为过眼云烟。但那首主题歌像天上闪烁的星星一样,依然令我百听百唱不厌。


第十七部《法网柔情》

  《法网柔情》摄于1995年,此剧是米雪和刘松仁合作的第一部时装剧。曾经我对律师这个职业非常非常的向往,无他,仅仅因为一部《法网柔情》而已,在他的诠释下,律师这个职业顿时崇高起来,风度翩翩和咄咄逼人完美的联合在一起。现在想来,有些情节已经不能回忆起来了,但刘松仁在雨中给米雪留下雨伞的那个细节,怕是再过一个二十年依然会很自然在脑海中浮现出来。


第十八部《八月桂花香》

  《八月桂花香》摄于1991年,此剧是苏明明与刘松仁合作的一部台湾电视剧,而剧集本身留给我的记忆已变成无数小碎片,在该剧中第一次我认识了刘松仁、第一次知道何谓“格格”(米雪饰)、第一次认识到还有像“康师傅”一样好吃看得见的方便面(两集电视剧中插播的广告),还有永远记住了一首歌“尘缘如梦,几番起伏总不平,到如今都成烟云”,而时隔多年后才知道原来这首歌叫作《尘缘》。 总之很多情节我是记不清楚了,但却清晰地记得那时在看时却感动得流泪,像这么出色的悲情剧如今已见不到了。


第十九部《武则天》

  《武则天》摄于1984年,此剧是当年厂区录像台热播的剧集,也是我一直最喜欢的。那时候觉得冯宝宝真的好漂亮,她把武则天的韵味完全演绎了出来,而当时我刚上小学,因为很小又不太了解史实,所以觉得特别好看,但后来一直没有再看过,所以不知道现在感觉会怎样。我记得剧中两个帅哥都喜欢她,一个是潘志文扮演的宇文峻,一个是曾伟权扮演的明崇彦,两个人是一文一武还是都有武功我记不清了。不过我一直觉得潘志文的古装扮相非常俊雅,绝对是美男子。《武则天》的片头曲非常好听,虽然歌词我已记不清了,不过那个旋律还是很熟悉。


第二十部《珍珠传奇》

  “天资蒙恩宠,明眸转珠辉。兰心慧质出名门,吴兴才女沈珍珠”《珍珠传奇》摄于1989年,这部戏也是寇世勋主演,好像一知道这个人之后,就会接二连三地看到他的戏。至于沈珍珠倒没有太多感觉,只是觉得太子对她真的很好,长得好像也比寇世勋帅,遗憾她没有选太子。而且演沈珍珠的那个演员施思后来也很少再在其它戏里看到过。我还模糊记得李豫粘碗那一幕,为挽回感情,他把打碎的碗重新粘和起来,很让人感动,可惜此剧最后是悲剧。那时候还小,故事情节多数都忘了,只是剧中的歌一直难以忘怀,如果有机会,希望能重温这部久而难忘的电视剧!


第二十一部《几度夕阳红》

  “青山依旧在,几度夕阳红”《几度夕阳红》摄于1985年,但在内地上映时已是80年代末了,此剧是琼瑶在内地播出的首部电视剧,播出后引起强烈的反响,开创了一个琼瑶时代。这部戏让我们认识了刘雪华,也见识到了她的哭功。她的泪水真的很自然,让人看着也跟着心酸起来,后来知道她是琼瑶的爱将,如果说琼瑶电影的主将是林青霞,那么琼瑶电视剧的主将当仁不让地就是刘雪华。戏里面看到她嫁给杨明远后所承受的精神折磨,真的替李梦竹心痛。赵永馨的晓彤也很清纯可爱,也挺喜欢那个不算帅哥的帅哥李天柱。秦汉依旧是一片儒雅风度,其他面孔也很熟悉。总的来说,这部戏的收视率当时是很高的。


第二十二部《我本善良》

  《我本善良》摄于1990年,此剧席卷了整个大陆地区,捧红了温兆伦、邵美琪,也成功的把该剧推上了全球发行最卖座电视剧季军的宝座。这也是我自己相当喜欢的一部电视剧,它承载了我太多的记忆。直到现在,依旧喜欢里面的男女主角。石伊明看着齐浩男一贯多疑而忧郁的眼睛,说:“我一向都是向前看的。”齐浩男却在石伊明坚定的注视里缓缓地说道:“但是像这影子,我小时候总想把它抛在身后,可是无论如何它永远在我的眼前。”石伊明于是抿着嘴角笑了——这是她一贯的微笑方式,她转身,道:“这样,它不是就在你的身后了么。”十几年后,连温兆伦和邵美琪都不得不承认,齐浩男和石伊明是他们演艺事业里最光彩照人的角色。因为气质上的相似,他和她演起来都毫不费力。


《人在边缘》摄于1993年,这部戏让黎明声誉鹊起,他演的林奕龙实在是非常有魅力,那阵子迷倒了好多观众,不光是小的哦。这也是我第一次看刘青云的戏,那时就觉得他长得很敦厚,让人信赖。也是第一次见到陈法蓉,她的短发和魔鬼身材好象成了她的招牌,非常有个性。罗慧娟的戏也是第一次看到,她演得阿宜非常可爱,特别是他跟阿龙拍拖的片断,她假装英语很菜让阿龙陪他到英语补习班的那段尤为精彩。林文龙的反派很成功,好像他也曾经被无线雪藏,剧中他冒认阿龙的时候我真的太讨厌他了,看电视报介绍剧情说阿龙最后还是见到了父亲,认了父亲,还为他开心,可惜电视里根本不是这样演的,阿龙她爹到死都不知道亲生儿子另有其人。真是郁闷!而且演阿龙他爹的那位经常演反派,好像叫方什么,后来看他的介绍居然是个多才多艺的人,真是没有想到。剧中阿龙兄弟的名字记得很清楚,叫“蟑螂”,可惜后来死了。还有片头片尾曲《人在边缘》和《如果这是情》都很好听,之后黎明的专辑大卖。黎明也因为此剧为大陆观众所熟悉,之后扶摇直上,人气很旺。


第二十四部《万水千山总是情》

  “莫说青山多障碍,风也急风也劲,白云过山峰也可传情”《万水千山总情》摄于1980年,这是我最早看的汪明荃的戏,《万水千山总是情》在内地播出后,人们对港台电视剧产生了极大的兴趣,汪明荃也因此成为家喻户晓的明星。当时我好像还不懂事,剧情已经完全不记得了。但是那首主题曲不会忘记,“3455653,213216”(歌词第一句简谱),汪明荃似乎经常演唱她主演电视剧的主题曲,大多都非常好听。但对男主角谢贤我已经完全没有印象了,不过当时非常有影响力却是真的。


第二十五部《日月神剑》

  《日月神剑》摄于1990年,这部戏让我认识了张卫健和郭晋安,里面那个大眼睛忽闪忽闪,蹦蹦跳跳的可爱男孩阿月,曾把多少小女孩迷得神魂颠倒。《日月神剑》每一集都很搞笑,能把你从沙发上笑到地上。其实他们的故事很简单:一个是要变妖的,一个是要杀妖的;他爱上了她,她也爱他;妖怎么才能变成人,人和妖又怎么能一起?她死了,而他还在人间。好像后来《日月神剑》还出了部续集,不过我没看过。



第二十六部《天地男儿》

  《天地男儿》摄于1996年,香港无线电视集合幕前幕后精英制作的一部长剧,由郑少秋、罗嘉良、张智霖、古天乐、宣萱、伍咏薇、陈松伶演绎的错综复杂的爱情伦理让人印象深刻。此剧是给我最大震憾的一部港剧,至此以后到现在,现也没能找到一部能看得如此投入的电视剧。这部剧是郑少秋继《大时代》之后再次给人留下深刻印象的角色;罗嘉良则出神入化地演绎出了一个人性扭曲变化的反面角色;而当时并不是太出名的古天乐也凭借这部剧让人们记住了他的英俊面孔;另外萱萱、张可颐的事业也都是凭借这部剧开始上升。这部无线大戏真正地推出了几个重量级的演员。

2005年09月08日

使用Photoshop制作塑胶按钮
新建一个文件,400*200,设置前景颜色为18BE0C,选择园角矩形工具,园度20 ,画一个园角的矩形。

attachments/month_0501/he7k_1.gif


设置图层样式,内阴影

attachments/month_0501/wtlz_2.gif


混合模式 :正常
颜色 : FFFFFF (白色)
不透明度 : 60%
角度 : 90
距离 : 10px
阻塞: 0%
大小 : 0px

设置渐变叠加

attachments/month_0501/fc5j_3.gif



不透明度 : 60%
样式 : 线形
颜色: 从 999999 到FFFFFF

设置描边

attachments/month_0501/41s7_4.gif


大小: 1px
位置 : 外部
混合模式: 正常
颜色: 16A00B

设置内发光

attachments/month_0501/xum1_5.gif


大小 : 5px
不透明度: 60%
颜色 : FFFFBE

最后一步设置投影

attachments/month_0501/63u9_6.gif



不透明度: 60%
角度: 120
距离 : 2px
大小 : 5px

最后的效果


attachments/month_0501/1xp4_7.jpg

轻轻松松做拼图
打开一张图片。

attachments/month_0501/rogv_1.gif



选择滤镜-纹理-纹理化。选择Load texture

attachments/month_0501/c02f_2.gif



在Photoshop的安装目录里找到Presets/Texture文件夹,选择Puzzle.psd

attachments/month_0501/he7k_3.gif



将缩放改为99%,凸现改为16,光照改为Top Right

attachments/month_0501/1xp5_4.gif


完成

attachments/month_0501/96xc_5.gif