 | 去看看L1AttackPc有沒有calcHit()//命中判定,然後配合以下程式碼檢查.
這段程式碼的目的是檢查從角色目前位置到指定目標座標之間的「直線路徑」是否通暢。如果路線中間有障礙物(例如牆壁或無法通過的地形),就會回傳 false,否則回傳 true。
/**
* 判斷從目前位置到指定座標的直線路徑上,是否**沒有障礙物**。
*
* @param tx 目標座標的 X 值
* @param ty 目標座標的 Y 值
* @return 如果路徑上沒有障礙物則回傳 true,否則回傳 false。
*/
public boolean glanceCheck(final int tx, final int ty) {
final L1Map map = getMap(); // 取得角色所處地圖
int chx = getX(); // 當前 X 座標
int chy = getY(); // 當前 Y 座標
for (int i = 0; i < 15; i++) {
// 如果已到達目標點(或其周圍 8 格),則跳出迴圈
if (((chx == tx) && (chy == ty)) || ((chx + 1 == tx) && (chy - 1 == ty)) || ((chx + 1 == tx) && (chy == ty))
|| ((chx + 1 == tx) && (chy + 1 == ty)) || ((chx == tx) && (chy + 1 == ty))
|| ((chx - 1 == tx) && (chy + 1 == ty)) || ((chx - 1 == tx) && (chy == ty))
|| ((chx - 1 == tx) && (chy - 1 == ty)) || ((chx == tx) && (chy - 1 == ty))) {
break;
} else {
int th = targetDirection(tx, ty); // 取得目前朝向目標的方向
// 如果此方向上無法通過(有障礙物),回傳 false
if (!map.isArrowPassable(chx, chy, th)) {
return false;
}
// 根據與目標點的相對位置,移動角色的座標
if (chx < tx) {
if (chy == ty) {
chx++;
} else if (chy > ty) {
chx++;
chy--;
} else if (chy < ty) {
chx++;
chy++;
}
} else if (chx == tx) {
if (chy < ty) {
chy++;
} else if (chy > ty) {
chy--;
}
} else if (chx > tx) {
if (chy == ty) {
chx--;
} else if (chy < ty) {
chx--;
chy++;
} else if (chy > ty) {
chx--;
chy--;
}
}
}
}
// 如果都沒遇到障礙物,回傳 true
return true;
}
| |