可根據地形的不同,以及角色能力的不同來判斷可移動區域。例如騎士在平地上可以移動更大的范圍。
代碼如下:
/**
* 搜索可走區域
* @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的朋友有些幫助。