在Andengine的世界里,一切看到的对象都是Entity,而Entity需要由图片来装饰才是我们真正看到的东西。这里的图片在Andengine里就是Texture(通常翻译为纹理,不过LZ不太喜欢这个翻译,太生硬)。
这里总结一下将图片资源Load到内存成为Texture的几种情况。
1、 Load单个的图片
首先要生成一个Atlas(纹理地图), 这个地图可以容纳很多的sub-texture, LZ现在不是太理解这个东西存在的意义,不过我猜测是用来提高效率的。有了Atlas以后就可以将图片Load到Altas中,并且生成一个Texture的引用。
这里使用的是BitmapTextureAtlasTextureRegionFactory这个工厂类。 这个工厂类里有很多静态方法,可以让我们从res资源文件夹、asset文件夹、sd卡加载我们想要的图片。
2、 从已有的Texture中抽取
我们也会遇上这样的情况, 我们已经load了一张很大的图片包含了你想要的图片(类似于地图), 这时可以直接从当前的texture中根据坐标来抽取子texture。
这里的操作是通过TextureRegionFactory这个工厂类里的静态方法完成的。
3、 从压缩的图片中加载(pvr)
Anengine的扩展包里有一个PVRCCZTexture类,可以以流的形式将压缩图片加载入内存,之后的操作,就如同2中,只要直接从texture中抽取想要的图片就可以了。
4、 使用图片打包工具(texturepacker)
TexturePacker是一个很方便的图片打包工具,它可以将小图片放到一个大图里面,这样可以尽可能的减少图片所占用的体积。并且可以打成多种引擎所支持的格式,这里我们只看Andengine支持的格式。
使用TexurePacker打出来的文件分为三个部分,一个部分是图片源文件,这里可以是png格式,也可以是经压缩过的pvr.czz格式,事实上,格式不重要,只要源文件存在就行;第二个部分是一个xml配置文件,这个文件里会记录每个sub-texture的坐标,还有压缩格式等一些元信息,以便我们加载的时候使用;第三个部分是一个interface类,这里记录的是读取texture的时候需要用到的各个texure的id。
final TexturePack spritesheetTexturePack = new TexturePackLoader(this.getTextureManager(), "gfx/spritesheets/").loadFromAsset(this.getAssets(), "texturepackerexample.xml");
spritesheetTexturePack.loadTexture();
this.mSpritesheetTexturePackTextureRegionLibrary = spritesheetTexturePack.getTexturePackTextureRegionLibrary();
加载过后,我们就可以用mSpritesheetTexturePackTextureRegionLibrary根据id来获取各个texture