Android學習筆記:RPG遊戲地圖繪製理解

來源:互聯網
上載者:User

 

      首先,可以參考上篇博文《根據系列圖片繪製動畫理解》將動畫製作出來;

      其次,地圖繪製可以藉助工具,得到相應的地圖數組資料;

      最後,有了地圖數組資料,則可以從提供的地圖庫檔案根據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得到而來。

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.