您的位置: 首页 > 技术文档 > 多媒体制作 > Making Things Move 第四章
FLASH小游戏开发 第二节 回到列表 Making Things Move 第三章
 Making Things Move 第四章

作者:alan98 时间: 2008-05-15 文档类型:翻译 来自:蓝色理想

第 1 页 渲染技术 [1]
第 2 页 渲染技术 [2]
第 3 页 渲染技术 [3]
第 4 页 渲染技术 [4]
第 5 页 渲染技术 [5]
第 6 页 渲染技术 [6]
第 7 页 渲染技术 [7]
第 8 页 渲染技术 [8]
第 9 页 渲染技术 [9]

使用 beingGradientFill 创建渐变填充

下面开始学习绘图 API 的强大函数:beginGradientFill(fillType, colors, alpha, ratios, matrix)。与线条样式相同,这个方法也有很多额外的可选参数——扩散方法(spreadMethod),插补方法(interpolationMethod)及焦点位置比例(focalPointRatio)。这些参数可用来调整渐变的属性,但是在大多数简单的应用中这些参数不是必需的,而这个方法与 beginFill 有很多相似之处,同样也使用 endFill 作为结束。两者最大的不同是填充的颜色,我虽不想说 beginGradientFill 是用来创建渐变填充的,但是,如果不这么说,又感觉少了点什么。渐变填充至少要有两种颜色,图形的第一部分从第一种颜色开始,然后逐渐混合成为另一种颜色,或者混合成一个或多个已定义的颜色。

指定填充类型

我们可以建立两种类型的渐变填充:线性(linear)和放射(radial)状。在线性填充时,渐变的颜色沿着直线从一点到另一点。默认的情况,是从左向右的一条直线,也可以是从上到下或其它角度的直线。图4-5是一些线性渐变的例子。


图4-5 线性填充

为了能够看到线性渐变,需要至少两种不同的颜色。如果指定了两种颜色,那么填充将会从第一种颜色向第二种颜色渐变。如果指定了更多的颜色,填充色将会从第一种颜色渐变为第二种,然后再渐变到第三种……直到最后一种。

放射状填充与线性填充使用的参数大致相同,只是在解释上有所不同。从指定的中心位置开始创建渐变,以这点为基础向外进行放射,形成一个圆或椭圆。我们指定的第一种颜色用做内圆,最后一种颜色作为外圆,唯一不需要的就是角度。图4-6是一个放射状填充。
对于 beginGradientFill(fillType, colors, alphas, ratios, matrix) 方法,第一个参数为填充类型,非常简单,用一个字符串表示,这两个值中的一个:”linear”或”radial”。与第三章讲的事件类型很像,目前事件类型也被设置为 flash.display.GradientType 类的静态属性,为的是避免错误输入。我们可以导入 GradientType 类然后输入 GradientType.LINEAR 或 GradientType.RADIAL。


图4-6 放射状填充

设置 colors , alphas 及 ratios

使用 colors 参数设置颜色,当然也必需设置每一个颜色所要填充的位置,使用0到255中的一个数进行指定,0表示填充的开始位置,255表示填充结束位置。在这些数值中,每一个数代表一个颜色的位置,这就是填充的比例。因此,如果有要填充两种颜色,那么应该指定0和255作为 ratios,如果有三个颜色值,那么应该写成 0,128,255。这样就将第二个颜色放到了另外两个颜色的中间。如果比例值为 0,20,255,那么第一种颜色会很快渐变为第二种颜色,然后非常缓慢地渐变为第三种颜色。请记住这些数值不是像素值,而是指在 255 中的某一个部分。

我们同样必须指定渐变色的透明度,这就是 alpha 值,从 0.0 到 1.0,而在 AS 2 中表示为0到100。如果不需要透明度,那么就设置为 1.0。如果设置的透明度是从1.0到0.0,那么渐变的过程不仅是改变颜色,而且还有平滑淡出的效果。可以用做创建柔和的阴影(也许比使用投影滤镜(drop shadow filter)还要好些)。
这里每一个参数都是一个数组,因为需要传入至少两个以上的 colors,alphas 及 ratios。我们可以先创建一个数组,然后写入每一个参数的值,如下:

var colors:Array = new Array();
colors[0] = 0xffffff;
colors[1] = 0x000000;

下面是一个更简单作法,我们可以在创建数组的同时,为数组的每个元素赋值,直接写在方括号中,以逗号作为分隔:
var colors:Array = [0xffffff, 0x000000];
事实上,我们甚至可以不去使用 colors 变量。直接把右边的数组写入 beginGradientFill 表达式中作为参数。因此,可以写成这样:

graphics.beginGradientFill(GradientType.LINEAR,
[0xffffff, 0x000000],
[1, 1],
[0, 255],
matrix);

这里定义了两个颜色值,两个 alpha 值(均为 100%)和比例值的开始位置与结束位置,所以渐变将以白色为开始最后逐渐变化为黑色。当然,也可以为每个参数设置一个对应的变量,如果定义了很多个颜色值的话,这样写会更清楚些。如果定义了三个颜色值,就必需有三个 alpha 值和三个比例值与之对应。如果有某些值多了或少了,那么就会引起会静默失败——没有渐变,没有填充,没有错误信息。
下面只需要设置一下填充的起点、终点或角度了。也许大家已经猜到了,这就是神秘的matrix(矩阵) 参数。

创建矩阵

矩阵(Matrix)就是一个二维表格,每行每列中包括不同的数,可以出计算不同的值。矩阵此外还用于绘图(graphics)中,用作旋转,缩放和移动物体。在这里,用于对渐变的控制,我们需要为填充进行定位,设置它的大小,或是进行旋转。使用 matrix 时,需要创建一个 matix 对象,这是一个 flash.geom.Matrix 类的对象。(实际上, Matrix 类不仅用于操作渐变填充,但这里我们只介绍它在渐变中的应用。第18章中介绍了更多的矩阵使用)。

在使用 Matrix 类时有一点复杂,这里有一个特殊的方法用于创建渐变填充的矩阵类型,这个方法名为 createGradientBox,必要参数为 width 和 height,可选参数为 rotation 及渐变的起点的 x,y 位置。首先创建一个 Matrix 类的实例,然后调用它的 createGradientBox 方法自动设置内部参数值。形式如下:
var matrix:Matrix = new Matrix();
matrix.createGradientBox(width, height, rotation, x, y);
不要忘记在类的开始处导入 flash.geom.Matrix 类。如果仅指定 width 和 height,最后三个值默认为 0。来看一下代码,这里是文档类 GradientFill.as:

package {
 import flash.display.GradientType;
 import flash.display.Sprite;
 import flash.events.MouseEvent;
 import flash.geom.Matrix;
 public class GradientFill extends Sprite {
  public function GradientFill() {
   init();
  }
  private function init():void {
   graphics.lineStyle(1);
   var colors:Array = [0xffffff, 0xff0000];
   var alphas:Array = [1, 1];
   var ratios:Array = [0, 255];
   var matrix:Matrix = new Matrix();
   matrix.createGradientBox(100, 100, 0, 0, 0);
   graphics.beginGradientFill(GradientType.LINEAR, colors,
   alphas, ratios, matrix);
   graphics.drawRect(0, 0, 100, 100);
   graphics.endFill();
  }
 }
}

测试影片后,会看到一个从白色到红色渐变的正方形。现在,我们改变一下绘图代码,在不同的地方绘制这个正方形(见 GradientFill2.as):

graphics.drawRect(100, 100, 100, 100);

现在这个正方形为全红色,为什么会这样?渐变在 x 为0处开始,但它只有100像素宽,而正方形是从100像素开始的,渐变色已经到达了全红色,红色从这里开始已经出界了。因此,如果想让矩阵的 x,y 在正方形的左上角开始,应该这样写:

matrix.createGradientBox(100, 100, 0, 100, 100);

这样, x,y 坐标就与正方形的起点相同。请使用同样的正方形,通过改变矩阵和渐变填充观察创建的填充是什么效果。首先,试一下三种颜色:

var colors:Array = [0xffffff, 0x0000ff, 0xff0000];
var alphas:Array = [1, 1, 1];
var ratios:Array = [0, 128, 255];

不要忘记改变 alphas 和 ratios ,将中间的比例移动一下看看对渐变色的影响。试用 64 或 220 代替 120。
下面是一个直接 alpha 变化的例子,使用相同的颜色,只改变 alpha 的值:

var colors:Array = [0x000000, 0x000000];
var alphas:Array = [1, 0];
var ratios:Array = [0, 255];

试着改变一下角度,下面是 45度角:
matrix.createGradientBox(100, 100, Math.PI / 4, 100, 100);
使用 Math.PI/2 旋转90度形成一个垂直填充。 - Math.PI/2 形成向上填充,而 Math.PI 左是从右向左填充,默认为从左向右填充。
beginGradientFill(GradientType.RADIAL, colors, alphas, ratios, matrix);
现在,将这些应用在线性填充(linear)的技巧改为放射状填充(radial)的版本。

颜色转换

下面一个渲染工厂是 flash.geom.ColorTransform 类及其方法。与绘图 API 不同,该类不允许创建图形,仅仅用于改变已存在于影片或显示对象实例中图形的颜色。让我们去看看它是怎样工作的。

使用 ColorTransform 类改变颜色

在 ActionScript 2 中,操作影片剪辑颜色最常用的方法是 Color 类,拥有像 setRGB 和 setTransform 这样的方法。Flash 8 中就引用了 ColorTransform 类,同时 Color 类就不再被推荐使用,但是想大多数人仍然继续使用 Color 类,因为这已经成为习惯了。Color 类已经不是 AS 3 的一部分了,现在是学习新方法的最佳时机。ColorTransform 的方法与 Color 类的方法本质上是非常像,两者差不太多,只是语法上略有不同。

首先,要知道 Sprite 影片,影片剪辑,或其它任何显示对象都有一个属性叫作 transform。这是 flash.geom.Transform 类的一个实例,其中包括一些不同的属性用于缩放,旋转,定位和改变影片颜色,影响颜色属性的就是 colorTransform。要知道这是一个显示对象属性的属性,访问方法如下;
mySprite.transform.colorTransform
或使用一个继承自 Sprite 的类,可以直接获得类自身的 transform 属性:
transform.colorTransform

通过为一个 ColorTransform 对象的颜色属性赋值可以改变一个对象的色彩。你也许会问,什么是 ColorTransform 对象?如果大家使用过 AS 2 的 Color 方法:setTransform,就知道我们需要传入一个 object(对象) ,在这个 object 中有各种属性,需要告诉它如何变换颜色。 ColorTransform 与这个方法非常相似,但不是使用一个普通的对象(object),而现在这个方法已经拥有了官方的类。在 AS 2 中,是这样做的:

myTransform = new Object();
myTransform.ra = 50;
myTransform.ga = 40;
myTransform.ba = 12;
myTransform.aa = 40;
myTransform.rb = 244;
myTransform.gb = 112;
myTransform.bb = 90;
myTransform.ab = 70;

在 AS 3 中,应该创建一个同样的 ColorTransform 对象,像这样:

myTransform = new ColorTransform(0.5, 0.4, 0.12, 0.4, 244, 112, 90, 70);

前四个值为乘数,后四个值为偏移量,马上会介绍这个公式,然后就会知道为什么它们这样命名了。大家也许注意到了乘数的比例值为十进制范围 -1.0到1.0,而不是 -100到100。事实上,帮助文档说是从0.0到1.0,但还可以使用负数做为乘数实现一些有趣的效果(稍后会看到),偏移量依然是从-255到255。ColorTransform 对象的构造函数如下:

ColorTransform(redMultiplier,
greenMultiplier,
blueMultiplier,
alphaMultiplier,
redOffset,
greenOffset,
blueOffset,
alphaOffset)

转换一个特殊颜色通道的公式如下,以红色通道为例:

newRed = oldRed * redMultiplier + redOffset;

在使用 ColorTransform 时,记得它是 flash.geom 包中的一部分,所以需要导入类。

给大家一个例子,下一个文档类:TransformColor.as,在 SWF 中嵌入一张图片作为位图(位图类的实例)。因为位图类是一个显示对象,拥有 transform 属性,代码设置了位图的 transform 的 colorTransform 属性,使用构思好的设置来制作一张底片效果的图像:

package {
 import flash.display.Bitmap;
 import flash.display.Sprite;
 import flash.geom.ColorTransform;
 public class TransformColor extends Sprite {
  [Embed(source="picture.jpg")];
  public var Picture:Class;
  public function TransformColor() {
   init();
  }
  private function init():void {
   var pic:Bitmap=new Picture    ;
   addChild(pic);
   pic.transform.colorTransform=new ColorTransform(-1,-1,1,1,

   255,255,255,0);
  }
 }
}

测试这个影片时,请改变这行代码
[Embed(source="picture.jpg")]
请匹配这个路径为所使用图片的路径,如果在 Flash IDE 中编辑,只需要在库中导入这张图片,为 ActionScript 导出,并输入类名为 Picture。重要的一句是 ColorTransform 的设置。

出处:蓝色理想
责任编辑:bluehearts

上一页 渲染技术 [6] 下一页 渲染技术 [8]

◎进入论坛RIA设计与应用版块参加讨论

相关文章 更多相关链接
FLASH小游戏开发 第二节
用photoshop制作文字波动动画
制作旗帜飘扬动画
Making Things Move 第三章
Silverlight制作逐帧动画
作者文章
Making Things Move 第三章
Making Things Move 第二章
Making Things Move 第一章
贪吃蛇游戏代码翻译
关键字搜索 常规搜索 推荐文档
热门搜索:CSS Fireworks 设计比赛 网页制作 web标准 用户体验 UE photoshop Dreamweaver Studio8 Flash 手绘 CG
站点最新 站点最新列表
周大福“敬•自然”设计大赛开启
国际体验设计大会7月将在京举行
中国国防科技信息中心标志征集
云计算如何让安全问题可控
云计算是多数企业唯一拥抱互联网的机会
阿里行云
云手机年终巨献,送礼标配299起
阿里巴巴CTO王坚的"云和互联网观"
1499元买真八核 云OS双蛋大促
首届COCO桌面手机主题设计大赛
栏目最新 栏目最新列表
浅谈JavaScript编程语言的编码规范
如何在illustrator中绘制台历
Ps简单绘制一个可爱的铅笔图标
数据同步算法研究
用ps作简单的作品展示页面
CSS定位机制之一:普通流
25个最佳最闪亮的Eclipse开发项目
Illustrator中制作针线缝制文字效果
Photoshop制作印刷凹凸字体
VS2010中创建自定义SQL Rule
>> 分页 首页 前页 后页 尾页 页次:7/91个记录/页 转到 页 共9个记录

蓝色理想版权申明:除部分特别声明不要转载,或者授权我站独家播发的文章外,大家可以自由转载我站点的原创文章,但原作者和来自我站的链接必须保留(非我站原创的,按照原来自一节,自行链接)。文章版权归我站和作者共有。

转载要求:转载之图片、文件,链接请不要盗链到本站,且不准打上各自站点的水印,亦不能抹去我站点水印。

特别注意:本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有,文章若有侵犯作者版权,请与我们联系,我们将立即删除修改。

您的评论
用户名:  口令:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册 为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
网站可用性测试及优化指南
《写给大家看的色彩书1》
《跟我去香港》
众妙之门—网站UI 设计之道
《Flex 4.0 RIA开发宝典》
《赢在设计》
犀利开发—jQuery内核详解与实践
作品集 更多内容

杂⑦杂⑧ Gold NORMANA V2