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.

War es hilfreich?

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)  
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top