Como posso mudar isso algoritmo de raycasting para não ir na diagonal?
-
17-09-2020 - |
Pergunta
// 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
}
Não há a função. lengthdir_x/y
é sin/cos(dir)*dist
.Não grite comigo por colocar a tag C lá.As línguas são muito semelhantes, a ponto de eu quase podia copiar este direito.
Direito, formalidades feito:Este algoritmo corrente muitas vezes vai na diagonal (Onde x e y alterar por um em qualquer sinal), mas eu desejo a ele para não fazer isso.
Por exemplo:
Atual:(Onde X é o raio fundido)
xoooo oxooo ooxoo oooxo oooox
Queria:
xxooo oxxoo ooxxo oooxx oooox
Faz sentido?
Por favor, ajuda.
Solução
delta é um float e x a distância de um virtual secound "ray"(deve ser em torno de 1.0 f - 2.0 f, apenas experimentate)
A Delta não deve ser menor que o tamanho de um pixel no mapa.
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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow