このRaycastingアルゴリズムを斜めに行かないようにするにはどうすればよいですか。
-
17-09-2020 - |
質問
// 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
です。
そこに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)
. 所属していません StackOverflow