Wie kann ich diesen Raycasting-Algorithmus so ändern, dass er nicht diagonal verläuft?
-
17-09-2020 - |
Frage
// 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
}
Da ist die Funktion. lengthdir_x/y
Ist sin/cos(dir)*dist
.Schreien Sie mich nicht an, weil ich dort das C-Tag angebracht habe.Die Sprachen sind sich so sehr ähnlich, dass ich das fast direkt kopieren könnte.
Richtig, die Formalitäten sind erledigt:Dieser aktuelle Algorithmus verläuft manchmal diagonal (wobei sich sowohl x als auch y in beiden Vorzeichen um eins ändern), aber ich möchte, dass dies nicht der Fall ist.
Z.B:
Aktuell:(Wobei X der geworfene Strahl ist)
xoooo oxooo ooxoo oooxo oooox
Gesucht:
xxooo oxxoo ooxxo oooxx oooox
Sinn ergeben?
Bitte helfen Sie.
Lösung
Delta ist ein Gleitkomma und der x-Abstand eines virtuellen zweiten „Strahls“ (sollte etwa 1,0f – 2,0f betragen, experimentieren Sie einfach)
Delta sollte nicht kleiner als die Größe eines einzelnen Pixels in der Karte sein.
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)