Как я могу изменить этот алгоритм Raycasting, чтобы не пройти по диагонали?
-
17-09-2020 - |
Вопрос
// Arg0 - Map, Arg1 - X, Arg2 - Y, Arg3 - Distance, Arg4 - MaxDistance
var xx,yy,dist, x1, y1, dir, maxdist, obj, res, map;
map = argument0
x1 = argument1
y1 = argument2
dir = argument3
maxdist = argument4
dist = 0
do {
dist+=1
xx = x1+round(lengthdir_x(dist,dir))
yy = y1+round(lengthdir_y(dist,dir))
} until(block_isSolid(map_get_block(map,xx,yy)) or dist>maxdist)
if !block_isSolid(map_get_block(map,xx,yy)) {
return false
} else {
res = ds_list_create()
ds_list_add(res,xx)
ds_list_add(res,yy)
return res
}
.
Есть функция.lengthdir_x/y
является sin/cos(dir)*dist
.
Не кричите на меня за то, что поместите туда C там.Языки очень похожи, до такой степени, что я мог бы почти скопировать это прямо.
Верно, формальности сделано: Этот текущий алгоритм иногда будет проходить по диагонали (где изменяются как X, так и Y на один в любом знаке), но я желаю этого не делать этого.
Например:
Текущий: (где X - лишенный лучей)
xoooo oxooo ooxoo oooxo oooox.
хотел:
xxooo oxxoo ooxxo oooxx oooox.
имеет смысл?
Пожалуйста, помогите.
Решение
Delta - это поплавок и это X-расстояние виртуального зазубринского «луча» (должно быть около 1,0F - 2.0F, просто экспериментировать)
Delta не должна быть меньше размера одного пикселя на карте.
do {
dist+=1
xx = x1+round(lengthdir_x(dist,dir))
yy = y1+round(lengthdir_y(dist,dir))
} until(block_isSolid(map_get_block(map,xx,yy)) || block_isSolid(map_get_block(map,xx + delta,yy)) or dist>maxdist)
. Не связан с StackOverflow