Director 8 相对于 director 7 有很多增量型的改动,其中对于 lingo 程序员来说,最引人注目的就是增加了相关的 image lingo 指令。有了它,我们可以做很多以前用 director 7 所无法做到的效果,例如你可以自己编写一些 transition 过渡效果,还有你还可以编写类似于 photoshop 的滤镜效果。这也进一步体现出 director 相对于 Flash 的优势所在--即:对于位图的强大处理能力。在这里我们将领略一下新增加的 image lingo 命令带来的强大功能。
有很多人在论坛上讨论 director 与 flash 孰优孰劣,无论是国内论坛还是国外讨论组,情况都是相同的。双方的拥护者都尽可能的说服对方自己喜欢的软件是最棒的,其实在很多情况下这种争论是没有任何意义的。我本人两种软件都使用,我喜欢用 flash 来做简单的动画角色,然后导入 director ,而不是象以前那样全部在 director 中做 film loop 动画。做动画方面, director 确实不如 flash, 但是我还是喜欢使用 lingo 来编写程序。所以我不会象一个真正的 flasher (\"闪客\")那样不停的发掘 flash 的潜力来做出一切效果(尽管有的效果做出来很勉强,或是效率太低,性能较差)。 最近我通过做一个剃须刀演示项目,进一步验证了 director 在处理点阵图像方面的确优于 flash。
其实这个项目很简单: 通过在网页中拖动剃须刀,将一个的人的面部胡须刮干净。 这个项目最开始的想法是用 flash 来做。我们的 flash 技术人员最开始的想法是,将这个人脸部胡须部分的照片图案(矩形区域),细致切分,然后将同一个人的脸部没有胡须的照片(为了达到头部图案完全吻合,我们是在同一张照片上通过 photoshop 做添加胡子的处理)同样分割为很多相同的小块,然后作为元素导入 flash。这样有胡须的部分分为很多小块,导入 flash ,然后相同的无胡须的部分也分为相同个数的小块导入 flash ,然后将对应的每一个小块做一个 MC. 这个 MC 的第一帧放置有胡须的切块图案,第二帧放置无胡须的切块图案,mc 的第一帧放置 stop action, 当鼠标 over 的时候,让这个 mc 跳动到第二帧没有胡须的小切块。这样,当用剃须刀做的 mc 替代鼠标后,当它滑动到这些MC(有胡须的小切块图案)的时候,他们就会跳到相应第二帧(也就是没有胡须的小切块图案),这样就可以完成刮胡子的演示了。 方法是很简单的: 但是实际做起来却出现了如下的问题。 1:通常这样的切图文件必须非常细,才可以满足客户的要求,然后切图越细致就意味在 flash 中要作更多的 mc 和 symbol。 这样不但增加了文件的大小,而且也使得文件运行特别慢。 2:由于这种方法制作的切图大小是开始定好的,如果希望将切块更加细分的话,你必须从新切图和导入。必须重复劳动。 3:这种方法制作 swf 文件通常比 director 制作的 dcr 文件大不少(至少是一倍)。
首先我们将定义一个属性(这是一个习惯性的写法) 就是在每个角色的 beginsprite 事件handle 中做初始化属性和某些全局变量的操作。 这部分代码是为了方便对大量 sprite(me.spritenum) 的调用而写的,其实在本程序中并不一定需要 property pMySprite on beginsprite me pMySprite = sprite(me.spritenum) end 下面是真正的核心代码 通过在响应 exitframe handle 中处理 mouseDown 来复制位图,也就是当鼠标在图形上拖动的时候将鼠标滑过的位置的矩形小区域记录下来,然后从 source 角色中将相应矩形区域的位图部分复制到 target 角色部分相应的位图部分。
on exitframe me if (the stillDown) then - 当鼠标一直按下的时候,才开始复制 thisPoint = the mouseLoc - point(pMySprite.left, pMySprite.top) - 将记录鼠标相对与角色左上角为原点的坐标 top = thisPoint.locV left = thisPoint.locH sourceRect = rect (left, top, left + 10, top + 10) -- 定义一个虚拟的小矩形复制区域(从鼠标开始处计算),我们这里采用 10*10 的方块 member(\"target\").image.copyPixels (member(\"source\").image, sourceRect, sourceRect) -- 将从 \"source\" 角色中复制一个小块到 target 角色中相同坐标区域部分。 end if end
好了,所有关键程序部分都已经完成了。这里,我们可以简单的通过 sourceRect = rect (left, top, left + 10, top + 10) 这条语句来容易的改动复制区域的大小和形状, 这比起 flash 从新切割图片来说真是太方便了。 任何人只要有两张照片文件,都可以很容易的制作这个程序。似乎所有的程序都已经写完了。好像还有些问题,记得我在前面说过任何对图形角色 image 对象的修改都是对原角色成员的修改,我们复制完毕后,两张图形就完全一样了,这样原来的 target (就是未刮胡子的图案)就无法恢复原来的样子了,为了让这个程序可以反复的玩,我们在开始导入角色的时候,曾经将 target 复制为另一个相同的角色。名字是 \"s\". 现在我们在这个 director 程序中建立一个 movie script 在里面键入如下语句 on startmovie member(\"s\").duplicate(2).member.name = \"target\" -- 该语句很简单,就是将 member 角色 \"s\" 复制到 2 号 角色,然后起名字为 \"target\" end 这样我们就恢复了 target 角色的本来面貌。 如下是全部角色,舞台,和 score 安排图:
图形 (cast.gif)
在这个程序中,通过使用 director 8 中清晰简捷的 image lingo 代码完成了 flash 做起来很麻烦的操作。这就是 director 在处理图像方面的优势所在。 Flash 在处理适量方面的确是有目共睹的,但是我希望大家能够更多的关注 director 对于位图的处理技术。在不同的场合采用最适合的技术这才是我真正要表达的意图。
我已经将该程序的 demo 放置在我的主页上,你可以通过输入这个网址来看,http://www.matrixfox.com/newface.htm 该网页需要用 shockwave 插件来观看,没有该插件的人请去 http://www.5dmedia.com 主页下载。 原程序代码的下载地址为 http://www.matrixfox.com/faceoff.zip 我希望和广大的 director 爱好共同交流 director 技术。我的 email : matrixfox@21cn.com