将 MovieClip 转换为 BitmapData

地图大小960X560,地图的网格大小为10X10,使用了一个二维数组保存网格数据。

之前的地图中的阻塞区域的生成是通过一个地图编辑器,需要人工去绘制地图上的网格,将地图上不可走区域所对应的网格绘制为红色,然后导出为XML文件,在程序中去读取XML文件进行解析。由于这个地图编辑器是以前的同事写的,性能实在不敢恭维,绘制工作十分繁琐,再加上大量的地图,主管给我添加了一个任务,就是将读取XML的方式换成读取像素,通过像素的方式去生成和XML方式一样的数据。

具体的思路其实就是由美工绘制一张黑白图,通过读取对应的像素判断是0XFFFFFF还是0X000000,由此生成1和0。

为了便于管理,还需要将这个阻塞图嵌入到地图的SWF文件中。

图片资源在SWF中不能够动态的去得到,可以得到的只有类的实例,最基本的几个实例就是MovieClip,SimpleButton,TextField,所以我就想到是不是可以将图片放入一个实例中,然后去获取这个实例,所以SimpleButton和TextField可以排除,剩下MovieClip,我就新建一个元件,命名为Block,然后在里面放入图片资源,并在舞台上放一个实例,但是这个实例显然是不需要显示在舞台上的,只是需要使用一下就可以扔掉了,所以应该获得这个类,用的时候就实例化一个就行。

要从一个SWF中获得一个导出类,就需要知道一个域的概念,在FLASH中,每个SWF都有一个域,而当前的程序中的域,可以通过ApplicationDomain.currentDomain得到,要得到一个导出类就要从相应的SWF的域中去getDefinition,请看代码: 

  
    
private function load(): void
{
var loader:Loader
= new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
var loaderContext:LoaderContext
= new LoaderContext( false , ApplicationDomain.currentDomain);
loader.load(
new URLRequest( " map.swf " ), loaderContext);

function loadComplete(e:Event):
void
{
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loadComplete);
var cls:Class
= ApplicationDomain.currentDomain.getDefinition( " Block " ) as Class;
}
}

以上是将加载的SWF的域作为当前域的子域,关于这方面的内容可到网上搜索。

参考:http://www.duzengqiang.com/blog/post/283.html

得到了导出类,接下来就解决由一个 MovieClip 得到BitmapData,到GOOGLE搜索一个"MovieClip 转换 BitmapData",结果很快就来了,原来BitmapData有一个方法draw,可以将源数据的内容绘制到自身,间接就得到了像素的数据。通过BitmapData的方法getPixel得到相应位置的像素。

参考:http://www.actionscript.org/forums/showthread.php3?t=157145

你可能感兴趣的:(bitmap)