見張りイベント補助スクリプト

フォーラムルール
素材の利用規約を決めたいけど、どんなことを書けばいいのか分からない場合は、
素材のテンプレートをご利用下さい。
アバター
オシブ
記事: 20
登録日時: 2015年11月10日(火) 15:25
連絡を取る:

見張りイベント補助スクリプト

投稿記事by オシブ » 2015年11月23日(月) 13:34

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

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

画像
画像

【使い方】
イベントのスクリプトにfind_player?(n)と入力します。
n は見張りの視界の範囲です。整数を入れてください。

キャプチャ2.jpg
キャプチャ2.jpg (33.01 KiB) 閲覧数: 4406 回


見張りがプレイヤーを見つけるとtrueを返します。
並列処理にすれば常時判定を行ってくれます。
(ウエイトを挟むと処理の負荷を軽減できます。また、判定をゆるめにすることができます)
条件分岐やスイッチONOFFにお使いください。
(例の画像では、セルフスイッチをONにするようにイベントスクリプトに記述しています)

キャプチャ.JPG


遮蔽物としたいものには、地形タグに0以外を設定してください。

キャプチャ1.JPG



【ダウンロード】

コード: 全て選択

#==============================================================================
# ■ 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


★別バージョン

視界の範囲の指定を分けることができるバージョンです。
視界の範囲(メイン)とは、見張りの向きから直線の距離です。
視界の範囲(サブ)とは、見張りの真横の距離です。
これを使うことで、正面は遠くまで見えるが、脇はあまり見えないみたいな見張りを作ることができます。

キャプチャ3.jpg
キャプチャ3.jpg (45.69 KiB) 閲覧数: 4225 回


【ダウンロード】

コード: 全て選択

#==============================================================================
# ■ 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
最後に編集したユーザー オシブ on 2015年12月08日(火) 17:22 [ 編集 3 回目 ]

――――――――――――――――――――――――――――――――――――――――――――――
RPGツクールVXでシナリオ重視ゲーム作ってます。

画像
サイト:Mix Idea
アドレス:http://oxibgame.jugem.jp/
―――――――――――――――――――――――――――――――――――――――――――――――
アバター
オシブ
記事: 20
登録日時: 2015年11月10日(火) 15:25
連絡を取る:

Re: 見張りイベント補助スクリプト

投稿記事by オシブ » 2015年12月05日(土) 22:06

見張りイベント補助スクリプトを更新しました。
1.バグを修正しました。
2.少し整理して読みやすくしてあります。
3.イベントの名前に特定ワードがあると、そのイベントを遮蔽物判定する動作を入れました。
(その場合は、イベントのプライオリティを「通常キャラと同じ」にしてください)
――――――――――――――――――――――――――――――――――――――――――――――
RPGツクールVXでシナリオ重視ゲーム作ってます。

画像
サイト:Mix Idea
アドレス:http://oxibgame.jugem.jp/
―――――――――――――――――――――――――――――――――――――――――――――――
アバター
ONOZUKA
記事: 63
登録日時: 2015年11月11日(水) 13:31
お住まい: 幻想郷
連絡を取る:

Re: 見張りイベント補助スクリプト

投稿記事by ONOZUKA » 2015年12月07日(月) 14:37

すごくてバグの懸念が無いスクリプトで助かります。有意義に使用させていただきます。
=============================================================================
RPGツクールVXACEでゲームを作っているはずです!
HP:http://tenkoma.info Twitter:https://twitter.com/ONOZUKA7
=============================================================================
アバター
オシブ
記事: 20
登録日時: 2015年11月10日(火) 15:25
連絡を取る:

Re: 見張りイベント補助スクリプト

投稿記事by オシブ » 2015年12月08日(火) 17:05

>>ONOZUKAさん
ダウンロードありがとうございます!
誰かに使ってもらえるというのは嬉しいものですね :oops:
また新しい機能をつけたバージョンも公開したので、よかったらそちらも見てみてください。
――――――――――――――――――――――――――――――――――――――――――――――
RPGツクールVXでシナリオ重視ゲーム作ってます。

画像
サイト:Mix Idea
アドレス:http://oxibgame.jugem.jp/
―――――――――――――――――――――――――――――――――――――――――――――――
アバター
オシブ
記事: 20
登録日時: 2015年11月10日(火) 15:25
連絡を取る:

Re: 見張りイベント補助スクリプト

投稿記事by オシブ » 2015年12月08日(火) 17:42

追加で、見張りが画面の大きさよりも広い視界を持ったときに、プレイヤーが発見されると
どの見張りがプレイヤーを見つけたのかわかりづらくなる場面などが起きると思います。
そのとき、よかったらこの素材も使ってください。
イベントスクリプトにmap_scroll_found(speed)と入れてください。
speedは、スクロールの早さです。
プレイヤーを見つけた見張りが見えるところまで、マップスクロールします。
ただし、一回しかスクロールしない上に、斜めにスクロールはしません……(技術が足りませんでした…)

コード: 全て選択

module OXIB
  #イベントIDを指定する変数の番号
  EVID_VARIABLES = 1
  #変数で指定したイベントIDが0だと「このイベント」になります。
end
#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● 見つけた人のところまでマップスクロール
  #-------------------------------------------------------------------------- 
  def map_scroll_found(speed = 4)
    event = get_character($game_variables[OXIB::EVID_VARIABLES])
    case event.direction
    when 2; direction = 8 ;distance = (event.y - $game_player.y).abs
    when 4; direction = 6 ;distance = (event.x - $game_player.x).abs
    when 6; direction = 4 ;distance = (event.x - $game_player.x).abs
    when 8; direction = 2 ;distance = (event.y - $game_player.y).abs
    end
    distance -= 5 #動かすスクロールの距離を調整
    return if distance <= 1 #数字が大きいほど離れていてもスクロールしない
    $game_map.start_scroll(direction, distance, speed) 
  end
end


ちなみに余談ですが、マップスクロールをしたあと、距離0のマップスクロールをもう一度入れると
マップスクロール完了までウエイトを自動的に入れてくれます。
キャプチャ4.PNG
キャプチャ4.PNG (1.6 KiB) 閲覧数: 4224 回


また画面の外の見張りの動きが止まってしまうなどの問題は
Artificial Providenceさんのところにある画面外判定無視自律移動イベントのスクリプト素材がおすすめです!
――――――――――――――――――――――――――――――――――――――――――――――
RPGツクールVXでシナリオ重視ゲーム作ってます。

画像
サイト:Mix Idea
アドレス:http://oxibgame.jugem.jp/
―――――――――――――――――――――――――――――――――――――――――――――――
アバター
ONOZUKA
記事: 63
登録日時: 2015年11月11日(水) 13:31
お住まい: 幻想郷
連絡を取る:

Re: 見張りイベント補助スクリプト

投稿記事by ONOZUKA » 2015年12月31日(木) 18:32

返信遅れてしまい申し訳ありません。
更新ありがとうございます。スクロールは組み合わせてなんとか描写しようかと思います。
=============================================================================
RPGツクールVXACEでゲームを作っているはずです!
HP:http://tenkoma.info Twitter:https://twitter.com/ONOZUKA7
=============================================================================

“Ace:スクリプト素材(RGSS3)” へ戻る