Зрение монстра на скриптах
Информация:
Автор: 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