私はテキスト ベース (コンソール) の 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
私は行をマッピングする方法を試しました: 1 つは Franz D. が使用した通常の実装 (現在、上記の例ではコメントアウトされています)、もう 1 つは Franz D. が示した変更された実装です。どちらも私が探している結果を私に与えていません。「アンチエイリアシング」の一種。はんだが 0,0 から 2,2 を見て、1,2 と 2,1 に建物がある場合、2,2 にあるものはすべて見えないようにする必要があります。コメントアウトされた実装は建物を完全に無視し、変更は 2,1 に「ヒット」しますが、1,2 にはヒットしません。線の下と線の上の両方に「ヒット」するようにコードを調整するにはどうすればよいですか?