将 MovieClip 转换为 BitmapData
时间:2010-10-19 来源:YiLi
之前的地图中的阻塞区域的生成是通过一个地图编辑器,需要人工去绘制地图上的网格,将地图上不可走区域所对应的网格绘制为红色,然后导出为XML文件,在程序中去读取XML文件进行解析。由于这个地图编辑器是以前的同事写的,性能实在不敢恭维,绘制工作十分繁琐,再加上大量的地图,所以项目主管给我添加了一个任务,就是将读取XML的方式换成读取像素,通过像素的方式去生成和XML方式一样的数据。
具体的思路其实就是由美工绘制一张黑白图,通过读取对应的像素判断是0XFFFFFF还是0X000000,由此生成1和0。
为了便于管理,还需要将这个阻塞图嵌入到地图的SWF文件中。
我上网找了一个关于从SWF中读取嵌入资源的方式,不过没什么收获。
图片资源在SWF中不能够动态的去得到,可以得到的只有类的实例,最基本的几个实例就是MovieClip,SimpleButton,TextField,所以我就想到是不是可以将图片放入一个实例中,然后去获取这个实例,所以SimpleButton和TextField可以排除,剩下MovieClip,我就新建一个元件,命名为Block,然后在里面放入图片资源,并在舞台上放一个实例,但是这个实例显然是不需要显示在舞台上的,只是需要使用一下就可以扔掉了,所以我想应该获得这个类,用的时候就实例化一个就行。
要从一个SWF中获得一个导出类,就需要知道一个域的概念,在FLASH中,每个SWF都有一个域,而当前的程序中的域,可以通过ApplicationDomain.currentDomain得到,要得到一个导出类就要从相应的SWF的域中去getDefinition,请看代码:
private function beginLoad():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); } private function loadComplete(e:Event):void { var cls:Class = ApplicationDomain.currentDomain.getDefinition("Block") as Class; }
以上是将加载的SWF的域作为当前域的子域,关于这方面的内容可到网上搜索。
参考:http://www.duzengqiang.com/blog/post/283.html
得到了导出类,接下来就解决由一个 MovieClip 得到BitmapData,到GOOGLE搜索一个"Convert a MovieClip to BitmapData",结果很快就来了,原来BitmapData有一个方法draw,可以将源数据的内容绘制到自身,间接就得到了像素的数据。通过BitmapData的方法getPixel得到相应位置的像素。
参考:http://www.actionscript.org/forums/showthread.php3?t=157145
以上就是我解决这个问题的一个思考及解决过程。