実際のDDAアルゴリズムを回してみましょう。
壁にぶつかるまで、毎回光線を1マスずつ増やしていくループです。
毎回、x方向に1マスずつ(stepX)、y方向に1マスずつ(stepY)ジャンプしますが、常に1マスずつジャンプしています。
(光線の方向が x 方向であれば、光線は y 方向には変化しないので、ループは毎回 x 方向に1マスずつジャンプすればよいことになります。)
光線がY方向に少し傾斜している場合、x方向に何回かジャンプするたびに、レイはY方向に1マスジャンプする必要があります。(レイが y 方向にある場合は、x 方向には決してジャンプする必要はありません。)
壁にぶつかるまで、毎回光線を1マスずつ増やしていくループです。
毎回、x方向に1マスずつ(stepX)、y方向に1マスずつ(stepY)ジャンプしますが、常に1マスずつジャンプしています。
(光線の方向が x 方向であれば、光線は y 方向には変化しないので、ループは毎回 x 方向に1マスずつジャンプすればよいことになります。)
光線がY方向に少し傾斜している場合、x方向に何回かジャンプするたびに、レイはY方向に1マスジャンプする必要があります。(レイが y 方向にある場合は、x 方向には決してジャンプする必要はありません。)
sideDistX と sideDistY はその方向にジャンプするたびに deltaDistX で増分され、
mapX と mapY はそれぞれ stepX と stepY で増分されます。
mapX と mapY はそれぞれ stepX と stepY で増分されます。
光線が壁に当たるとループが終了し、変数 "side" で壁の x 側と y 側、そして mapX と mapY でどの壁に当たったかが分かります。
//perform DDA
while (hit == 0)
{
//jump to next map square, either in x-direction,
or in y-direction
if (sideDistX < sideDistY)
{
sideDistX += deltaDistX;
mapX += stepX;
side = 0;
}
else
{
sideDistY += deltaDistY;
mapY += stepY;
side = 1;
}
//Check if ray has hit a wall
if (worldMap[mapX][mapY] > 0)
hit = 1;
}