游戏引擎AndEngine总结(七):用AndEngine简单实现根据二维数组生成地图(Mappy原理)

AndEngine是支持Tiled地图编辑器的,Tiled地图编辑器是很强大的,而且AndEngine对它的支持也很好,甚至可以设置碰撞以及动画的地图,可以参照AndEngineExample。

但是有时候我们只是需要一个简单的二维数组来表示一个地图,我们不会设置复杂的地形已经碰撞的检测,这时我们就需要自定义我们需要的地图了!(PS:AndEngine中对Tiled的扩展也是基于这个原理的)。


原理:用一个二维数组来表示地图,每一个数组元素对应于Tile的TextureRegion的索引,二维数组的元素值就是当前地图资源的索引值的数组!


原理很简单,实现是用AndEngine为我们提供的SpriteBatch来绘制的,它会大大的增加绘制的效率,关于SpriteBatch的详细介绍。

1.初始化地图的二维数组

这里为了简单,只做了一个网格规则的地图,如果需要更丰富的地图信息,添加更多的地图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;
				}
			}
	}

2.SpriteBatch根据二维数组绘制地图

绘制的规则就是根据地图二维数组的元素值对应不同的图片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())


单调的效果如下:

游戏引擎AndEngine总结(七):用AndEngine简单实现根据二维数组生成地图(Mappy原理)_第1张图片


源码下载地址:点击下载



你可能感兴趣的:(游戏,算法,优化,扩展,引擎,网格)