我正在开发基于文本(控制台)的 WW2 策略游戏,设置在 2d 方形网格地图上。我想要一种方法来计算从地图上的一个图块到另一个图块的视线。我已经使用这个Java 示例来构建我的代码,这就是我所写的:
public function plotLine($x0, $y0, $x1, $y1, $size)
{
$arr = $this->getEmptyMap($size);
$xDist = abs($x1 - $x0);
$yDist = -abs($y1 - $y0);
if($x0 < $x1) {
$xStep = 1;
} else {
$xStep = -1;
}
if($y0 < $y1) {
$yStep = 1;
} else {
$yStep = -1;
}
$plotError = $xDist + $yDist;
$arr[$x0][$y0] = 1;
while($x0 != $x1 || $y0 != $y1) {
// if(2 * $plotError > $yDist) {
// // Horizontal step
// $plotError += $yDist;
// $x0 += $xStep;
// }
// if(2 * $plotError < $xDist) {
// // Vertical step
// $plotError += $xDist;
// $y0 += $yStep;
// }
if(2 * $plotError - $yDist > $xDist - 2 * $plotError) {
// Horizontal step
$plotError += $yDist;
$x0 += $xStep;
} else {
// Vertical step
$plotError += $xDist;
$y0 += $yStep;
}
$arr[$x0][$y0] = 1;
}
$this->line = $arr;
}
注意:getEmptyMap 只是用 0 填充多维数组。
使用 (0, 0, 4, 4, 4) 作为输入的测试结果:
1100
0110
0011
0001
我已经尝试了映射线的方法:一种是 Franz D. 使用的正常实现(目前在我上面的示例中已注释掉),另一种是 Franz D. 显示的修改后的实现。也没有给我我正在寻找的结果;一种“抗锯齿”。当焊料从 0,0 看 2,2 并且在 1,2 和 2,1 处有建筑物时,应将 2,2 处的任何东西挡在视线之外。注释掉的实施将完全忽略建筑物,修改确实“击中” 2,1 但不是 1,2。我将如何调整我的代码以“命中”在线下方和在线上方?