WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章J2ME技术进阶教程SLG中搜索某个角色可移动区域的算法

SLG中搜索某个角色可移动区域的算法
作者:bb  来源:迷你手游  发布时间:2005-11-3 13:53:20

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

代码如下:

/**
* 搜索可走区域
* @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的朋友有些帮助。

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码