最近工作比较忙,要学的东东比较多,所以AndEngine就耽搁下了,一直还停在之前的理解上,虽说现在的游戏是基于AndEngine的,但是已经处在被动的学习状态下了(遇到问题的时候再去看看原理。。。),很不好,其实AndEngine还是很优秀的,虽说没有文档,但是源码就是最好的文档!
在上一篇blog中我总结了一下加载资源的几种常见的方式,只是站在我的角度来总结的,没想到竟然有同学回复了(受宠若惊。。。),而且两个同学都提到了如何将单帧的图片组合成为动画精灵的加载方式这个问题!
这个问题我最开始的时候就想过了,不论是引擎带的Example和论坛里的一些帖子,都没有提到过相关的东西(可能论坛里提到过,我没找到吧。。。),但是转念一想这种需求确实很需要,所以猜测AndEngine一定为我们提供了这种简单的操作,终于在一次读代码的过程中不经意间找到了。
说偶然也好,其实缕一缕头绪还是很容易想到突破口的。
帧动画资源,当然是用在AnimatedSprite上了,而AnimatedSprite的构造方法中需要的ITiledTextureRegion是Tiled而不是普通的TextureRegion,也就是说,是基于单帧动画资源的!
TileTextureRegion的一般用法,就是一张大图,是由很多单帧图片构成的,Example中很多例子都是这样的,比较典型的就是那个RGB的雏形,一般是通过调用BitmapTextureAtlasTextureRegionFactory中的createTiledFromAsset(...)方法创建的,这是一般用法,正是这些静态方法,让我们忽略了TiledTextureRegion自身的构造方法
public TiledTextureRegion(final ITexture pTexture, final ITextureRegion ... pTextureRegions)
哈哈,两位同学等的就是这个构造方法!
其实要想找到这个问题的解决方法很简单,就是一步一步跟下来,从BitmapTextureAtlasTextureRegionFactory的createTiledFromAsset(),到TextureRegionFactory的createTiledFromSource(),再到TiledTextureRegion的create(),当你看到下面的代码时,脑筋一转,就知道归根结底还是调用的TiledTextureRegion的构造方法了。。。
public static TiledTextureRegion create(final ITexture pTexture, final int pTextureX, final int pTextureY, final int pTextureWidth, final int pTextureHeight, final int pTileColumns, final int pTileRows, final boolean pRotated) {
final ITextureRegion[] textureRegions = new ITextureRegion[pTileColumns * pTileRows];
final int tileWidth = pTextureWidth / pTileColumns;
final int tileHeight = pTextureHeight / pTileRows;
for(int tileColumn = 0; tileColumn < pTileColumns; tileColumn++) {
for(int tileRow = 0; tileRow < pTileRows; tileRow++) {
final int tileIndex = tileRow * pTileColumns + tileColumn;
final int x = pTextureX + tileColumn * tileWidth;
final int y = pTextureY + tileRow * tileHeight;
textureRegions[tileIndex] = new TextureRegion(pTexture, x, y, tileWidth, tileHeight, pRotated);
}
}
return new TiledTextureRegion(pTexture, false, textureRegions);
}
我们通过对每帧图片的加载,组合成一张大的纹理(显存中图片的存在形式),然后使用,就是这么简单!
我写了一个简单的Demo,仅仅介绍一下最简单的用法,希望对初学者有些帮助!
bitmapTextureAtlas = new BitmapTextureAtlas(getTextureManager(), 512, 128);
// 假设有6张分开的帧图片
TextureRegion[] childTextureRegions = new TextureRegion[6];
for (int i=0; i<6; i++)
{
childTextureRegions[i] = (TextureRegion) BitmapTextureAtlasTextureRegionFactory.createFromAsset(bitmapTextureAtlas,
this, "game_mole" + (i + 1) + ".png", i * 85, 0);
}
// 关键的构造方法
tiledTextureRegion = new TiledTextureRegion(bitmapTextureAtlas, childTextureRegions);
bitmapTextureAtlas.load();
animatedSprite = new AnimatedSprite(200, 400, tiledTextureRegion, getVertexBufferObjectManager());