[VX Ace] Зрение монстра на скриптах

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
9 года 2 мес. назад - 9 года 2 мес. назад #96920 от DeadElf79
Зрение монстра на скриптах

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

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


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

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

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

event_hear?(event_id)
event_see?(event_id)


Код:
Code:
# Зрение монстра на скриптах # # Автор: 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
Последнее редактирование: 9 года 2 мес. назад пользователем DeadElf79.
Спасибо сказали: yuryol, Paranoid

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
9 года 2 мес. назад #96922 от Paranoid
А как понять слышит? Для этого нужно как-то настраивать тайлсет? И реагирует ли враг на препятствия?
Условия ставятся только в скрипте для всех врагов сразу, значит сделать каких-то особо дальнозорких или параноидальных стражников не получится?

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Проект месяца 1 место Программист Ruby Писатель 3 место 3 место Учитель Организатор конкурсов 1 место в Готв Ветеран Проект месяца 2 место
Больше
9 года 2 мес. назад #96923 от DeadElf79
"слышать" - это значит, что ивент может реагировать, когда игрок находится близко (в радиусе от ивента).

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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
9 года 2 мес. назад #96924 от Paranoid
Хм, тогда стоит подождать релиза. Заодно может таким макаром свой скрипт соберу по шаблону.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Время создания страницы: 0.091 секунд
Работает на Kunena форум