Как я могу изменить этот алгоритм Raycasting, чтобы не идти по диагонали? - PullRequest
0 голосов
/ 18 июля 2010
// 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.Не кричи на меня за то, что я поставил там тэг С.Языки очень и очень похожи, до такой степени, что я мог почти скопировать это прямо.

Правильно, формальности выполнены: Этот текущий алгоритм иногда будет идти по диагонали (где и x, и y меняются на единицу в любом знаке), но я бы не хотел этого делать.

EG:
Ток: (Где X - луч, брошенный лучом)

xoooo  
oxooo  
ooxoo  
oooxo  
oooox  

Требуется:

xxooo  
oxxoo  
ooxxo  
oooxx  
oooox  

Имеет смысл?

Пожалуйста, помогите.

1 Ответ

0 голосов
/ 18 июля 2010

delta - это число с плавающей точкой, представляющее собой x-расстояние виртуального вторичного "луча" (должно быть около 1.0f - 2.0f, просто экспериментируйте)

Дельта не должна быть меньше размера одного пикселя на карте.

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)  
...