このRaycastingアルゴリズムを斜めに行かないようにするにはどうすればよいですか。

StackOverflow https://stackoverflow.com/questions/3273301

質問

// 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/ysin/cos(dir)*distです。 そこにCタグを入れるために私に叫んではいけません。言語は非常によく似ています、私がこれをまっすぐにコピーすることができた場所には非常によく似ています。

右、正式な手続き: この現在のアルゴリズムは時々斜めに行くことがあります(xとyの両方がどちらの符号で変更されています)が、これをしないことを望みます。

例えば:
電流:(ここでXは光線鋳造品)

xoooo  
oxooo  
ooxoo  
oooxo  
oooox  
.

募集:

xxooo  
oxxoo  
ooxxo  
oooxx  
oooox  
.

センスを作る?

助けてください。

役に立ちましたか?

解決

デルタはフロートであり、仮想分割「Ray」の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)  
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top