AndEngine是支持Tiled地图编辑器的,Tiled地图编辑器是很强大的,而且AndEngine对它的支持也很好,甚至可以设置碰撞以及动画的地图,可以参照AndEngineExample。
但是有时候我们只是需要一个简单的二维数组来表示一个地图,我们不会设置复杂的地形已经碰撞的检测,这时我们就需要自定义我们需要的地图了!(PS:AndEngine中对Tiled的扩展也是基于这个原理的)。
原理:用一个二维数组来表示地图,每一个数组元素对应于Tile的TextureRegion的索引,二维数组的元素值就是当前地图资源的索引值的数组!
原理很简单,实现是用AndEngine为我们提供的SpriteBatch来绘制的,它会大大的增加绘制的效率,关于SpriteBatch的详细介绍。
这里为了简单,只做了一个网格规则的地图,如果需要更丰富的地图信息,添加更多的地图Tiled资源和对应的绘制就可以了!
(PS:用了个小算法定义出相邻的两个Tiled使用不同的图片资源)
/**
* 初始化地图,为了做出网格的效果,用了两张图片交替绘制
*/
private void initMap()
{
for (int i=0; i<MAP_BG.length; i++)
for (int j=0; j<MAP_BG[i].length; j++)
{
if ((i + j) % 2 == 1)
{
MAP_BG[i][j] = 1;
}
}
}
绘制的规则就是根据地图二维数组的元素值对应不同的图片Tiled资源,如果需要更复杂的地图,可以定义更复杂的对应规则
使用SpriteBatch的原因是为了提高绘制的效率,SpriteBatch对Tiled资源的共享做了优化!
/**
* 初始化SpriteBatch
*/
private void initBGSpriteBatch()
{
bgSpriteBatch = new SpriteBatch(bgBitmapTextureAtlas, MAP_BG.length * MAP_BG[0].length, getVertexBufferObjectManager());
for (int i=0; i<MAP_BG.length; i++)
for (int j=0; j<MAP_BG[i].length; j++)
{
if (MAP_BG[i][j] == 0)
{
bgSpriteBatch.draw(bg0TextureRegion, j * TILE_SIZE, i * TILE_SIZE,
TILE_SIZE, TILE_SIZE, 0, 1, 1, 1, 1);
}
else if (MAP_BG[i][j] == 1)
{
bgSpriteBatch.draw(bg1TextureRegion, j * TILE_SIZE, i * TILE_SIZE,
TILE_SIZE, TILE_SIZE, 0, 1, 1, 1, 1);
}
}
bgSpriteBatch.submit();
}
(PS:记得调用SpriteBatch.submit())
单调的效果如下:
源码下载地址:点击下载