首先,可以参考上篇博文《根据系列图片绘制动画理解》将动画制作出来;
其次,地图绘制可以借助工具,得到相应的地图数组数据;
最后,有了地图数组数据,则可以从提供的地图库文件根据ID得到相应的地图块,然后画在屏幕上;
因为地图数组数据比较容易得到,再次不过多阐述,分析关键的绘图原理机制:
1. 准备一张地图库文件(其中包含了所有地图上需要的图形元素,如右所示),所有的地图元素都从这里面切割出去,然后绘制成想要的东西;
2. 可以由工具得到想要的地图数组数据,如下:
//第一层游戏View地图数组
public int [][]mMapView = {
{ 1, 1, 1, 1, 137, 137, 137, 1, 1, 1 },
{ 1, 1, 1, 1, 137, 137, 137, 1, 1, 1 },
{ 1, 1, 1, 1, 137, 137, 137, 1, 1, 1 },
{ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137 },
{ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 137, 137 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 137, 137 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 137, 137 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 137, 137 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 137, 137 },
{ 1, 1, 1, 1, 1, 1, 1, 1, 137, 137 },
{ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137 },
{ 137, 137, 137, 137, 137, 137, 137, 137, 137, 137 },
{ 1, 1, 1, 1, 1, 137, 137, 137, 1, 1 },
{ 1, 1, 1, 1, 1, 137, 137, 137, 1, 1 }
};
//第二层游戏实体actor数组
public int [][]mMapAcotor = {
{ 102, 103, 103, 104, 0, 0, 0, 165, 166, 167 },
{ 110, 111, 111, ......
......
3. 通过2中的地图数组数据,我们可以代码中动态的切割上面的地图库文件来进行绘制;
private void DrawMap(Canvas canvas,Paint paint ,Bitmap bitmap) { int i,j; for(i = 0; i< TILE_HEIGHT_COUNT; i++) { for(j = 0; j<TILE_WIDTH_COUNT;j++) { int ViewID = mMapView[i][j]; int ActorID = mMapAcotor[i][j]; //绘制地图第一层 if(ViewID > TILE_NULL) { DrawMapTile(ViewID,canvas,paint,bitmap, j * TILE_WIDTH , i * TILE_HEIGHT); } //绘制地图第二层 if(ActorID > TILE_NULL) { DrawMapTile(ActorID,canvas,paint,bitmap, j * TILE_WIDTH , i * TILE_HEIGHT); } } } }
此处TILE_HEIGH_COUNT为纵向tile的数量,TILE_WIDTH_COUNT为横向tile的数量,viewId代表在地图库文件中的具体位置,actorId也是一样,那么通过一个id是如何找到在地图库文件中的位置的呢?我们来看看DrawMapTile()方法是如何实现的:
由此处代码可以看出,tile的id在地图库文件中是按横向顺序排列的方式定义的,假如横排10个,竖排15个,现在有一个ID为66的tile,则应该在第7行的第7个位置。按照上面的算法,id-- = 65;int count = 65/10=6;
Int bitmapX = (66-(6*10))*32 = 6*32,int bitmapY = 6*32,于是可以根据这个tile的x和y的具体值可以找到地图库文件中的一个矩形区域,然后接下来,变为想到的一个tile,于是整个地图便是由一个一个这样的tile得到而来。