首先,可以參考上篇博文《根據系列圖片繪製動畫理解》將動畫製作出來;
其次,地圖繪製可以藉助工具,得到相應的地圖數組資料;
最後,有了地圖數組資料,則可以從提供的地圖庫檔案根據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()方法是如何?的:
private void DrawMapTile(int id,Canvas canvas,Paint paint ,Bitmap bitmap,int x, int y) { //根據數組中的ID算出在地圖資源中的XY 座標 //因為編輯器預設0 所以第一張tile的ID不是0而是1 所以這裡 -1 id--; int count = id /mWidthTileCount; int bitmapX = (id - (count * mWidthTileCount)) * TILE_WIDTH; int bitmapY = count * TILE_HEIGHT; DrawClipImage(canvas,paint,bitmap,x,y,bitmapX,bitmapY,TILE_WIDTH,TILE_HEIGHT); }
由此處代碼可以看出,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得到而來。