Android学习笔记:RPG游戏地图绘制理解

 

      首先,可以参考上篇博文《根据系列图片绘制动画理解》将动画制作出来;

      其次,地图绘制可以借助工具,得到相应的地图数组数据;

      最后,有了地图数组数据,则可以从提供的地图库文件根据ID得到相应的地图块,然后画在屏幕上;

 

因为地图数组数据比较容易得到,再次不过多阐述,分析关键的绘图原理机制:

1.         准备一张地图库文件(其中包含了所有地图上需要的图形元素,如右所示),所有的地图元素都从这里面切割出去,然后绘制成想要的东西;

2.         可以由工具得到想要的地图数组数据,如下:

//第一层游戏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, ......

                     ......

 

3.         通过2中的地图数组数据,我们可以代码中动态的切割上面的地图库文件来进行绘制;

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


此处TILE_HEIGH_COUNT为纵向tile的数量,TILE_WIDTH_COUNT为横向tile的数量,viewId代表在地图库文件中的具体位置,actorId也是一样,那么通过一个id是如何找到在地图库文件中的位置的呢?我们来看看DrawMapTile()方法是如何实现的:

private void DrawMapTile(int id,Canvas canvas,Paint paint ,Bitmap bitmap,int x, int y) { //根据数组中的ID算出在地图资源中的XY 坐标 //因为编辑器默认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); }


 

由此处代码可以看出,tile的id在地图库文件中是按横向顺序排列的方式定义的,假如横排10个,竖排15个,现在有一个ID为66的tile,则应该在第7行的第7个位置。按照上面的算法,id-- = 65;int count = 65/10=6;

Int bitmapX = (66-(6*10))*32 = 6*32,int bitmapY = 6*32,于是可以根据这个tile的x和y的具体值可以找到地图库文件中的一个矩形区域,然后接下来,变为想到的一个tile,于是整个地图便是由一个一个这样的tile得到而来。

 

 

转载于:https://www.cnblogs.com/duancanmeng/archive/2012/02/15/2524644.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值