赞 | 274 |
VIP | 0 |
好人卡 | 0 |
积分 | 158 |
经验 | 515 |
最后登录 | 2024-11-8 |
在线时间 | 2106 小时 |
Lv4.逐梦者
- 梦石
- 1
- 星屑
- 14790
- 在线时间
- 2106 小时
- 注册时间
- 2017-9-28
- 帖子
- 662
|
- #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
- #_/
- #_/ ■ RGSS3 Script WideRangeEvent - 事件接触范围扩大 -
- #_/----------------------------------------------------------------------------
- #_/ 制 作 者 : CanariAlternate
- #_/ 配 布 元 : カルトの鳥篭 (http://canarialt.blog.fc2.com)
- #_/----------------------------------------------------------------------------
- #_/ □ 概要 : 扩大事件接触范围。
- #_/
- #_/ □ 必須 : 「获取注释脚本」
- #_/
- #_/ □ 位置 : 「経路探索VXAce」的上面
- #_/ 「注釈取得スクリプト」的下面
- #_/ 「イベント起動判定拡張」的下面
- #_/----------------------------------------------------------------------------
- #_/ 注意 : 不能与「マルチレイヤーシステム」并用
- #_/
- #_/----------------------------------------------------------------------------
- #_/ 仕様 : プライオリティ「通常キャラと同じ」とそれ以外で接触范围の拡大方法が
- #_/ 異なります。「通常キャラと同じ」は接触范围のみを拡大しています。
- #_/ 対して、それ以外は接触范围だけでなく当たり判定も拡大しています。
- #_/----------------------------------------------------------------------------
- #_/ 更新履歴 : 2014/05/28 Ver1.00 スクリプトを作成した。
- #_/ : 2014/06/07 Ver1.01 上向き用の図を左向きに変換にする処理を修正した。
- #_/ : 2014/06/07 Ver1.02 イベントから接触した場合も起動するように変更した。
- #_/ : 2014/06/10 Ver1.03 イベントから接触の判定タイミングを調整した。
- #_/
- #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
- $imported ||= {}
- $imported[:CanariAlternate_RangeEvent] = true
- #==============================================================================
- # ■ CaltRangeEvent
- #------------------------------------------------------------------------------
- # このスクリプトの設定です。
- #==============================================================================
- module CaltRangeEvent
- #----------------------------------------------------------------------------
- # ▼ 接触范围的設定
- #
- # ◇ 用于从注释中获取设置的正则表达式
- EVENT_NOTE = /\[\s*接触范围\s*\:\s*(.+?)\s*\]/m # 应用于当前事件页
- WHOLE_NOTE = /\<\s*接触范围\s*\:\s*(.+?)\s*\>/m # 应用于所有事件页(放在第1页)
- #
- # 例1 应用于当前事件页
- #
- # ◆注释:[接触范围: 前方5 ]
- #
- #
- # 例2 应用于所有事件页
- #
- # ◆注释:<接触范围: 前方4 >
- #
- #
- #
- # 例3 使用接触范围图设定接触范围
- #
- # ◆注释:[接触范围:
- # :□□■
- # :■★■
- # :■□■
- # :■□■■
- # :■□■
- # ◆注释:■■□■■]
- #
- # 例3的设定方式更加直观
- #
- #----------------------------------------------------------------------------
- # ▼ 接触范围图的解释
- # 通过范围图直观的设定事件接触范围
- # 推荐使用。
- #
- # 记号的意思
- # ■ : 接触
- # □ : 未接触
- # ★ : 事件基準(无论事件的朝向如何)
- # ▲ : 事件基准(仅当事件某个朝向时,设定只用设定脸朝上时的接触范围,其他朝向
- # 脚本会自动转向。※与8方向不兼容)
- # ※基準 ★ 或 ▲ 两者必须存在某一个,并且不可同时出现
- #
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # ◇ 接触范围图のハッシュを生成
- RANGE_DIAGRAM = {}
- #
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # ◇ 接触范围图 1
- RANGE_DIAGRAM["1"] =
- "□■□
- ■★■
- □■□"
- #
- # ◇ 接触范围图 2
- RANGE_DIAGRAM["2"] =
- "□□■□□
- □■■■□
- ■■★■■
- □■■■□
- □□■□□"
- #
- # ◇ 接触范围图 3
- RANGE_DIAGRAM["3"] =
- "□□□■□□□
- □□■■■□□
- □■■■■■□
- ■■■★■■■
- □■■■■■□
- □□■■■□□
- □□□■□□□"
- #
- # ◇ 接触范围图 4
- RANGE_DIAGRAM["4"] =
- "□□□□■□□□□
- □□□■■■□□□
- □□■■■■■□□
- □■■■■■■■□
- ■■■■★■■■■
- □■■■■■■■□
- □□■■■■■□□
- □□□■■■□□□
- □□□□■□□□□"
- #
- # ◇ 接触范围图 5
- RANGE_DIAGRAM["5"] =
- "□□□□□■□□□□□
- □□□□■■■□□□□
- □□□■■■■■□□□
- □□■■■■■■■□□
- □■■■■■■■■■□
- ■■■■■★■■■■■
- □■■■■■■■■■□
- □□■■■■■■■□□
- □□□■■■■■□□□
- □□□□■■■□□□□
- □□□□□■□□□□□"
- #
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # ◇ 接触范围图 前方4
- RANGE_DIAGRAM["前方4"] =
- "■■■■■■■■■
- □■■■■■■■□
- □□■■■■■□□
- □□□■■■□□□
- □□□□▲□□□□"
- #
- # ◇ 接触范围图 前方5
- RANGE_DIAGRAM["前方5"] =
- "■■■■■■■■■■■
- □■■■■■■■■■□
- □□■■■■■■■□□
- □□□■■■■■□□□
- □□□□■■■□□□□
- □□□□□▲□□□□□"
- #
- # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- # ◇ 接触范围图 全方向特別定義
- RANGE_DIAGRAM["全方向を別々に定義"] = diagrams = Array.new(10, "★")
- # 下
- diagrams[2] =
- "□■□
- ■★■
- □□□"
- # 左
- diagrams[4] =
- "□■□
- ■★□
- □□□"
- # 右
- diagrams[6] =
- "□■□
- ■★■
- ■□□"
- # 上
- diagrams[8] =
- "□□□
- ■★■
- □□□"
- #
- #----------------------------------------------------------------------------
- end
- #==============================================================================
- # ■ CaltRangeEvent
- #------------------------------------------------------------------------------
- # 接触范围图から情報を抽出して変換する処理を定義しています。
- #==============================================================================
- module CaltRangeEvent
- #--------------------------------------------------------------------------
- # ○ 接触范围图から情報を抽出
- #--------------------------------------------------------------------------
- def self.read_diagram(diagram)
- range_list = []
- diagram = diagram.clone
- # 基準を探索
- length = diagram.index(/★|▲/) + 1
- last_line = nil
- oy = -1
- diagram[0, length].each_line do |line|
- last_line = line
- oy += 1
- end
- ox = last_line.scan(/■|□|★|▲/).size - 1
- # 接触范围图を範囲リストに変換
- x = ox
- y = oy
- begin
- case diagram.slice!(0, 1)
- when "\n"
- x = ox
- y -= 1
- when "■"
- range_list.push [x, y]
- x -= 1
- when "□"
- x -= 1
- when "★"
- fix = true
- x -= 1
- when "▲"
- fix = false
- x -= 1
- end
- end until diagram.empty?
- return range_list, fix
- end
- #--------------------------------------------------------------------------
- # ○ 接触范围情報を生成
- #--------------------------------------------------------------------------
- def self.create_range(diagram)
- if diagram.kind_of?(String)
- range_list, fix = read_diagram(diagram)
- if fix # 向き固定か判定
- range_hash = {}
- range_list.each {|key| range_hash[key] = true }
- return Array.new(10, range_hash) # ★ は8方向とも同じ接触范围
- else
- result = Array.new(10, {})
-
- range_hash = {}
- range_list.each {|key| range_hash[ [-key[0], -key[1]] ] = true }
- result[2] = range_hash
-
- range_hash = {}
- range_list.each {|key| range_hash[ [key[1], -key[0]] ] = true }
- result[4] = range_hash
-
- range_hash = {}
- range_list.each {|key| range_hash[ [-key[1], key[0]] ] = true }
- result[6] = range_hash
-
- range_hash = {}
- range_list.each {|key| range_hash[key] = true }
- result[8] = range_hash
-
- return result # ▲ は8方向には非対応
- end
- else
- return Array.new(10) do |i| # 全方向を対応する接触范围图で設定
- range_hash = {}
- read_diagram(diagram[i])[0].each {|key| range_hash[key] = true }
- next range_hash
- end
- end
- end
- #--------------------------------------------------------------------------
- # ○ 上で定義した接触范围图を接触范围情報に変換
- #--------------------------------------------------------------------------
- RANGE = {}
- RANGE_DIAGRAM.each {|key, diagram| RANGE[key] = create_range(diagram) }
- end
- #==============================================================================
- # ■ Game_Map
- #------------------------------------------------------------------------------
- # マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。
- # このクラスのインスタンスは $game_map で参照されます。
- #==============================================================================
- class Game_Map
- #--------------------------------------------------------------------------
- # ○ 公開インスタンス変数
- #--------------------------------------------------------------------------
- attr_accessor :normal_event_range_mode # 通常キャラの接触判定モード
- #--------------------------------------------------------------------------
- # ● オブジェクト初期化
- #--------------------------------------------------------------------------
- alias :__RangeEvent__initialize :initialize
- def initialize
- __RangeEvent__initialize
- @normal_event_range_mode = false
- end
- end
- #==============================================================================
- # ■ Game_Player
- #------------------------------------------------------------------------------
- # プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
- # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
- #==============================================================================
- class Game_Player < Game_Character
- #--------------------------------------------------------------------------
- # ● 同位置のイベント起動判定
- #--------------------------------------------------------------------------
- alias :__RangeEvent__check_event_trigger_here :check_event_trigger_here
- def check_event_trigger_here(triggers)
- $game_map.normal_event_range_mode = true
- start_map_event(@x, @y, triggers, true)
- $game_map.normal_event_range_mode = false
- __RangeEvent__check_event_trigger_here(triggers)
- end
- end
- #==============================================================================
- # ■ Game_Event
- #------------------------------------------------------------------------------
- # イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
- # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
- #==============================================================================
- class Game_Event < Game_Character
- #--------------------------------------------------------------------------
- # ● 非公開メンバ変数の初期化
- #--------------------------------------------------------------------------
- alias :__RangeEvent__init_private_members :init_private_members
- def init_private_members
- __RangeEvent__init_private_members
- @range_list = nil
- @last_range_x = nil
- @last_range_y = nil
- @last_range_d = nil
- @last_range_p = nil
- end
- #--------------------------------------------------------------------------
- # ● 座標一致判定
- #--------------------------------------------------------------------------
- alias :__RangeEvent__pos? :pos?
- def pos?(x, y)
- return in_event_range?(x, y, true) if $game_map.normal_event_range_mode
- __RangeEvent__pos?(x, y) || in_event_range?(x, y, false)
- end
- #--------------------------------------------------------------------------
- # ● 停止時の更新
- #--------------------------------------------------------------------------
- alias :__RangeEvent__update_stop :update_stop
- def update_stop
- if !@locked && stopping? && (@last_range_x != @x || @last_range_y != @y ||
- @last_range_d != @direction || @last_range_p != @page)
- @last_range_x = @x
- @last_range_y = @y
- @last_range_d = @direction
- @last_range_p = @page
- check_event_trigger_touch_range
- end
- __RangeEvent__update_stop
- end
- #--------------------------------------------------------------------------
- # ○ 接触イベントの拡大した範囲の起動判定
- #--------------------------------------------------------------------------
- def check_event_trigger_touch_range
- return false unless @range_list
- return false unless normal_priority? == true
- result = false
- @range_list[@direction].each_key do |xy|
- x2 = $game_map.round_x(@x - xy[0])
- y2 = $game_map.round_y(@y - xy[1])
- result = true if check_event_trigger_touch(x2, y2)
- end
- return result
- end
- #--------------------------------------------------------------------------
- # ● イベントページ更新時に注釈から設定を取得
- #--------------------------------------------------------------------------
- alias :__RangeEvent__setup_note_settings :setup_note_settings
- def setup_note_settings
- __RangeEvent__setup_note_settings
- @range_list = get_range_list
- end
- #--------------------------------------------------------------------------
- # ○ 接触范围の取得
- #--------------------------------------------------------------------------
- def get_range_list
- result = nil
- if @page.event_note[CaltRangeEvent::EVENT_NOTE]
- result = CaltRangeEvent::RANGE[$1]
- result = CaltRangeEvent.create_range($1) unless result
- elsif @event.pages[0].event_note[CaltRangeEvent::WHOLE_NOTE]
- result = CaltRangeEvent::RANGE[$1]
- result = CaltRangeEvent.create_range($1) unless result
- end
- return result
- end
- #--------------------------------------------------------------------------
- # ○ 接触范围内か判定
- #--------------------------------------------------------------------------
- def in_event_range?(x, y, normal)
- return false unless @range_list
- return false unless normal_priority? == normal
- return @range_list[@direction][ [distance_x_from(x), distance_y_from(y)] ]
- end
- end
- #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
- #_/
- #_/ ▼ 以下、イベント起動判定拡張との競合回避
- #_/
- #_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
- if $imported[:CanariAlternate_EventEveryone]
- #==============================================================================
- # ■ Game_Player
- #------------------------------------------------------------------------------
- # プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
- # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
- #==============================================================================
- class Game_Player < Game_Character
- #--------------------------------------------------------------------------
- # ● 非公開メンバ変数の初期化
- #--------------------------------------------------------------------------
- alias :__RangeEvent__init_private_members :init_private_members
- def init_private_members
- __RangeEvent__init_private_members
- @last_range_x = nil
- @last_range_y = nil
- @last_range_d = nil
- end
- #--------------------------------------------------------------------------
- # ● 座標一致判定
- #--------------------------------------------------------------------------
- alias :__RangeEvent__pos? :pos?
- def pos?(x, y)
- return in_event_range?(x, y, true) if $game_map.normal_event_range_mode
- __RangeEvent__pos?(x, y) || in_event_range?(x, y, false)
- end
- #--------------------------------------------------------------------------
- # ● 停止時の更新
- #--------------------------------------------------------------------------
- alias :__RangeEvent__update_stop :update_stop
- def update_stop
- if !@locked && stopping? && (@last_range_x != @x || @last_range_y != @y ||
- @last_range_d != @direction)
- @last_range_x = @x
- @last_range_y = @y
- @last_range_d = @direction
- check_event_trigger_touch_range
- end
- __RangeEvent__update_stop
- end
- #--------------------------------------------------------------------------
- # ○ 接触イベントの拡大した範囲の起動判定
- #--------------------------------------------------------------------------
- def check_event_trigger_touch_range
- range_list = get_range_list
- return false unless range_list
- return false unless normal_priority? == true
- result = false
- range_list[@direction].each_key do |xy|
- x2 = $game_map.round_x(@x - xy[0])
- y2 = $game_map.round_y(@y - xy[1])
- result = true if check_event_trigger_touch(x2, y2)
- end
- return result
- end
- #--------------------------------------------------------------------------
- # ○ 接触范围内か判定
- #--------------------------------------------------------------------------
- def in_event_range?(x, y, normal)
- range_list = get_range_list
- return false unless range_list
- return false unless normal_priority? == normal
- return range_list[@direction][ [distance_x_from(x), distance_y_from(y)] ]
- end
- #--------------------------------------------------------------------------
- # ○ 接触范围の取得
- #--------------------------------------------------------------------------
- def get_range_list
- return nil unless event_list = get_list
- event_note = Calt.Read_EventNote(event_list)
- range_list = nil
- if event_note[CaltRangeEvent::EVENT_NOTE]
- range_list = CaltRangeEvent::RANGE[$1]
- range_list = CaltRangeEvent.create_range($1) unless range_list
- elsif event_note[CaltRangeEvent::WHOLE_NOTE]
- range_list = CaltRangeEvent::RANGE[$1]
- range_list = CaltRangeEvent.create_range($1) unless range_list
- end
- return range_list
- end
- end
- #==============================================================================
- # ■ Game_Event
- #------------------------------------------------------------------------------
- # イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理
- # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。
- #==============================================================================
- class Game_Event < Game_Character
- #--------------------------------------------------------------------------
- # ● 同位置のイベント起動判定
- #--------------------------------------------------------------------------
- alias :__RangeEvent__check_event_trigger_here :check_event_trigger_here
- def check_event_trigger_here(triggers)
- $game_map.normal_event_range_mode = true
- start_map_event(@x, @y, triggers, true)
- $game_map.normal_event_range_mode = false
- __RangeEvent__check_event_trigger_here(triggers)
- end
- end
- end
复制代码 |
评分
-
查看全部评分
|