Плохо! Плохо!:  0
Показано с 1 по 6 из 6

Тема: Ищу скрипт на HitBox

  1. #1

    Money Dollar Ищу скрипт на HitBox

    Добрый день.
    В своем проекте я использую боевку 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

  2. #2
    Администратор Аватар для Пётр
    Информация о пользователе
    Регистрация
    24.04.2014
    Адрес
    Краснодар
    Сообщений
    3,940
    Записей в дневнике
    6
    Репутация: 132 Добавить или отнять репутацию

    По умолчанию

    Если ты используешь ХАС, то у тебя не клетки большие скорее всего, а радиус у пули/удара больше 1й клетки.
    Читай инструкцию.
    XAS Action Battle System(VX Ace - Русская версия)

  3. #3

    По умолчанию

    Ну вот мне нужна возможность менять размер хитбокса попиксельно в меньшую сторону. Что-бы если "пулька" была размером с 1 пиксель, мы получали урон только задев тот самый пиксель а не всю клетку целиком В демке которую я прислал как раз показана эта система, но к сожалению она не совместима с боевкой xas (скрипт xas и пиксельное перемещение которое я использую, тоже имеются в демке, если потребуется) .

  4. #4
    Администратор Аватар для Пётр
    Информация о пользователе
    Регистрация
    24.04.2014
    Адрес
    Краснодар
    Сообщений
    3,940
    Записей в дневнике
    6
    Репутация: 132 Добавить или отнять репутацию

    По умолчанию

    Цитата Сообщение от MAHTUKOP Посмотреть сообщение
    Ну вот мне нужна возможность менять размер хитбокса попиксельно в меньшую сторону. Что-бы если "пулька" была размером с 1 пиксель, мы получали урон только задев тот самый пиксель а не всю клетку целиком В демке которую я прислал как раз показана эта система, но к сожалению она не совместима с боевкой xas (скрипт xas и пиксельное перемещение которое я использую, тоже имеются в демке, если потребуется) .
    Бери Гамак и не пытайся слепить Карлсона, прикрутив к козе вентилятор.

  5. #5

    По умолчанию

    Есть скрипт и dll от Cidiomar's Perfect Pixel Collision, им можно проверить столкновение 2 пикселей, будь это спрайты ивентов или картинок, хорош тем что вычисления проводятся в отдельном dll, а не самим мейкером. Можно стрелять картинкой или событием, хитбокс тоже может быть спрайтом самого ивента или картинкой любой формы привязанной к ивенту.
    https://forums.rpgmakerweb.com/index...llision.34975/

    Другой способ.
    Если событий-врагов не много можно проверять столкновение/положение не шагами и клетками карты get_charater(1).x или $game_map.events[1].x что часто неточно , а положение на экране get_charater(1).screen_x или $game_map.events[1].screen_x

    вот скрипт-пример столкновения события и игрока на расстоянии 10 пикселей, проверяется в условии $game_map.events[1].close?

    class Game_Event < Game_Character

    def close?
    sx = (screen_x-$game_player.screen_x).abs
    sy = (screen_y-$game_player.screen_y).abs
    sx < 10 && sy < 10
    end
    end

    или
    стрельба картинкой номер 1, проверка в самом событии, хитбокс 40 пикселей, центр хитбокса в 24 пикселях от ног персонажа,
    т е пуля пролетает меньше чем в 20 пикселях от центра

    e = get_character(0)
    ex = (e.screen_x - screen.pictures[1].x).abs
    ey=(e.screen_y-screen.pictures[1].y-24).abs

    if ex < 20 && ey < 20
    поподание
    end
    Последний раз редактировалось votetot; 25.07.2021 в 12:08.

  6. #6

    По умолчанию

    Большое спасибо, добрый человек
    Такой маленький скрипт а выполняет все необходимые мне функции и упрощает жизнь.
    Думаю он поможет и другим людям, которые также как и я не разбираются в руби но искали что-то подобное :3
    Написал тебе в лс, прочти пожалуйста.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Ищу скрипт на HitBox