كيف يمكنني تغيير هذه الخوارزمية رايكاستينغ لعدم الذهاب قطريا?
-
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
.لا تصرخ في وجهي لوضع علامة سي هناك.اللغات متشابهة جدا جدا ، لدرجة أنني يمكن أن نسخ تقريبا هذا مباشرة في.
الحق ، الشكليات القيام به:هذه الخوارزمية الحالية سوف تذهب في بعض الأحيان قطريا (حيث كل من س و ص تغيير من قبل واحد في أي علامة) ، ولكن أتمنى أن لا تفعل ذلك.
على سبيل المثال:
الحالي:(حيث يكون الأشعة السينية مسبوكة)
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)
لا تنتمي إلى StackOverflow