塔防应用之ByteArray的使用

这段时间一直在开发塔防游戏,说的不好听点就是在山寨一款塔防游戏——Kingdom Rush(皇家守*);博主觉得这款游戏的可玩性还是非常高的,画面和关卡的设计都非常的精美和吸引人,希望各位博友有时间可以去试玩和体验。

当然,博主在开发中需要用到塔防的地图编辑器,主要就是写入地图的障碍信息,用于敌人的寻路。
简单的介绍了地编的一些需求和ByteArray的一些简单介绍,希望能给施主带来帮助。
原文链接:http://www.xplabs.me/xp/?p=307 作者:韩 贤明   发布:2012-04-07 11:10



正文如下:

这段时间一直在开发塔防游戏,说的不好听点就是在山寨一款塔防游戏——Kingdom Rush(皇家守*);博主觉得这款游戏的可玩性还是非常高的,画面和关卡的设计都非常的精美和吸引人,希望各位博友有时间可以去试玩和体验。

当然,博主在开发中需要用到塔防的地图编辑器,主要就是写入地图的障碍信息,用于敌人的寻路。
首先来分析一下地图编辑器的需求把:
         1.可以导入地图的背景图片
         2.可以进行障碍点的编辑;
         3.可以在地图编辑器中摆放建筑;
         5.点击格子自动复制格子的坐标到剪切板中;
         4.可以导出编辑后的地图文件
导出的地图文件包括如下的信息:
         1.地图的背景图片资源号;
         2.地图的横向格子数和纵向格子数;
         3.地图的障碍数据;
         4.地图中摆放的建筑信息;

的确,在明确了需求之后,开发地图编辑器就变得简单许多。现在的这个版本的地编还是很简单的,等有新的需求在后在进行新的功能开发。

先来看下地图编辑齐的界面效果把,如下图:

塔防应用之ByteArray的使用
 
上图是地图编辑之后的效果,红色的代表可以通行的区域,其他没有颜色的格子就是障碍不可通行的区域;(ps:不知博友看出来没,图片资源都是从皇家守卫里面抠出来的,仅限个人用途。喃唔哦弥陀佛,施主,贫僧只是借用一二,善哉,善哉!)


YEAH!! so cool!!

编辑之后就是需要导出地图数据了。在这里我用到了ByteArray,所有的地图数据都写入ByteArray,然后保存为.map文件,当然后缀是可以自己随便命名的,随你喜好就行。

  1. /**
  2. * 导出地图文件.map
  3. */
  4. private function export():void
  5. {

  6.     //创建ByteArray的实例
  7.     var bytes:ByteArray = new ByteArray();
  8.     //写入地图的资源号
  9.     bytes.writeShort(Globals.mapId);
  10.     //写入横向的格子数和纵向的格子数
  11.     bytes.writeShort(Globals.gridLayer.CW);
  12.     bytes.writeShort(Globals.gridLayer.CH);
  13.     var gridData:Vector.<Point> = Globals.gridLayer.exportData;
  14.     var len:int = gridData.length;
  15.     //写入网格障碍点的个数长度
  16.     bytes.writeShort(len);
  17.     //写入网格障碍数据
  18.     for (var i:int = 0; i < len; i++)
  19.     {
  20.         bytes.writeShort(gridData[i].x);
  21.         bytes.writeShort(gridData[i].y);
  22.     }
  23.     var buildData:Vector.<BuildNode> = Globals.buildLayer.exportData;
  24.     len = buildData.length;
  25.     //写入建筑列表的长度
  26.     bytes.writeShort(len);
  27.     //写入建筑的信息面包括建筑的Id,建筑的格子坐标
  28.     for (i = 0; i < len; i++)
  29.     {
  30.         bytes.writeUTF(buildData[i].id);
  31.         bytes.writeShort(buildData[i].cellX);
  32.         bytes.writeShort(buildData[i].cellY);
  33.     }
  34.     //使用 deflate 压缩算法压缩字节数组。压缩整个字节数组。
  35.     bytes.deflate();
  36.     _importFile.save(bytes, "6001.map");
  37. }
复制代码


经过上述代码之后,会把地图的所有数据写入到ByteArray中,并且进行了压缩,这减少了ByteArray的体积;当然在实际用当中必须要使用解压缩算法才能进行使用ByteArray中的数据,可调用ByteArray中的inflate()。

这里就说说ByteArray写入数据几个常用的方法;


writeBoolean 写入布尔值。根据 value 参数写入单个字节。如果为 true,则写入 1,如果为 false,则写入 0。
如果我们只需要写入布尔值,则可以调用writeBoolean(true);

writeByte 在字节流中写入一个字节。使用参数的低 8 位,忽略高 24 位。其写入的值范围是 -128 和 127 之间的整数。

writeBytes 将指定字节数组 ByteArray(起始偏移量为 offset,从零开始的索引)中包含 length 个字节的字节序列写入字节流。如果你想要写入另外一个ByteArray的实例,则可以调用此方法,将新的ByteArray写入到已有的字节数组中。

writeDouble 在字节流中写入一个 IEEE 754 双精度(64 位)浮点数。
可以写入一个Number类型的数字,IEEE双精度格式具有53位有效数字精度,并总共占用64位。

writeFloat 在字节流中写入一个 IEEE 754 单精度(32 位)浮点数。
可以写入一个Number类型的数字,IEEE单精度格式具有24位有效数字,并总共占用32 位。

writeInt 在字节流中写入一个带符号的 32 位整数。
可写入一个int类型的整数,int 类表示的值的范围是:-2,147,483,648 (-2^31) 到 2,147,483,647 (2^31-1)。

writeShort 在字节流中写入一个 16 位整数。使用参数的低 16 位忽略高 16 位;其写入的值范围是是从 -32768 到 32767。

writeUnsignedInt 在字节流中写入一个无符号的 32 位整数。uint 类表示的值的范围介于 0 到 4,294,967,295 (2^32-1) 之间。

writeUTF 将 UTF-8 字符串写入字节流。先写入以字节表示的 UTF-8 字符串长度(作为 16 位整数),然后写入表示字符串字符的字节。 可以写入一串字符串,在写入时有长度的前缀,其长度范围在0到65535;

writeUTFBytes 将 UTF-8 字符串写入字节流。类似于 writeUTF() 方法,但 writeUTFBytes() 不使用 16 位长度的词为字符串添加前缀。


当然了,有写入的方法指定是有读取的方法,是和写入的方法一一对应的,详情可以查看API。

简单的介绍了ByteArray的一些方法,希望能给各位带来帮助,能够对ByteArray有一个初步的了解。

塔防的地图编辑器已经告一段落,后面当然是把编辑好的地图文件导入到游戏中去了。