Войти на сайт

Авторизация, ждите ...
×

ТЕМА: [VX Ace] Зрение монстра на скриптах

[VX Ace] Зрение монстра на скриптах 7 года 1 мес. назад #96920

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Программист RubyПроект месяца 2 место3 местоПисатель 3 местоУчитель1 место в ГотвПроект месяца 1 местоВетеранОрганизатор конкурсов
Зрение монстра на скриптах

Информация:
Автор: DeadElf79
Версия: 1.0

Описание:
Данный скрипт позволяет ивенту обнаружить игрока не только в заданном радиусе, но и в заданном направлении вгляда ивента. То есть зрение работает не просто по радиусу, но и по сектору круга.
пояснительный скриншот [ Нажмите, чтобы развернуть ]


Название теме дал по аналогии со зрением монстра на ивентах, потому что скрипт я писал под вдохновением от обсуждения и все равно нашел решение проще и быстрее.

Настройки:
EVENT_NAME - указанное в между косыми черточками слово должно стоят в имени ивента, чтобы он определялся как враг.
VIEW_RADIUS - радиус, в котором ивент может слшать и видеть игрока.
SSW_IF_HEAR - вставьте сюда локальный переключатель от A до D. Он будет включаться автоматически, если ивент слышит игрока (только слышит, еще не видит).
SSW_IF_SEE - тоже локальный переключатель. Он будет включаться, если ивент не только слышит, но и видит игрока.

Данные методы позволяют вручную проверить, видит или слышил ли ивент игрока в данный момент. Это на случай, если вы не захотите использовать локальные переключатели и страницы.
event_hear?(event_id)
event_see?(event_id)

Код:
# Зрение монстра на скриптах
#
# Автор: DeadElf79
# Версия: 1.0
module De79EnemyEvent
  EVENT_NAME = /enemy/i
  VIEW_RADIUS = 6
 
  SSW_IF_HEAR = 'A'
  SSW_IF_SEE  = 'B'
end
 
def event_hear?(event_id)
    $game_map.events[event_id].can_hear?
end
 
def event_see?(event_id)
    $game_map.events[event_id].can_see?
end
 
class Game_Event
	def enemy?
		self.name =~ De79EnemyEvent::EVENT_NAME
	end
 
    def can_hear?(px,py)
        # point in
        return Math.sqrt( (self.x - px)**2 + (self.y - py)**2 ) <= De79EnemyEvent::VIEW_RADIUS
    end
 
    def can_see?(px,py)
        # point in sector
        return false unless can_hear?(px,py)
        rad = Math.atan2(py - self.y, px - self.x)
        grad = rad * 180 / ( Math::PI )
        case @direction
        when 8
            return true if (-45.0..-135.0).include? grad
        when 4
            return true if (-135.0..135.0).include? grad
        when 6
            return true if (-45.0..45.0).include? grad
        when 2
            return true if (45.0..135.0).include? grad
        end
        false
    end
end
 
class Game_Map
  attr_accessor :enemies
 
  alias de79_enemy_event_setup setup
  def setup(map_id)
    de79_enemy_event_setup(map_id)
    setup_enemies
  end
 
  def setup_enemies
    @enemies = []
    @events.each_value do |event|
      @enemies.push event if event.enemy?
    end
  end
end
 
class Scene_Map < Scene_Base
  alias de79_enemy_event_update update
  def update
    de79_enemy_event_update
    update_enemies
  end
 
  def update_enemies
    $game_map.enemies.each do |enemy|
		next unless enemy_on_screen?(enemy)
		x, y = $game_player.x, $game_player.y
		if enemy.can_hear?(x,y)
			if enemy.can_see?(x,y)
				# 'see' page
				key = [$game_map.map_id, enemy.id, De79EnemyEvent::SSW_IF_SEE]
				$game_self_switches[key] = true
				enemy.refresh
			else
				# 'hear' page
				key = [$game_map.map_id, enemy.id, De79EnemyEvent::SSW_IF_HEAR]
				$game_self_switches[key] = true
				enemy.refresh
			end
		end
    end
  end
 
  def enemy_on_screen?(event)
    stx = $game_map.screen_tile_x
    sty = $game_map.screen_tile_y
    sx = $game_map.modw($game_player.x)*stx
    sy = $game_map.modh($game_player.y)*sty
    if (sx..sx+stx).include? event.x
      if (sy..sy+sty).include? event.y
        return true
      end
    end
    false
  end
end
Последнее редактирование: 7 года 1 мес. назад от DeadElf79.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: yuryol, Paranoid

[VX Ace] Зрение монстра на скриптах 7 года 1 мес. назад #96922

  • Paranoid
  • Paranoid аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 688
  • Спасибо получено: 350
А как понять слышит? Для этого нужно как-то настраивать тайлсет? И реагирует ли враг на препятствия?
Условия ставятся только в скрипте для всех врагов сразу, значит сделать каких-то особо дальнозорких или параноидальных стражников не получится?
Администратор запретил публиковать записи гостям.

[VX Ace] Зрение монстра на скриптах 7 года 1 мес. назад #96923

  • DeadElf79
  • DeadElf79 аватар
  • Вне сайта
  • Звездный Страж
  • Сообщений: 3147
  • Спасибо получено: 2650
  • Программист RubyПроект месяца 2 место3 местоПисатель 3 местоУчитель1 место в ГотвПроект месяца 1 местоВетеранОрганизатор конкурсов
"слышать" - это значит, что ивент может реагировать, когда игрок находится близко (в радиусе от ивента).

я вырезал скрипт из проекта, при этом удалив все возможные настройки и прочее, что либо не относится к делу, либо еще не готово. различия в настройках видимости нет, обработки взгляда через препятствия нет. и всё это не появится до релиза розы, для которой я этот скрипт и пилю. пока могу похвастаться тем, что он работает гораздо быстрее, чем описанный ранее в теме "зрение на ивентах" подход, предложенный мной и впоследствии развитый юриолем.
Администратор запретил публиковать записи гостям.
За этот пост поблагодарили: yuryol

[VX Ace] Зрение монстра на скриптах 7 года 1 мес. назад #96924

  • Paranoid
  • Paranoid аватар
  • Вне сайта
  • Светлый дракон
  • Сообщений: 688
  • Спасибо получено: 350
Хм, тогда стоит подождать релиза. Заодно может таким макаром свой скрипт соберу по шаблону.
Администратор запретил публиковать записи гостям.
Модераторы: NeKotZima
Время создания страницы: 0.196 секунд