Добрый день.
В своем проекте я использую боевку XAS и там независимо от размера изображения на ивенте, все равно один ивент - это одна клетка.
То есть если враг стреляет пулькой размером с 1 пиксель мы все равно при попытке уклонится от нее в любом случае ловим пулю лицом потому-что ивент занимает пространство всей клетки.

В интернете я нашел много скриптов которые увеличивают хитбокс ивента по клеткам, но чтоб уменьшал да еще и по пикселям, только один, Free Movement вот так повезло подумал я и как на зло, он не совместим с XAS (да и с другими скриптами по типу диагонального движения и тд). Помогите пожалуйста найти, написать, придумать, скрипт совместимый с XAS и с моим проектом в целом на возможность уменьшать хитбоксы ивентов по пиксельно, с меня безграничная благодарность. Если не до конца понятно выразил мысль, демку прилагаю с примером https://disk.yandex.ru/d/RHhQjVesMm6wJg ну и на фото понятно что имею в виду.

А если такого скрипта нет, а ты готов написать с нуля и довести до боевой готовности,
пиши в телегу https://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