转][转]SLG中搜索某个角色可移动区域的算法



可根据地形的不同,以及角色能力的不同来判断可移动区域。例如骑士在平地上可以移动更大的范围。代码如下: 
 /** 

  * 搜索可走区域 

  * @param map 当前地图表 

  * @param row 行 

  * @param col 列 

  * @param locomotivity 该角色的默认移动力 

  * @param direction 方向 

  */ 

 public void scanMovableArea(byte map[][], int row, int col, int locomotivity, int direction){ 

  if(locomotivity > map[row][col]) 

   map[row][col] = (byte)locomotivity; 

  else 

   return; 

   

  /** 向上判断 **/ 

  if(direction != 1){ 

   int loco1 = locomotivity - mapExpendLocomotivity(row, col - 1); 

   if(loco1 >=0) 

    scanMovableArea(map, row, col - 1, loco1, 2); 

  } 

   

  /** 向下判断 **/ 

  if(direction != 2){ 

   int loco2 = locomotivity - mapExpendLocomotivity(row, col + 1); 

   if(loco2 >= 0) 

    scanMovableArea(map, row, col + 1, loco2, 1); 

  } 

   

  /** 向左判断 **/ 

  if(direction != 4){ 

   int loco3 = locomotivity - mapExpendLocomotivity(row - 1, col); 

   if(loco3 >= 0) 

    scanMovableArea(map, row - 1, col, loco3, 8); 

  } 

   

  /** 向右判断 **/ 

  if(direction != 8){ 

   int loco4 = locomotivity - mapExpendLocomotivity(row + 1, col); 

   if(loco4 >= 0) 

    scanMovableArea(map, row + 1, col, loco4, 4); 

  } 

 } 



---------------------------------------------- 



 /** 

  * 地形对移动力的消耗 

  * @param row 行 

  * @param col 列 

  * @return 移动力消耗值 

  */ 



public int mapExpendLocomotivity(int row, int col){ 



   //这里我就不一一实现了,有兴趣的朋友可以自己扩展这个方法。 



   //下面给个伪代码 



   //如果是草地 



  if(gameMap[row][col] == GAME_MAP_GRASS){ 



    //如果是士兵 





   if(type == SOLIDER){ 

    return 1; 

    } 

  } 



   //超出边界 



  if(row < 0 || col < 0 || row > gameWidth || col > gameHeight) 



  { 



      return 1000; 



  } 



  //具体的情况各位朋友可以根据自己的游戏来设计。 







找到可以移动的区域后,就可以确定要移动的具体位置。这时候又要涉及到找路算法了。对于与A*算法(以前有一位同事写过)。不过下次我会用递归算法来实现,速度更快,更简单。 



差点忘记说明了以上得到的map数组怎么使用。这时一个记录了剩余移动力的数组。在显示可移动的区域的时候只要判断map里面的值是否为空,不为空就画出一个矩形,代表该区域可走。 



/** 

  * 走路 

  * @param curX 当前位置 (x方向) 

  * @param curY 当前位置 (y方向) 

  * @param destX 目标位置(x方向) 

  * @param destY 目标位置 (y方向) 

  * @return 路径矢量 

  */ 

 public Vector scanPath(int curX, int curY, int destX, int destY){ 

  Vector vector = null; 

  short dest[] = { 

    (short)destX, (short)destY 

  }; 

  if(curX == destX && curY == destY){ 

   vector = new Vector(); 

   vector.addElement((Object)dest); 

   return vector; 

  } 

  byte byte0 = 0; 

  byte byte1 = 0; 

  byte byte2 = 0; 

  byte byte3 = 0; 

  if(destY > 0) 

   byte0 = _mapped_terrains[destX][destY - 1]; 

  if(destY < _map_height - 1) 

   byte1 = _mapped_terrains[destX][destY + 1]; 

  if(destX > 0) 

   byte2 = _mapped_terrains[destX - 1][destY]; 

  if(destX < _map_width - 1) 

   byte3 = _mapped_terrains[destX + 1][destY]; 



  int max = Math.max(Math.max((int)byte0, (int)byte1), Math.max((int)byte2, (int)byte3)); 

  if(max == byte0) 

   vector = scanPath(curX, curY, destX, destY - 1); 

  else 

  if(max == byte1) 

   vector = scanPath(curX, curY, destX, destY + 1); 

  else 

  if(max == byte2) 

   vector = scanPath(curX, curY, destX - 1, destY); 

  else 

  if(max == byte3) 

   vector = scanPath(curX, curY, destX + 1, destY); 



  vector.addElement((Object)dest); 

  return vector; 

 } 



还记得上个帖子上函数中传入的map参数吗,实际上通过那个函数就可以得到一个map,然后应用于现在的找路算法中,也就是上面代码段看到的_mapped_terrains 



还有两个陌生的变量就是 _map_height和_map_width ,这个很简单了,就是SLG地图中的长度和宽度。 



呵呵,希望这些代码段对SLG的朋友有些帮助
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值