Mappy中文地图编辑器的使用说明

       下载地址:http://download.csdn.net/source/3452259

       压缩包中包含 游戏地图编辑器使用指南 与地图资源图片 宫院1.png 一张 mapwin.exe 可执行文件 map.FMP 与map.TXT为使用编辑器生成出来的保存文件与地图数组。

Android游戏开发教程之一:地图编辑器

       解压后打开地图编辑器 mapwin.exe.exe 创建一张新的地图。

Android游戏开发教程之一:地图编辑器

       由于我用的Android模拟器宽高是320X480

       地图宽的块数 就是 320 / 32 = 10

       地图高的块数 就是 480 / 32 = 15

Android游戏开发教程之一:地图编辑器

       这里扩充一下 实际在工作开发中因为手机的分辨率各式各样 所以是需要尺寸考虑自适应的 有两种方法可以拿到当前手机屏幕的宽高

Java代码
  1. Display display = getWindowManager().getDefaultDisplay();  
  2. Log.i("view" , "height:" +display.getHeight());  
  3. Log.i("view" , "width:" +display.getWidth());  
  4. DisplayMetrics displayMetrics = getResources().getDisplayMetrics();  
  5. Log.i("view" , "height" +displayMetrics.heightPixels);  
  6. Log.i("view" , "width" +displayMetrics.widthPixels);  

       弹出框后点击确定

       导入地图图块 编辑器下载地址中包含了一张 地图图片 可以选择使用

       因为编辑器是须要美术图片配合使用的 比如tile的尺寸 图片的宽高尺寸必需能被整除。

Android游戏开发教程之一:地图编辑器

      导入地图图块成功,右侧为导入的地图资源 接下来就是自己拖动右侧地图块拼出自己想要的地图了。

Android游戏开发教程之一:地图编辑器

       接下来我将填充3个图层 最底层 实体层 物理层 我会一一介绍他们的作用

       图层0为最底层 绘制地图先绘制这一层

Android游戏开发教程之一:地图编辑器

       图层1为实物层 这一层主要绘制一些actor 绘制完第一层在绘制这一层

Android游戏开发教程之一:地图编辑器

       图层2为物理层检测物理碰撞这一层不用绘制但是玩家每移动一次就须要以玩家当前点在地图数组中的角标 和物理层做判断是否碰撞,它和Actor层的位置一样。

Android游戏开发教程之一:地图编辑器

       拼地图的使用技巧 编辑新图层的时候可以把上一个涂层打开进行对比编辑。 

       这样子就可以根据0图层的信息来编辑图层1

Android游戏开发教程之一:地图编辑器

       地图块拼完后编辑完成后点击保存文件 后在点击保存文本数据  地图数组文件就生成出来了 文件命为map.TXT 里面就存着我们编辑的3个地图层的地图信息。

Android游戏开发教程之一:地图编辑器

       使用Mappy中文地图编辑器生成的地图信息数组来绘制游戏地图

       效果图如下

Android游戏开发教程之一:地图编辑器

       代码实现

       这里我先说一下游戏窗口的全屏实现方法  

       第一种

Java代码
  1. // 全屏显示窗口  
  2. requestWindowFeature(Window.FEATURE_NO_TITLE);  
  3. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);  

      第二种 AndroidManifest.xml 中加入

Java代码
  1. <activity android:name=".activity"  
  2.           android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />  
Java代码
  1. public class mapAcitvity extends Activity {  
  2.    
  3.     @Override  
  4.     public void onCreate(Bundle savedInstanceState) {  
  5.         super.onCreate(savedInstanceState);  
  6.     // 全屏显示窗口  
  7.     requestWindowFeature(Window.FEATURE_NO_TITLE);  
  8.     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  9.     //显示自定义的游戏View  
  10.     setContentView(new MapView(this));  
  11.     }  
  12.    
  13.     public class MapView extends View{  
  14.    
  15.         //tile块的宽高  
  16.     public final static int TILE_WIDTH = 32;  
  17.     public final static int TILE_HEIGHT = 32;  
  18.    
  19.         //tile块的宽高的数量  
  20.     public final static int TILE_WIDTH_COUNT = 10;  
  21.     public final static int TILE_HEIGHT_COUNT = 15;  
  22.    
  23.     //数组元素为0则什么都不画  
  24.     public final static int TILE_NULL = 0;  
  25.     //第一层游戏View地图数组  
  26.     public int [][]mMapView = {  
  27.         { 1111137137137111 },  
  28.         { 1111137137137111 },  
  29.         { 1111137137137111 },  
  30.         { 137137137137137137137137137137 },  
  31.         { 137137137137137137137137137137 },  
  32.         { 11111111137137 },  
  33.         { 11111111137137 },  
  34.         { 11111111137137 },  
  35.         { 11111111137137 },  
  36.         { 11111111137137 },  
  37.         { 11111111137137 },  
  38.         { 137137137137137137137137137137 },  
  39.         { 137137137137137137137137137137 },  
  40.         { 1111113713713711 },  
  41.         { 1111113713713711 }  
  42.         };  
  43.    
  44.     //第二层游戏实体actor数组  
  45.     public int [][]mMapAcotor  = {  
  46.         { 102103103104000165166167 },  
  47.         { 110111111112000173174175 },  
  48.         { 126127127128000181182183 },  
  49.         { 0000000000 },  
  50.         { 0000000000 },  
  51.         { 41424344000000 },  
  52.         { 49505152000000 },  
  53.         { 5758596022923023123200 },  
  54.         { 6566676823723823924000 },  
  55.         { 000024524624724800 },  
  56.         { 00000254255000 },  
  57.         { 0000000000 },  
  58.         { 0000000000 },  
  59.         { 102103103103104000143144 },  
  60.         { 110111111111112000143144 }  
  61.         };  
  62.    
  63.     //第三层游戏碰撞物理层数组  
  64.     //下一章介绍  
  65.     //....................  
  66.    
  67.     //游戏地图资源  
  68.     Bitmap mBitmap = null;  
  69.    
  70.     //资源文件  
  71.     Resources mResources = null;  
  72.    
  73.     //游戏画笔  
  74.     Paint mPaint = null;  
  75.    
  76.     //横向纵向tile块的数量  
  77.     int mWidthTileCount = 0;  
  78.     int mHeightTileCount = 0;  
  79.    
  80.     //横向纵向tile块的数量  
  81.     int mBitMapWidth = 0;  
  82.     int mBitMapHeight = 0;  
  83.    
  84.     /** 
  85.      * 构造方法 
  86.      * @param context 
  87.      */  
  88.     public MapView(Context context) {  
  89.         super(context);  
  90.    
  91.         mPaint = new Paint();  
  92.         mBitmap = ReadBitMap(context, R.drawable.map);  
  93.         mBitMapWidth = mBitmap.getWidth();  
  94.         mBitMapHeight = mBitmap.getHeight();  
  95.         mWidthTileCount = mBitMapWidth / TILE_WIDTH;  
  96.         mHeightTileCount = mBitMapHeight / TILE_HEIGHT;  
  97.     }  
  98.    
  99.         @Override  
  100.         protected void onDraw(Canvas canvas) {  
  101.             DrawMap(canvas,mPaint,mBitmap);  
  102.             super.onDraw(canvas);  
  103.    
  104.         }  
  105.    
  106.         private void DrawMap(Canvas canvas,Paint paint ,Bitmap bitmap) {  
  107.             int i,j;  
  108.             for(i = 0; i< TILE_HEIGHT_COUNT; i++) {  
  109.             for(j = 0; j<TILE_WIDTH_COUNT;j++) {  
  110.                 int ViewID =  mMapView[i][j];  
  111.                 int ActorID = mMapAcotor[i][j];  
  112.                 //绘制地图第一层  
  113.                 if(ViewID > TILE_NULL) {  
  114.                  DrawMapTile(ViewID,canvas,paint,bitmap, j * TILE_WIDTH , i * TILE_HEIGHT);  
  115.                 }  
  116.    
  117.                 //绘制地图第二层  
  118.                 if(ActorID > TILE_NULL) {  
  119.                 DrawMapTile(ActorID,canvas,paint,bitmap, j * TILE_WIDTH , i * TILE_HEIGHT);  
  120.                 }  
  121.             }  
  122.             }  
  123.         }  
  124.    
  125.         /** 
  126.          * 根据ID绘制一个tile块 
  127.          * @param id 
  128.          * @param canvas 
  129.          * @param paint 
  130.          * @param bitmap 
  131.          */  
  132.         private void DrawMapTile(int id,Canvas canvas,Paint paint ,Bitmap bitmap,int x, int y) {  
  133.             //根据数组中的ID算出在地图资源中的XY 坐标  
  134.             //因为编辑器默认0 所以第一张tile的ID不是0而是1 所以这里 -1  
  135.             id--;  
  136.             int count = id /mWidthTileCount;  
  137.             int bitmapX = (id - (count * mWidthTileCount)) * TILE_WIDTH;  
  138.             int bitmapY = count * TILE_HEIGHT;  
  139.             DrawClipImage(canvas,paint,bitmap,x,y,bitmapX,bitmapY,TILE_WIDTH,TILE_HEIGHT);  
  140.         }  
  141.    
  142.         /** 
  143.          * 读取本地资源的图片 
  144.          * @param context 
  145.          * @param resId 
  146.          * @return 
  147.          */  
  148.         public Bitmap ReadBitMap(Context context, int resId){  
  149.             BitmapFactory.Options opt = new BitmapFactory.Options();  
  150.             opt.inPreferredConfig = Bitmap.Config.RGB_565;  
  151.             opt.inPurgeable = true;  
  152.             opt.inInputShareable = true;  
  153.             //获取资源图片  
  154.             InputStream is = context.getResources().openRawResource(resId);  
  155.                 return BitmapFactory.decodeStream(is,null,opt);  
  156.         }    
  157.    
  158.         /** 
  159.      * 绘制图片中的一部分图片 
  160.      * @param canvas 
  161.      * @param paint 
  162.      * @param bitmap 
  163.      * @param x 
  164.      * @param y 
  165.      * @param src_x 
  166.      * @param src_y 
  167.      * @param src_width 
  168.      * @param src_Height 
  169.      */  
  170.     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) {  
  171.         canvas.save();  
  172.         canvas.clipRect(x, y, x + src_xp, y + src_yp);  
  173.         canvas.drawBitmap(bitmap, x - src_x, y - src_y,paint);  
  174.         canvas.restore();  
  175.     }  
  176.     }  
  177. }  

       最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习

       下载地址:http://vdisk.weibo.com/s/aa81p

       这里我详细说一下编辑器生成出来的数组怎么用?就拿生成出来的ID 137为例  假设 tile的宽高为32 137表示从图片的左上角从左到右从上到下 数到第137个tile 就是我们须要绘制的tile   

绘制方面利用 clipRect方法来剪裁图片 实现绘制 下一章我讲游戏中的摄像头机制 会详细介绍这一点。

本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/game/476.html
2015年9月30日
发布:鸡啄米 分类:Android游戏开发 浏览: 评论:0