Linux笔记AS笔记 PHP笔记 C笔记 FLASH 3D
返回首页
当前位置: 首页 > 开发笔记 > AS笔记 >

利用AS3块传输技术呈现游戏元素

时间:2010-03-02 10:02来源:未知 作者:admin 点击:
许多类型的 游戏 ,用户体验都依赖于终端可拥有的屏幕像素和移动物体有多快。当让大量的DisplayObject 对象 动起来时,如MovieClip或Sprite对象, Adobe Flash Player可能在表现上会大大折扣。

 许多类型的游戏,用户体验都依赖于终端可拥有的屏幕像素和移动物体有多快。当让大量的DisplayObject对象动起来时,如MovieClip或Sprite对象,Adobe Flash Player可能在表现上会大大折扣。Flash Player必须遍历显示对象树并为每个基于向量的DisplayObject计算渲染输出,这样会消耗CPU周期成为真正的瓶颈,尤其是低端机。
     许多屏幕动画游戏都是预先载入一张位图,这种技术被称为blitting(块传输)。块传输虽不能解决所有性能问题,但它能使动画运行平滑,统一大多数机器上动画帧频。Blitting术语来自于BitBLT为Xerox Alto计算机日常中创建。BitBLT发音为“bit blit”,主张bit-block (image) transfer图像基于位块传输,是一种采用数张位图并合并成一张位图的技术。在Flash Player中复制位图像素到一张渲染图中比分别地渲染每个DisplayObject更为快速。
    在本文中,我描述了软件位块传输技术并提供示例代码,因此你可以在ActionScript中应用它。
要求
为了满足本文条件,你需要下列软件和文件。


预备知识
     本文假定你已熟悉Flash Builder 4 和 ActionScript 3项目工作的知识。
介绍sprite sheet
       一个游戏由许多图形元件组成,例如赛道上的车或森林中的一棵树。在本文中,这些元件都是位图。一组位图放在一个单独的图像文件中称为sprite sheet。例如,一个sprite sheet可能包含一个角色行走动画的所有帧。这个词衍生于sprite,在计算机图形世界中,指的是一张图像或一个大场景中集成的动画。虽然位块传输技术可以使用不同来源的位图数据,但在本文中重点放在sprite sheet。
  一个sprite sheet由什么构成?
     一个sprite sheet可以对不同大小的位图进行组合。将所有图形元素组装到一个大的图像文件中会减少加载时间(打开和读取一个包含100帧的较大文件比打开读取100个小文件更为快速)并提供压缩的好处。特别是sprite sheet持有同样大小形成一个序列的位图或围绕一个特定游戏元素动画。例如,本文中使用的sprite sheet有五列四行,每格40*40像素,每个都包含着一个brown collector褐色元素(见图1)。


图1 sprite sheet示例显示了20个单元格,每格为40*40像素

设置ActionScript项目
    在你运行示例代码前,你将需要在Flash Builder 4按照以下步骤设置项目。
1.        下载并解压示例文件
2.        选择File > New > ActionScript Project来创建项目
3.        输入ActionScriptBlitting作为项目名称并点击Finish
4.        从示例文件中复制下列文件和文件到项目默认包中:ActionScriptBlittingPart1.as, ActionScriptBlittingPart2.as, ActionScriptBlittingPart3.as, ActionScriptBlittingPart4.as和spritesheets。Spritesheets文件夹中包含了用于ActionScript示例的PNG文件。
5.        在Package Explorer中,右键点击ActionScriptBlitting项目在弹出菜单上选择Properties。
6.        在Properties属性对话框中点击ActionScript Applications。
7.        点击Add,选择ActionScriptBlittingPart1.as,并点击OK。
8.        将ActionScriptBlittingPart2.as,ActionScriptBlittingPart3.as, 和 ActionScriptBlittingPart4.as重复第7步。
9.        点击OK
现在Flash Builder 4中示例代码就设置好了,你就可以运行该示例。

用ActionScript嵌入一个sprite sheet
       在ActionScript中你可以通过使用Embed元数据标签嵌入图像。(更多信息请查看Embedding metadata with Flash)一旦它们被嵌入,你可创建类的实例并附加到显示列表,如ActionScriptBlittingPart1.as:

  1. ActionScriptBlittingPart1.as
  2.  
  3. package
  4. {
  5.    import flash.display.Sprite;
  6.    [SWF(width=480, height=320, frameRate=24, backgroundColor=0xE2E2E2)]
  7.    public class ActionScriptBlittingPart1 extends Sprite
  8.    {  
  9.       public function ActionScriptBlittingPart1()
  10.       {
  11.          addChild(new BrownCollector());
  12.       }
  13.       [Embed(source="spritesheets/browncollector.png")]
  14.       public var BrownCollector:Class;
  15.    }
  16. }
复制代码
要运行第一个示例,请参照下列步骤:
        在Package Explorer中,在ActionScriptBlittingPart1.as文件上点击右键选择Run Application。
        当浏览器打开时,你会看到所有单元格都有PNG图像(browncollector.png),效果见图1.
        关闭浏览器窗口。
Blitting a sprite sheet
     第二步,你将要用到Flash Player APIBitmap 和 BitmapData,从sprite sheet复制一个单元格(或帧)到屏幕上,而这个操作可以通过BitmapData.copyPixels()方法来完成,复制输入位图数据的像素到正在制作的位图实例上。在ActionScript中纳入blitting,copyPixels()方法还提供参数来定义要复制输入位图的区域以及如何定义和合并alpha像素。
  1. ActionScriptBlittingPart2.as
  2.  
  3. package
  4. {
  5.    import flash.display.Bitmap;
  6.    import flash.display.BitmapData;
  7.    import flash.display.Sprite;
  8.    import flash.geom.Point;
  9.    import flash.geom.Rectangle;
  10.    [SWF(width=480, height=320, frameRate=24, backgroundColor=0xE2E2E2)]
  11.    public class ActionScriptBlittingPart2 extends Sprite
  12.    {
  13.       public function ActionScriptBlittingPart2()
  14.       {
  15.          // Create input bitmap instance
  16.         spritesheet = (new BrownCollector() as Bitmap).bitmapData;
  17.  
  18.          // Add a Bitmap to the display list that will copyPixels() to.
  19.          canvas =  new BitmapData(480, 320, true, 0xFFFFFF);
  20.          addChild(new Bitmap(canvas));
  21.          rect = new Rectangle(0, 0, 40,40); // 1st Tile
  22.          //** Section 1 ** //
  23.          // rect = new Rectangle(40, 0, 40, 40); // 2nd Tile
  24.          // rect = new Rectangle(80, 0, 40, 40); // 3rd Tile
  25.          // ...
  26.          // rect = new Rectangle(160, 120, 40, 40); // 20th Tile
  27.           canvas.copyPixels(spritesheet, rect,  new Point(0, 0));
  28.          //** END Section 1 **/
  29.      
  30.          /** Section 2 ** //
  31.          for (var i:int = 0; i < 20; i++)
  32.          {
  33.             rect.x = (i % 5) * 40;
  34.             rect.y = int(i / 5) * 40;
  35.             canvas.copyPixels(spritesheet, rect, new Point(i*10, 0));
  36.             // Section 3:
  37.             // canvas.copyPixels(spritesheet, rect,
  38.             // new Point(i*10, 0), null, null, true);
  39.          }
  40.          //** END Section 2 **/
  41.       }
  42.   
  43.       [Embed(source="spritesheets/browncollector.png")]
  44.       public var BrownCollector:Class;
  45.       public var canvas:BitmapData; 
  46.       public var spritesheet:BitmapData;
  47.       public var rect:Rectangle;
  48.    }
  49. }
复制代码

在Package Explorer中的ActionScriptBlittingPart2.as文件上点击右键并选择Run Application。你将会看到来自sprite sheet的第一个单无格显示在浏览器中(见图2)。


图2 ActionScriptBlittingPart2输出(利用Section 1代码)
(责任编辑:admin)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名:密码: 验证码:点击我更换图片
推荐内容