كيف يمكنني تغيير هذه الخوارزمية رايكاستينغ لعدم الذهاب قطريا?

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/y هو sin/cos(dir)*dist.لا تصرخ في وجهي لوضع علامة سي هناك.اللغات متشابهة جدا جدا ، لدرجة أنني يمكن أن نسخ تقريبا هذا مباشرة في.

الحق ، الشكليات القيام به:هذه الخوارزمية الحالية سوف تذهب في بعض الأحيان قطريا (حيث كل من س و ص تغيير من قبل واحد في أي علامة) ، ولكن أتمنى أن لا تفعل ذلك.

على سبيل المثال:
الحالي:(حيث يكون الأشعة السينية مسبوكة)

xoooo  
oxooo  
ooxoo  
oooxo  
oooox  

مطلوب:

xxooo  
oxxoo  
ooxxo  
oooxx  
oooox  

معنى?

الرجاء المساعدة.

هل كانت مفيدة؟

المحلول

دلتا عبارة عن عوامة وهي المسافة السينية لـ "شعاع" افتراضي (يجب أن يكون حوالي 1.0 فهرنهايت-2.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)) || block_isSolid(map_get_block(map,xx + delta,yy)) or dist>maxdist)  
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top