スクリプト勉強がてら作ったので、見苦しかったりわかりづらかったりしますが、それでもOKな方向きです。
(独り言:イテレータがまったくわからずfor in~を多用しました。ダレカタスケテ)




※改造した状態での再配布はクレジット表記をしてくれればOKです。
※また他サイトなどに改造の相談や質問するために引用転載することはOKです。


【使い方】
イベントのスクリプトにfind_player?(n)と入力します。
n は見張りの視界の範囲です。整数を入れてください。
見張りがプレイヤーを見つけるとtrueを返します。
並列処理にすれば常時判定を行ってくれます。
(ウエイトを挟むと処理の負荷を軽減できます。また、判定をゆるめにすることができます)
条件分岐やスイッチONOFFにお使いください。
(例の画像では、セルフスイッチをONにするようにイベントスクリプトに記述しています)
遮蔽物としたいものには、地形タグに0以外を設定してください。
【ダウンロード】
コード: 全て選択
#==============================================================================
# ■ RGSS3 見張りイベント補助 by オシブ
#------------------------------------------------------------------------------
# 使い方:イベントスクリプトにfind_player?(n)と入力します。
# n は見張りの視界の範囲です。整数を入れてください。
# 見張りがプレイヤーを見つけるとtrueを返します。
# 遮蔽物としたいものには、地形タグに0以外を設定してください。
# 遮蔽物にしたいイベントの名前に特定ワードを入れると判定します。
# また、イベントはプライオリティが「通常キャラ同じ」でないと判定しません。
# 一応seach_playerもイベントスクリプトに入力すると動きます。
# その場合はseach_player(イベントID, 視界の範囲)を入れてください。
#==============================================================================
module OXIB
#遮蔽物とするイベントにつける名前の言葉
WORD = "ゲート"
end
#==============================================================================
# ■ Game_Map
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# ● 障害物のイベントあるかどうか判定
#--------------------------------------------------------------------------
def search_events(x, y)
result = false
return result if events_xy(x, y).empty?
for event in events.values
next if event.x != x
next if event.y != y
next unless event.normal_priority?
result = true if event.name.include?(OXIB::WORD)
end
return result
end
#--------------------------------------------------------------------------
# ● 遮蔽物はあるかどうか判定
#--------------------------------------------------------------------------
def search_shields(x ,y)
return true if terrain_tag(x, y) != 0
return true if search_events(x, y)
return false
end
#--------------------------------------------------------------------------
# ● X軸周辺で遮蔽物があるかどうか判定
#--------------------------------------------------------------------------
def x_search_shields(x ,y)
return false unless search_shields(x ,y)
return true if terrain_tag(x + 1, y) != 0
return true if terrain_tag(x - 1, y) != 0
return true if search_events(x + 1, y)
return true if search_events(x - 1, y)
return false
end
#--------------------------------------------------------------------------
# ● Y軸周辺で遮蔽物があるかどうか判定
#--------------------------------------------------------------------------
def y_search_shields(x ,y)
return false unless search_shields(x ,y)
return true if terrain_tag(x , y + 1) != 0
return true if terrain_tag(x, y - 1) != 0
return true if search_events(x ,y + 1)
return true if search_events(x ,y - 1)
return false
end
end
#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# ● プレイヤーが視界に入っているかの判定
#--------------------------------------------------------------------------
def search_player(event, range)
event = get_character(event) if event.is_a?(Fixnum)
x = event.x
y = event.y
res = false #未発見
for ix in x - range..x + range
for iy in y - range..y + range
next if ix < 0 || iy < 0 #マップ外は飛ばす
case event.direction
when 2; next if iy < y + 1 #下を向いている
when 4; next if ix > x - 1 #左を向いている
when 6; next if ix < x + 1 #右を向いている
when 8; next if iy > y - 1 #上を向いている
end
res = true if $game_player.pos?(ix, iy) #発見
break if res #発見したら処理を中断
end
break if res #発見したら処理を中断
end
return res
end
#--------------------------------------------------------------------------
# ● 遮蔽物がイベントとプレイヤーの間にあるかの判定
#--------------------------------------------------------------------------
def find_player?(range)
player = $game_player
event = get_character(0)
#視界範囲内にプレイヤーがいない場合は処理を中断
return false unless search_player(event, range)
min_x = [player.x, event.x].min
max_x = [player.x, event.x].max
min_y = [player.y, event.y].min
max_y = [player.y, event.y].max
flag = true #発見した状態からスタート
case event.direction
when 2, 8 #下か上を向いている
for iy in min_y..max_y
flag = false if $game_map.search_shields(player.x, iy)
if flag == true
for ix in min_x + 1..max_x - 1
flag = false if $game_map.y_search_shields(ix, iy)
end
end
end
return flag #結果を返す
when 4, 6 #左か右を向いている
for ix in min_x..max_x
flag = false if $game_map.search_shields(ix, player.y)
if flag == true
for iy in min_y + 1..max_y - 1
flag = false if $game_map.x_search_shields(ix ,iy)
end
end
end
return flag #結果を返す
end
p "find_player?: error"
return true
end
end
視界の範囲の指定を分けることができるバージョンです。
視界の範囲(メイン)とは、見張りの向きから直線の距離です。
視界の範囲(サブ)とは、見張りの真横の距離です。
これを使うことで、正面は遠くまで見えるが、脇はあまり見えないみたいな見張りを作ることができます。
【ダウンロード】
コード: 全て選択
#==============================================================================
# ■ RGSS3 見張りイベント補助 by オシブ
#------------------------------------------------------------------------------
# 使い方:イベントスクリプトにfind_player?(main_range, sub_range)と入力します。
# main_range、sub_range は見張りの視界の範囲です。整数を入れてください。
# 見張りがプレイヤーを見つけるとtrueを返します。
# 遮蔽物としたいものには、地形タグに0以外を設定してください。
# 遮蔽物にしたいイベントの名前に特定ワードを入れると判定します。
# また、イベントはプライオリティが「通常キャラ同じ」でないと判定しません。
# 一応seach_playerもイベントスクリプトに入力すると動きます。
# その場合はseach_player(イベントID, main_range, sub_range)を入れてください。
#==============================================================================
module OXIB
#遮蔽物とするイベントにつける名前の言葉
WORD = "ゲート"
end
#==============================================================================
# ■ Game_Map
#==============================================================================
class Game_Map
#--------------------------------------------------------------------------
# ● 障害物のイベントあるかどうか判定
#--------------------------------------------------------------------------
def search_events(x, y)
result = false
return result if events_xy(x, y).empty?
for event in events.values
next if event.x != x
next if event.y != y
next unless event.normal_priority?
result = true if event.name.include?(OXIB::WORD)
end
return result
end
#--------------------------------------------------------------------------
# ● 遮蔽物はあるかどうか判定
#--------------------------------------------------------------------------
def search_shields(x ,y)
return true if terrain_tag(x, y) != 0
return true if search_events(x, y)
return false
end
#--------------------------------------------------------------------------
# ● X軸周辺で遮蔽物があるかどうか判定
#--------------------------------------------------------------------------
def x_search_shields(x ,y)
return false unless search_shields(x ,y)
return true if terrain_tag(x + 1, y) != 0
return true if terrain_tag(x - 1, y) != 0
return true if search_events(x + 1, y)
return true if search_events(x - 1, y)
return false
end
#--------------------------------------------------------------------------
# ● Y軸周辺で遮蔽物があるかどうか判定
#--------------------------------------------------------------------------
def y_search_shields(x ,y)
return false unless search_shields(x ,y)
return true if terrain_tag(x , y + 1) != 0
return true if terrain_tag(x, y - 1) != 0
return true if search_events(x ,y + 1)
return true if search_events(x ,y - 1)
return false
end
end
#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
#--------------------------------------------------------------------------
# ● プレイヤーが視界に入っているかの判定
#--------------------------------------------------------------------------
def search_player(event, main_range, sub_range = main_range)
event = get_character(event) if event.is_a?(Fixnum)
case event.direction
when 2, 8
x_range = sub_range
y_range = main_range
when 4, 6
x_range = main_range
y_range = sub_range
end
x = event.x
y = event.y
res = false #未発見
for ix in x - x_range..x + x_range
for iy in y - y_range..y + y_range
next if ix < 0 || iy < 0 #マップ外は飛ばす
case event.direction
when 2; next if iy < y + 1 #下を向いている
when 4; next if ix > x - 1 #左を向いている
when 6; next if ix < x + 1 #右を向いている
when 8; next if iy > y - 1 #上を向いている
end
res = true if $game_player.pos?(ix, iy) #発見
break if res #発見したら処理を中断
end
break if res #発見したら処理を中断
end
return res
end
#--------------------------------------------------------------------------
# ● 遮蔽物がイベントとプレイヤーの間にあるかの判定
#--------------------------------------------------------------------------
def find_player?(main_range, sub_range = main_range)
player = $game_player
event = get_character(0)
#視界範囲内にプレイヤーがいない場合は処理を中断
return false unless search_player(event, main_range, sub_range)
min_x = [player.x, event.x].min
max_x = [player.x, event.x].max
min_y = [player.y, event.y].min
max_y = [player.y, event.y].max
flag = true #発見した状態からスタート
case event.direction
when 2, 8 #下か上を向いている
for iy in min_y..max_y
flag = false if $game_map.search_shields(player.x, iy)
if flag == true
for ix in min_x + 1..max_x - 1
flag = false if $game_map.y_search_shields(ix, iy)
end
end
end
return flag #結果を返す
when 4, 6 #左か右を向いている
for ix in min_x..max_x
flag = false if $game_map.search_shields(ix, player.y)
if flag == true
for iy in min_y + 1..max_y - 1
flag = false if $game_map.x_search_shields(ix ,iy)
end
end
end
return flag #結果を返す
end
p "find_player?: error"
return true
end
end