为什么我用2d游戏地图编辑器器制作的地图在新游戏列表里不显示

雨松MOMO带你走进游戏开发的世界之地图编辑器的使用以及绘制地图雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客,原文地址:Mappy中文地图编辑器的使用说明下载地址:&&&&&&& 压缩包中包含 游戏地图编辑器使用指南 与地图资源图片 宫院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 {
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块的宽高的数量
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 =
//资源文件
Resources mResources =
//游戏画笔
Paint mPaint =
//横向纵向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;
protected void onDraw(Canvas canvas) {
DrawMap(canvas,mPaint,mBitmap);
super.onDraw(canvas);
private void DrawMap(Canvas canvas,Paint paint ,Bitmap bitmap) {
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 所以这里 -1
int count = id /mWidthTileC
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
public Bitmap ReadBitMap(Context context, int resId){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable =
opt.inInputShareable =
//获取资源图片
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希望可以和大家一起进步。下载地址:
本文已收录于以下专栏:
相关文章推荐
虽说可以用Image什么的当个背景,但是要是做个RPG类的游戏就有点复杂了。为了追求效率一般可以使用libgdx的SpriteCache,但是如果习惯于TiledMap的话libgdx也是支持的。
地图编辑器读取和使用游戏资源,并按照游戏程序规约输出相应格式的地图数据,游戏程序(客户端和服务器)通过地图数据构建游戏场景,将其呈现给用户。地图编辑器的主要功能包括地图制作和地图资源管理两...
android游戏开发中,使用android.graphics中的类来绘制2D向量图和文字。
一 画布Canvas
在Android中的绘图应该继承View组件,并重写它的onDraw(Canva...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)第1页:地图编辑器介绍第2页:地图编辑器视频教程第3页:地图编辑器打开及使用方法
相关资源:
打开方式:传奇最经典网页版,多人团战跨服竞技玩法冰火战场,十年最经典游戏,英雄合击,3D特效绚丽,赶紧注册试玩一下,
&&==&&只要双击文件夹里mcedit可执行exe程序即可开始运行运行时,会弹出两个窗口,第一个显示代码的窗口,这个你不要关闭它,过后它会弹出另一个窗口,这个才是真的地图编辑窗口。如果你的电脑有连接到网络,那么这个地图编辑器启动时有可能会提示是否下载最新版,我们可以点击忽略。你可以按下快捷键Ctrl+O打开。如果地图编辑窗口上有提示的常用操作键,你要留意,如图。如果你的电脑有运行‘我的世界客户端’,‘我的世界单机游戏’,那就先关闭它,找到它的安装路径或者存放位置,目录.minecraft\saves\里面有存放地图的文件夹,有个是level。选择level打开就会开始加载地图。接下来,就是操作地图了,先操作键盘控制移动,熟悉一下,前后左右,上升或下降;然后就是熟悉鼠标操作,通常是按下鼠标键不要放开,拖动操作,鼠标左键用于捕捉,鼠标右键可移动视角。在选择模式下,先选择其中的方块,然后捕捉方块的每一个面,沿某一个方向拖动即可控制并调整可容纳方块的数量,也就是说调节选择区域。不过要注意选区的亮度细节,如果亮度高,不是全透明,那就是告诉你选中了没有包括方块的空气,选中要适当。接下来,就是对选中的区域填充方块,如果你选中的区域含有方块,那么填充后旧的方块就会被替换。以上两个步骤就是我们经常操作的,先选择填充区域,然后再选择要填充的新方块开始填充,就是这个意思,你要熟悉它。接下来,就是告诉你怎样设置游戏里的玩家位置和重生地点。你看图,点击左边的一个方块就可以拿出这个方块,然后放到某个角落就可以了,右边的一个方块也可以这样放置。不过要注意,这两个方块最好放在墙壁上面,这样可以把它的头放高一些,如果放在地面,在开始玩游戏的时候进入可能会出现小毛病。如果你放置好这个方块,但你的鼠标上还有个方块,要取消它就点击选择模式即可。接下来就是告诉你,怎么弹出菜单页,如果是图中的,点击左上角的MCEdit即可弹出菜单。如果你用的是英文版本的,没有汉化的,就按下Ctrl键不要放开就可弹出菜单,再点击选择。如果你的地图做好后,点击保存即可,保存后要退出,就点击关闭。
《我的世界》相关文章
(阅读:109)
近日,游戏圈最高人气的UP主敖厂长微博发布了一组图片,盛赞参与极限游戏开发的少年们:“有想法、有内涵“,还表示自己”生不逢时”。而微博提及的“游戏极限开发“,指的是腾讯NEXT IDEA高校游戏创意制作大赛系列活动之一,72小时游戏制作夏令营现场。现场来自全国各地的数十名大学生分为不同小组,在72小时内进行封闭式头脑风暴和游戏开发,最终制作出一款可玩的游戏DEMO并展示。
??7月25日,《饭局的诱惑》节目官方正版授权、腾讯首款狼人杀APP《饭局狼人杀》全量上线,所有玩家都可前往微信、手Q、应用宝、腾讯视频及各大应用商店下载。和朋友异地连麦,随时开局,相爱相杀就在《饭局狼人杀》。更值得期待的是,7月26日至28日期间,还有马东携众葩们在游戏里上演陪玩活动,和喜爱的明星一起偶遇吧!《饭局狼人杀》开饭了!腾讯合作版今日上线腾讯代理《饭局狼人杀》 7.25开饭了7月12 ...
扫描二维码

我要回帖

更多关于 rpg游戏地图编辑器 的文章

 

随机推荐