0
// 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 の両方がいずれかの符号で 1 ずつ変化する) が、これを行わないことを望みます。

EG:
現在: (X はレイ キャスト)

xoooo  
ああああ  
おおおお  
うおお  
うわー  

募集:

xxooo  
オックスオー  
ooxxo  
ooxx  
うわー  

わかる?

助けてください。

4

1 に答える 1

0

delta は float で、仮想の 2 番目の「光線」の x 距離です (約 1.0f - 2.0f である必要があります。実験してみてください)。

デルタは、マップ内の 1 つのピクセルのサイズよりも小さくすることはできません。

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)  
于 2010-07-17T21:27:22.807 に答える