首頁 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場(chǎng)

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評(píng)測(cè) / 活動(dòng)區(qū)

交流區(qū) | 測(cè)硬件 | 網(wǎng)站活動(dòng) | Z幣中心

新手入門 / 進(jìn)階 / 社區(qū)互助

新手 | 你問我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 11434|回復(fù): 0
[教程]

Android游戲開發(fā)之地圖編輯器的使用以及繪制地圖 (四)

[復(fù)制鏈接]
發(fā)表于 2013-8-28 16:19 | 顯示全部樓層 |閱讀模式
40988     
Mappy中文地圖編輯器的使用說明   
   
下載地址:     
解壓后打開地圖編輯器 mapwin.exe.exe 創(chuàng)建一張新的地圖。   
     
由于我用的Android模擬器寬高是320X480   
地圖寬的塊數(shù) 就是 320 / 32 = 10   
地圖高的塊數(shù) 就是 480 / 32 = 15   
     
這里擴(kuò)充一下 實(shí)際在工作開發(fā)中因?yàn)槭謾C(jī)的分辨率各式各樣 所以是需要尺寸考慮自適應(yīng)的 有兩種方法可以拿到當(dāng)前手機(jī)屏幕的寬高   
  1.   Display display = getWindowManager().getDefaultDisplay();   
      Log.i("view" , "height:" +display.getHeight());   
      Log.i("view" , "width:" +display.getWidth());   
      DisplayMetrics displayMetrics = getResources().getDisplayMetrics();   
      Log.i("view" , "height" +displayMetrics.heightPixels);   
      Log.i("view" , "width" +displayMetrics.widthPixels);
復(fù)制代碼
彈出框后點(diǎn)擊確定   
   
導(dǎo)入地圖圖塊 編輯器下載地址中包含了一張 地圖圖片 可以選擇使用   
因?yàn)榫庉嬈魇琼氁佬g(shù)圖片配合使用的 比如tile的尺寸 圖片的寬高尺寸必需能被整除。   
     
導(dǎo)入地圖圖塊成功 右側(cè)為導(dǎo)入的地圖資源 接下來就是自己拖動(dòng)右側(cè)地圖塊拼出自己想要的地圖了。   
     
接下來我將填充3個(gè)圖層 最底層 實(shí)體層 物理層 我會(huì)一一介紹他們的作用   
   
圖層0為最底層 繪制地圖先繪制這一層   
     
圖層1為實(shí)物層 這一層主要繪制一些actor 繪制完第一層在繪制這一層   
     
圖層2為物理層檢測(cè)物理碰撞這一層不用繪制但是玩家每移動(dòng)一次就須要以玩家當(dāng)前點(diǎn)在地圖數(shù)組中的角標(biāo) 和物理層做判斷是否碰撞,它和Actor層的位置一樣。   
     
拼地圖的使用技巧 編輯新圖層的時(shí)候可以把上一個(gè)涂層打開進(jìn)行對(duì)比編輯。   
這樣子就可以根據(jù)0圖層的信息來編輯圖層1   
     
       地圖塊拼完后編輯完成后點(diǎn)擊保存文件 后在點(diǎn)擊保存文本數(shù)據(jù)  地圖數(shù)組文件就生成出來了 文件命為map.TXT 里面就存著我們編輯的3個(gè)地圖層的地圖信息。   
     
使用Mappy中文地圖編輯器生成的地圖信息數(shù)組來繪制游戲地圖   
   
   
效果圖如下   
     
   
   
代碼實(shí)現(xiàn)   
   
這里我先說一下游戲窗口的全屏實(shí)現(xiàn)方法     
第一種   
  1.         // 全屏顯示窗口   
            requestWindowFeature(Window.FEATURE_NO_TITLE);   
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
復(fù)制代碼
第二種 AndroidManifest.xml 中加入   
  1.         <activity android:name=".activity"   
                              android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />
復(fù)制代碼
這里我詳細(xì)說一下編輯器生成出來的數(shù)組怎么用?就拿生成出來的ID 137為例  假設(shè) tile的寬高為32 137表示從圖片的左上角從左到右從上到下 數(shù)到第137個(gè)tile 就是我們須要繪制的tile      
繪制方面利用 clipRect方法來剪裁圖片 實(shí)現(xiàn)繪制 下一章我講游戲中的攝像頭機(jī)制 會(huì)詳細(xì)介紹這一點(diǎn)。   
  1. public class mapAcitvity extends Activity {   
       
        @Override   
        public void onCreate(Bundle savedInstanceState) {   
            super.onCreate(savedInstanceState);   
            // 全屏顯示窗口   
            requestWindowFeature(Window.FEATURE_NO_TITLE);   
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);   
            //顯示自定義的游戲View   
            setContentView(new MapView(this));   
        }   
          
          
        public class MapView extends View{   
       
            //tile塊的寬高   
            public final static int TILE_WIDTH = 32;   
            public final static int TILE_HEIGHT = 32;   
               
            //tile塊的寬高的數(shù)量   
            public final static int TILE_WIDTH_COUNT = 10;   
            public final static int TILE_HEIGHT_COUNT = 15;   
               
            //數(shù)組元素為0則什么都不畫   
            public final static int TILE_NULL = 0;   
            //第一層游戲View地圖數(shù)組   
            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 }   
                    };   
       
            //第二層游戲?qū)嶓wactor數(shù)組   
            public int [][]mMapAcotor  = {   
                    { 102, 103, 103, 104, 0, 0, 0, 165, 166, 167 },   
                    { 110, 111, 111, 112, 0, 0, 0, 173, 174, 175 },   
                    { 126, 127, 127, 128, 0, 0, 0, 181, 182, 183 },   
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },   
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },   
                    { 41, 42, 43, 44, 0, 0, 0, 0, 0, 0 },   
                    { 49, 50, 51, 52, 0, 0, 0, 0, 0, 0 },   
                    { 57, 58, 59, 60, 229, 230, 231, 232, 0, 0 },   
                    { 65, 66, 67, 68, 237, 238, 239, 240, 0, 0 },   
                    { 0, 0, 0, 0, 245, 246, 247, 248, 0, 0 },   
                    { 0, 0, 0, 0, 0, 254, 255, 0, 0, 0 },   
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },   
                    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },   
                    { 102, 103, 103, 103, 104, 0, 0, 0, 143, 144 },   
                    { 110, 111, 111, 111, 112, 0, 0, 0, 143, 144 }   
                    };   
               
            //第三層游戲碰撞物理層數(shù)組   
            //下一章介紹   
            //....................   
               
            //游戲地圖資源   
            Bitmap mBitmap = null;   
               
            //資源文件   
            Resources mResources = null;   
               
            //游戲畫筆   
            Paint mPaint = null;   
               
            //橫向縱向tile塊的數(shù)量   
            int mWidthTileCount = 0;   
            int mHeightTileCount = 0;   
       
            //橫向縱向tile塊的數(shù)量   
            int mBitMapWidth = 0;   
            int mBitMapHeight = 0;   
               
            /**   
             * 構(gòu)造方法   
             * @param context   
             */   
            public MapView(Context context) {   
                super(context);   
               
                mPaint = new Paint();   
                mBitmap = ReadBitMap(context, R.drawable.map);   
                mBitMapWidth = mBitmap.getWidth();   
                mBitMapHeight = mBitmap.getHeight();   
                mWidthTileCount = mBitMapWidth / TILE_WIDTH;   
                mHeightTileCount = mBitMapHeight / TILE_HEIGHT;   
            }   
               
            @Override   
            protected void onDraw(Canvas canvas) {   
                DrawMap(canvas,mPaint,mBitmap);   
                super.onDraw(canvas);   
                  
            }   
               
            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);   
                        }   
                    }   
                }   
            }   
               
               
               
            /**   
             * 根據(jù)ID繪制一個(gè)tile塊   
             * @param id   
             * @param canvas   
             * @param paint   
             * @param bitmap   
             */   
            private void DrawMapTile(int id,Canvas canvas,Paint paint ,Bitmap bitmap,int x, int y) {   
                //根據(jù)數(shù)組中的ID算出在地圖資源中的XY 坐標(biāo)   
                //因?yàn)榫庉嬈髂J(rèn)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);   
            }   
               
            /**   
             * 讀取本地資源的圖片   
             * @param context   
             * @param resId   
             * @return   
             */     
            public Bitmap ReadBitMap(Context context, int resId){     
                BitmapFactory.Options opt = new BitmapFactory.Options();     
                opt.inPreferredConfig = Bitmap.Config.RGB_565;      
                opt.inPurgeable = true;     
                opt.inInputShareable = true;     
                //獲取資源圖片     
                InputStream is = context.getResources().openRawResource(resId);     
                    return BitmapFactory.decodeStream(is,null,opt);     
            }     
               
            /**   
             * 繪制圖片中的一部分圖片   
             * @param canvas   
             * @param paint   
             * @param bitmap   
             * @param x   
             * @param y   
             * @param src_x   
             * @param src_y   
             * @param src_width   
             * @param src_Height   
             */   
            private void DrawClipImage(Canvas canvas,Paint paint ,Bitmap bitmap, int x, int y, int src_x, int src_y, int src_xp, int src_yp) {   
                canvas.save();   
                canvas.clipRect(x, y, x + src_xp, y + src_yp);   
                canvas.drawBitmap(bitmap, x - src_x, y - src_y,paint);   
                canvas.restore();   
            }   
        }   
    }
復(fù)制代碼
最后如果你還是覺得我寫的不夠詳細(xì) 看的不夠爽 不要緊我把源代碼的下載地址貼出來 歡迎大家一起討論學(xué)習(xí)   
android游戲開發(fā)地圖編輯器的使用源碼.rar(191.43 KB, 下載次數(shù): 700)[/I]2011-9-2 22:13 上傳點(diǎn)擊文件名   下載積分: 下載豆 -2

上一篇:桌面簡(jiǎn)易小時(shí)鐘(Widget+Service+AlarmManager+Thread)
下一篇:第十七講:對(duì)話框 Android Dialog

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號(hào) )

網(wǎng)絡(luò)信息服務(wù)信用承諾書 | 增值電信業(yè)務(wù)經(jīng)營許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號(hào)

GMT+8, 2024-10-20 00:35 , Processed in 0.062830 second(s), 13 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請(qǐng)將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表