Добрый день.
В своем проекте я использую боевку
XAS и там независимо от размера изображения на ивенте, все равно один ивент - это одна клетка.
То есть если враг стреляет пулькой размером с 1 пиксель мы все равно при попытке уклонится от нее в любом случае ловим пулю лицом потому-что ивент занимает пространство всей клетки.
В интернете я нашел много скриптов которые увеличивают хитбокс ивента по клеткам, но чтоб уменьшал да еще и по пикселям, только один,
Free Movement вот так повезло подумал я и как на зло, он не совместим с XAS (да и с другими скриптами по типу диагонального движения и тд). Помогите пожалуйста найти, написать, придумать, скрипт совместимый с XAS и с моим проектом в целом на возможность уменьшать хитбоксы ивентов по пиксельно, с меня безграничная благодарность. Если не до конца понятно выразил мысль, демку прилагаю с примером
disk.yandex.ru/d/RHhQjVesMm6wJg ну и на фото понятно что имею в виду.
А если такого скрипта нет, а ты готов написать с нуля и довести до боевой готовности,
пиши в телегу
t.me/mahtuk0p (@mahtuk0p) с меня деньга.
Есть еще такой скрипт, вроде как должен проверять не соприкасаются ли спрайты, но я нуб не знаю как им пользоваться
#Этот скрипт проверяет столкновение, сохраняя позиции пограничного пикселя спрайта
#и проверьте, пересекается ли один из них с непрозрачным пикселем другого спрайта.
#Границы-это 2D-массивы, содержащие список позиций пикселей
class Sprite
def cx
self.x+self.width/2
end
def cy
self.y+self.height/2
end
#set_border можно использовать для создания хитбокса, отличного от видимого спрайта, и избежать
#вычисление границ одинаковых спрайтов несколько раз
def set_border(border)
@border = border
end
def border
unless @border
@border = sprite.bitmap.get_border
end
return @border
end
def actual_border
border.collect{ |a| [a[0]+self.x,a[1]+self.y] }
end
def collision(sprite)
if fast_collision(sprite)
return precis_collision(sprite)
else
return false
end
end
#быстрое столкновение проверяет,пересекаются ли прямоугольники, содержащие спрайты, используется
#чтобы избежать вычислительных столкновений со спрайтами, которые находятся далеко друг от друга
def fast_collision(sprite)
if (self.cx-sprite.cx).abs < (self.width+sprite.width)/2
if (self.cy-sprite.cy).abs < (self.height+sprite.height)/2
return true
end
end
return false
end
def precise_collision(sprite)
if actual_border.any?{ |a|
color = sprite.bitmap.get_pixel(a[0]-sprite.x,a[1]-sprite.y)
color.alpha != 0
}
return true
end
return false
end
end
#Новые методы для растрового изображения, которые определяют границы реальных спрайтов (ищет
#непрозрачные пиксели) . Методы были разделены для каждого направления ,могут быть
#случаи, когда все направления не нужны .Вычислительные границы могут быть длинными ,рекомендуется
# не делайте этого во время реального игрового процесса
class Bitmap
def border_left
border = []
for i in 1..self.height
color = Color.new(0,0,0,0)
j = 1
while color.alpha == 0 && j < self.width-1
color = get_pixel(j,i)
j+=1
end
border.push([j,i]) unless color.alpha == 0
end
return border
end
def border_right
border = []
for i in 1..self.height
color = Color.new(0,0,0,0)
j = 1
while color.alpha == 0 && j < self.width-1
color = get_pixel(self.width-j,i)
j+=1
end
border.push([self.width-j,i]) unless color.alpha == 0
end
return border
end
def border_down
border = []
for i in 1..self.width
color = Color.new(0,0,0,0)
j = 1
while color.alpha == 0 && j < self.height-1
color = get_pixel(i,j)
j+=1
end
border.push([i,j]) unless color.alpha == 0
end
return border
end
def border_up
border = []
for i in 1..self.width
color = Color.new(0,0,0,0)
j = 1
while color.alpha == 0 && j < self.height-1
color = get_pixel(self.height-i,j)
j+=1
end
border.push([self.height-i,j]) unless color.alpha == 0
end
return border
end
def get_border
border = border_left+border_right+border_up+border_down
border = border.uniq.sort!
return border
end
end