您的位置: 首页 > 技术文档 > 多媒体制作 > 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 设计比赛 网页制作 Dreamweaver Studio8 Flash
站点最新 站点最新列表
跟我去香港:The third Day
单件模式结合命令链模式
快乐狗原创动漫大赛
元素层叠级别及z-index剖析
CSS 浏览器的等宽空格
电影变形金刚概念画欣赏
疯狂的程序员 第三十五回
疯狂的程序员 第三十四回
疯狂的程序员 第三十三回
运用ASDoc工具
栏目最新 栏目最新列表
火星人的耳机
公司正式宣布创业失败
用corelDEAW 12打造唇膏
二行代码解决全部网页木马
一行代码解决iframe挂马
Photoshop制作星空爆炸效果
CorelDraw 12打造休闲裤
Firework如何画特殊的切角图形
Firework打造韩式风格的手提袋
flash实例:打造佛光效果
 
>> 分页 首页 前页 后页 尾页 页次:7/91个记录/页 转到 页 共9个记录

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

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

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

本文现有 2 条评论 评分:- llllllllllllllllllll + 评分人数: 1 ,平均分: 5.00


234409580 Publish at 2008-5-27 23:50:59 评分5
AAAsell
234409580 Publish at 2008-5-27 23:50:38
<a href="http://www.aaasell.com">AAAsell</a>
您的评论
用户名:  口令:
说明:输入正确的用户名和密码才能参与评论。如果您不是本站会员,你可以注册 为本站会员。
注意:文章中的链接、内容等需要修改的错误,请用报告错误,以利文档及时修改。
不评分 1 2 3 4 5
注意:请不要在评论中含与内容无关的广告链接,违者封ID
请您注意:
·不良评论请用报告管理员,以利管理员及时删除。
·尊重网上道德,遵守中华人民共和国的各项有关法律法规
·承担一切因您的行为而直接或间接导致的民事或刑事法律责任
·本站评论管理人员有权保留或删除其管辖评论中的任意内容
·您在本站发表的作品,本站有权在网站内转载或引用
·参与本评论即表明您已经阅读并接受上述条款
推荐文档 | 打印文档 | 评论文档 | 报告错误  
专业书推荐 更多内容
大师之路--Photoshop 完全解析
《超越CSS》新书上市
Don't Make Me Think 第2版
HTML与CSS入门经典(第7版)
《FLASH MX2004网站开发精粹》
《CSS入门经典》
《设计师谈网页设计思维》
作品集 更多内容

5.12&#45;人间有爱(纪念遇难同胞) 金刚狼 少工委首页 版面 宁波人防综合信息网 CROSS&nbsp;FIRE 绿色狂想 绿色长城基金会