雨松MOMO带你走进游戏开发的世界之地图编辑器的使用以及绘制地图

雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/archives/211

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

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

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

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

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

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

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

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

  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);

弹出框后点击确定

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

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

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

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

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

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

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

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

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

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

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

效果图如下

代码实现

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

 // 全屏显示窗口requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

第二种 AndroidManifest.xml 中加入

  <activity android:name=".activity"android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />

这里我详细说一下编辑器生成出来的数组怎么用?就拿生成出来的ID 137为例  假设 tile的宽高为32 137表示从图片的左上角从左到右从上到下 数到第137个tile 就是我们须要绘制的tile  
绘制方面利用 clipRect方法来剪裁图片 实现绘制 下一章我讲游戏中的摄像头机制 会详细介绍这一点。

public class mapAcitvity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 全屏显示窗口requestWindowFeature(Window.FEATURE_NO_TITLE);getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);//显示自定义的游戏ViewsetContentView(new MapView(this));}public class MapView extends View{//tile块的宽高public final static int TILE_WIDTH = 32;public final static int TILE_HEIGHT = 32;//tile块的宽高的数量public final static int TILE_WIDTH_COUNT = 10;public final static int TILE_HEIGHT_COUNT = 15;//数组元素为0则什么都不画public final static int TILE_NULL = 0;//第一层游戏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, 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 }};//第三层游戏碰撞物理层数组 //下一章介绍//....................//游戏地图资源Bitmap mBitmap = null;//资源文件Resources mResources = null;//游戏画笔Paint mPaint = null;//横向纵向tile块的数量int mWidthTileCount = 0;int mHeightTileCount = 0;//横向纵向tile块的数量int mBitMapWidth = 0;int mBitMapHeight = 0;/*** 构造方法* @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;}@Overrideprotected 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);}}}}/*** 根据ID绘制一个tile块* @param id* @param canvas* @param paint* @param bitmap*/private void DrawMapTile(int id,Canvas canvas,Paint paint ,Bitmap bitmap,int x, int y) {//根据数组中的ID算出在地图资源中的XY 坐标//因为编辑器默认0 所以第一张tile的ID不是0而是1 所以这里 -1id--;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();}}
}

最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习
雨松MOMO希望可以和大家一起进步。

下载地址:http://www.xuanyusong.com/archives/211

Android游戏开发之地图编辑器的使用以及绘制地图 (四)相关推荐

  1. SRPG游戏开发(七)第三章 绘制地图 - 四 初步完善地图编辑器(Map Graph)

    返回目录 第三章 绘制地图 四       初步完善地图编辑器(Map Graph) 到目前为止我们可以开心的绘制我们的地图了,但有不少小问题.一直开心忘我的绘制地图,却不知道地图已经绘制了多大,还要 ...

  2. SRPG游戏开发(五)第三章 绘制地图 - 二 绘制一张简单地图

    返回目录 第三章 绘制地图 一 导入素材 点击进入 二 绘制一张简单地图 这一节我们来看如何绘制一张地图. 1     新建Grid与Tilemap 在Hierarchy面板中,点击Create/2D ...

  3. SRPG游戏开发(六)第三章 绘制地图 - 三 创建自己的SrpgTile

    返回目录 第三章 绘制地图 一        导入素材 http://blog.csdn.net/darkrabbit/article/details/79168225 二        绘制一张简单 ...

  4. Android游戏开发Android软件开发【教程三十篇】

    Android软件开发之发送短信与系统短信库解析(三十)  New Android软件开发之获取通讯录联系人信息(二十九)  New Android软件开发之PreferenceActivity中的组 ...

  5. Android 游戏开发之主角的移动与地图的平滑滚动(十五)

    雨松MOMO带你走进游戏开发的世界之主角的移动与地图的平滑滚动 雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong. ...

  6. (转载)Android游戏开发之旅一 长按Button原理

    (转载)http://www.android123.com.cn/androidkaifa/538.html 作者: Android开发网原创 时间: 2010-06-22 今天Android123开 ...

  7. Android游戏开发基本知识

    Android游戏开发 手机游戏被业内人士称为继短信之后的又一座金矿.Android虽然基于Java,但是其虚拟机是基于寄存器的,速度得到了很大的提升,这为Android平台上开发游戏提供了坚强的后盾 ...

  8. Android游戏开发实践指南(华章程序员书库)

    <Android游戏开发实践指南(华章程序员书库)> 基本信息 原书名:Learning Android Game Programming:A Hands-On Guide to Buil ...

  9. Android游戏开发大全

    查看书籍详细信息: Android游戏开发大全 编辑推荐 帮助读者掌握Android游戏项目的开发流程 和项目驱动的好书! 内容简介 <Android游戏开发大全>以Android手机游戏 ...

最新文章

  1. 做程序员10年了,复制粘贴是我最牛逼的技能,从菜鸟兑变成大牛,直到看了这些大佬的公众号...
  2. C# Timer用法及实例详解
  3. bootrom启动流程【转】
  4. 使用 WeihanLi.Npoi 操作 CSV
  5. HDU2021多校第五天 1009 Array-树状数组求二阶前缀和
  6. java oca_OCA第1部分中的Java难题
  7. 一个励志PM小哥哥的Java转型之路
  8. JavaScript的一些小技巧(转)
  9. JQuery:JQuery遍历详解
  10. JMS(三):MessageListener
  11. 最后两个月,怎么冲业绩?
  12. 霍夫曼算法_霍夫曼编码算法
  13. 介绍几种jquery ui使用方法
  14. 读取、修改、保存图像
  15. Android ASM字节码插桩
  16. 复旦和同济计算机学硕,考研择校:复旦、同济、上财哪个更有前途?看网友怎么说!...
  17. 三代测序数据分析实战
  18. 汽车软件合作开发中的分工、知识产权及质量责任
  19. vins estimator ProjectionFactor (Td) factor
  20. 图库类小程序服务器配置,小程序生成图片库

热门文章

  1. 快速找出QQ群成员中不在名单内的人
  2. 精述wifi、zigbee在链路层的安全原理:CCM模式 1
  3. 用vue实现点击按钮,弹出一个视频,视频可拖动放大缩小
  4. matlab horn antenna,一种新型的角锥喇叭天线设计方法.pdf
  5. 相量法matlab仿真编程,电力系统的MATLAB/SIMULINK仿真与应用 王晶,翁国庆,张有兵著 西安电子科技大学出版社 9787560620...
  6. 墨尔本python培训班_墨尔本大学商业专业
  7. Nhibernate介绍与使用
  8. 第6周项目2--建立链栈算法库
  9. 4款好用的PC端电子书阅读软件,千万别错过
  10. 晨曦记账本记账,使用项目查看账目