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

article/2025/10/26 5:59:01
雨松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


http://chatgpt.dhexx.cn/article/nng1ErcO.shtml

相关文章

编辑器

问题描述 你现在要实现一个针对于数字序列的编辑器。 初始的时候&#xff0c;序列是空的。 在之后&#xff0c;有以下五种操作&#xff1a; I x 在光标之后插入x D 删除光标之前的数字 L 将光标向左移动&#xff0c;如果已经在最左&#xff0c;则不移动 R 将光标向右移动&#…

代码编辑器

文章来源&#xff1a;几款非常优秀且常用的代码编辑器 ... VS CodeSource InsightVimUltraEditeclipseUnderstandAtomSublime Text 对于软件开发人员&#xff0c;代码编辑器好用与否直接影响代码编辑的效率。软件开发&#xff0c;基本上都有集成开发环境&#xff08;IDE&#x…

Unity的编辑器

1大部分人Unity编辑器是vistual 2.变量 2.1新建C#文件 鼠标点击Assets-->再点击create-->点击C#Sprite 2.2先用鼠标点击游戏物体(Cube)将c#文件拖拽到Inspector下&#xff0c;双击C#文件可以进入编写代码 2.3变量 public 变量类型 变量; //公有属性在Inspector下可…

游戏编辑器框架

原文&#xff1a;http://www.cnblogs.com/winsonchen/archive/2008/03/29/1128575.html 《游戏创造》08年第二期有一篇关于“&#xff57;xWidget游戏编辑器框架”开发的文章&#xff0c;作者使用过unreal引擎&#xff0c;熟悉unreal编辑器实现细节。该作者建议采用wWidget开发…

RPG++——游戏编辑器的开发

完整资料进入【数字空间】查看——baidu搜索"writebug" 随着当下电子设备的普及以及人们对娱乐需求的上升&#xff0c;电子游戏逐渐走进千家万户。RPG&#xff08;角色扮演&#xff09;游戏作为最经典的游戏种类之一&#xff0c;因其游戏形式多样&#xff0c;自由度…

RPG或SLG游戏在线地图编辑器

有做大型RPG或SLG游戏需求的朋友请进&#xff0c;有在线地图编辑器 我凭借多年的游戏开发经验&#xff0c;用cocoscreator2.13开发了一款web在线地图编辑器&#xff0c;暂且命名为EasyMapEditor&#xff0c;用Google浏览器打开&#xff0c;提供了从在线地图编辑到正式项目运行…

游戏编辑器制作(10)

差不多一年左右没有更新了&#xff0c;今天把这段时间的工作内容记录一下&#xff0c;从上一篇开始&#xff0c;制了很多相关功能&#xff0c;花了很多时间研究了RTS游戏的结构部分&#xff0c;也研究了RVO&#xff0c;还有些著名的开源游戏代码。自己实现了自己的rtssim(RTS模…

从零开始入门创作游戏——Unity编辑器的使用

还没找到工作的我继续瞎折腾中&#xff0c;上次搭建环境就花了我3天的时间 从零开始入门创作游戏——Unity3d的环境搭建_默哀d的博客-CSDN博客 接下来是根据油土鳖的视频学习创作的一个小恐龙跳跳跳游戏&#xff0c;直接上手做一次学得更多 https://www.youtube.com/watch?…

[转]2d游戏开发:游戏地图编辑器

2d游戏开发&#xff1a;游戏地图编辑器 akinggw 金桥信息 2006-06-15 游戏地图编辑器 作者&#xff1a;akinggw 朋友们&#xff0c;大家好! 今天&#xff0c;我们将讲解游戏开发中一个重要的工具DD“游戏地图编辑器”。 几乎任何一款商业游戏都有自己的游戏地图编辑器&am…

Unity 编辑器(UnityEditor)

<small>前几天开始准备看源码&#xff0c;结合自己工作使用Lua&#xff0c;想看sLua框架源码&#xff0c;但是Lua确实不太熟悉&#xff0c;于是还是选择C#&#xff0c;打算看NGUI的源码&#xff08;因为工作中也有用到&#xff09;。 自己看源码经验不是很多&#xff0c;…

游戏编辑器制作(3)

最近抽时间加入了自由的地表纹理编辑和地型升、降、平滑、平整等功能&#xff0c;把编辑操作等结构优化了一下&#xff0c;各功能代码更清晰了便于接下来大量功能的开发。也加入了简单的操作界面功能。截图记录一下。

游戏编辑器制作(4)

今天加入了一个简单的Lambert光照效果。重新计算了地面的法线。另外地形编辑工具已全部实现。加入了回退&#xff0c;重做系统。截图记录一下。

游戏编辑器制作(6)

这几天因为新冠疫情原因被隔离了几天&#xff0c;在家里把地形功能基本完成了&#xff0c;实现了下陷悬崖&#xff0c;实现了高级的悬崖系统&#xff0c;也实现了浅水和深水的表现。地形这块的功能只剩下斜坡了。 截图记录一下。

Unity Editor 编辑器介绍

一、整体界面介绍&#xff1a; Project 窗口&#xff1a;列出所有的资源 Console 窗口&#xff1a;日志输出 Hierarchy 窗口&#xff1a;在Project 窗口选择一个 Scene 场景后&#xff0c;会在这个窗口显示这个构成这个场景的所有游戏对象 Inspector 窗口&#xff1a;在 Hie…

游戏编辑器制作(9)

夜阑卧听风雨&#xff0c;白日高温依旧。 何当蜀雨秋池&#xff0c;豆花白肉烧酒。 由于电力紧张&#xff0c;本周是在完全没有空调的三伏天工作的&#xff0c;温度最高达到了44度左右。基本上是赤背上阵。实现了粒子系统&#xff0c;各种显示方面的调优&#xff0c;加入了更多…

游戏编辑器制作(8)

今天在家里把阴影效果和雾效加上去了&#xff0c;还修改了一下各种操作的手感&#xff0c;现在制作地形编辑和悬崖水面等更方便了&#xff0c;一拖就可以了。下一次准备多上点资源&#xff0c;拖一个完整点的地图出来。现在快凌晨两点了&#xff0c;截图纪录一下。。。。。

游戏编辑器制作(1)

实现了地表纹理的编辑功能&#xff0c;不同大小网格的显示功能&#xff0c;截图记录一下。

游戏编辑器制作(7)

有一段时间没有更新内容了&#xff0c;最近太忙了&#xff0c;手里工作多。天气太热了&#xff0c;做得也慢&#xff0c;一天只有一两个小时开发时间。今天把模型载入&#xff0c;渲染等功能全部集成上来了。现在可以添加和编辑场景物件了。搞了些模型做测试。下一步是强化操作…

用游戏编辑器制作MOD脱颖而出

【导读】 立志成为游戏策划的你&#xff0c;和千千万万的游戏玩家的不同之处在哪&#xff1f; 是你玩过很多的游戏&#xff1f;别人也玩过 是你游戏打得比别人好&#xff1f;也许电子竞技更适合你 是你对游戏的理解比别人深&#xff0c;知道如何设计出更好玩的游戏&#xff1f…

游戏编辑器制作(5)

这几天都在搞悬崖地形系统&#xff0c;悬崖地形系统分成上两层&#xff0c;下两层。 这几天把程序框架重新设计了一下&#xff0c;可以方便实现悬崖系统了&#xff0c;悬崖地形的几何体需要动态镶嵌拼接&#xff0c;纹理坐标也要能完整地拼接到一起&#xff0c;还要能适应各种复…