=begin RGSS3 ★ 距離によるセルフスイッチ自動切り替え ★ イベントのセルフスイッチをプレイヤーとの距離によって 自動的に切り替えます。 ● 使い方 ●======================================================== イベントの名前に以下の記述を行ってください。 SDS:<A,B,C,D> A,B,C,Dにはそれぞれのセルフスイッチが切り替わるプレイヤーとの距離を 数値で設定します。 距離によるセルフスイッチ切り替えを行わないスイッチには 0 を設定してください。 -------------------------------------------------------------------- 各セルフスイッチの距離設定に2種類のオプションを付加することが可能です。 必要な場合は距離を示す数値の直後に以下のキーワードを付加してください。 -r => スイッチの切り替わり判定が逆になります。 設定距離より離れたらON, 近づいたらOFF。 -o => プレイヤーとの距離によりONには自動で切り替わりますが、 OFFには自動で切り替わらなくなります。 -------------------------------------------------------------------- 例) SDS:<0,3-o,6,8-o-r> セルフスイッチAに対しては何も行わない。 プレイヤーとの距離が3マス以内の場合、セルフスイッチBをON。 プレイヤーとの距離が3マスより大きい場合は何もしない。 プレイヤーとの距離が6マス以内の場合、セルフスイッチCをON。 プレイヤーとの距離が6マスより大きい場合、セルフスイッチCをOFF。 プレイヤーとの距離が8マス以内の場合は何もしない。 プレイヤーとの距離が8マスより大きい場合、セルフスイッチDをON。 ==================================================================== ver1.00 Last Update : 2012/06/16 06/16 : 新規 ろかん [url]http://kaisou-ryouiki.sakura.ne.jp/[/url] =end $rsi ||= {} $rsi["距離によるセルフスイッチ自動切り替え"] = true class RPG::Event def get_distance_switches_conf match = @name.scan(/SDS:<(.*)>/) result = [] if match.first match.first.first.split(",").each{|split_data| result << get_distance_switch_data(split_data) } end result end def get_distance_switch_data(split_data) option = 0 if split_data.include?('-r') option += 1 split_data.delete!('-r') end if split_data.include?('-o') option += 2 split_data.delete!('-o') end [split_data.to_i, option] end end class Game_Event < Game_Character SELF_KEY = ['A','B','C','D'] #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- alias _refresh_distance_switch refresh def refresh set_distance_switch unless @switch_distances _refresh_distance_switch end #-------------------------------------------------------------------------- # ● 距離によるスイッチ切り替え情報の初期化 #-------------------------------------------------------------------------- def set_distance_switch @switch_distances = @event.get_distance_switches_conf end #-------------------------------------------------------------------------- # ● プレイヤーからの距離を取得 #-------------------------------------------------------------------------- def distance_from_player distance_x_from($game_player.x).abs + distance_y_from($game_player.y).abs end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- alias _update_distance_switch update def update update_switch unless @switch_distances.empty? _update_distance_switch end #-------------------------------------------------------------------------- # ● 距離によるスイッチ切り替え更新 #-------------------------------------------------------------------------- def update_switch distance = distance_from_player @switch_distances.each_with_index{|conf_data, index| unless conf_data[0].zero? case conf_data[1] when 0 result = distance <= conf_data[0] when 1 result = distance > conf_data[0] when 2 result = distance <= conf_data[0] next unless result when 3 result = distance > conf_data[0] next unless result end $game_self_switches[[@map_id, @event.id, SELF_KEY[index]]] = result end } end end
#============================================================================== # ■ RGSS3 距離によるセルフスイッチ自動切り替え拡張 # 向いている方向へも依存 Ver1.01 by 星潟 #------------------------------------------------------------------------------ # 指定したイベントに対し、向いている方向依存で # 強制的に視界外として判定するようにします。 #============================================================================== # ★設定例(イベントの名前に記入) #------------------------------------------------------------------------------ # <SBD:0,3> #------------------------------------------------------------------------------ # 向いている方向に依存したセルフスイッチ自動切り替えの対象となります。 # また、横方向への反応に対しては特に補正を行いません。 # 縦方向へは3タイル分まで切り替え判定を行います。 #------------------------------------------------------------------------------ # <SBD:1,4> #------------------------------------------------------------------------------ # 向いている方向に依存したセルフスイッチ自動切り替えの対象となります。 # また、1タイル分横方向に対して補正を行います。 # 縦方向へは4タイル分まで判定を行います。 # (真横にいる場合には反応させたい時等に有効) #------------------------------------------------------------------------------ # <SBD:-1,6> #------------------------------------------------------------------------------ # 向いている方向に依存したセルフスイッチ自動切り替えの対象となります。 # また、横方向への反応に対して-1の補正を行います。 # 縦方向へは6タイル分まで判定を行います。 #------------------------------------------------------------------------------ # <SBD:-2,8> #------------------------------------------------------------------------------ # 向いている方向に依存したセルフスイッチ自動切り替えの対象となります。 # また、横方向への反応に対して-2の補正を行います。 # 縦方向へは8タイル分まで判定を行います。 # (目の前にいるプレイヤーもスルーします。高台にいる敵等向け?) #============================================================================== module S_B_D #視界判定を有効にする場合のキーワードを設定。 N = "SBD" #視界範囲外判定の場合のプレイヤーからの距離を設定。 #通常ありえない値を入力。(800×800マップでも1600離れる事はあり得ない) D = 1600 end class RPG::Event #-------------------------------------------------------------------------- # 視界判定フラグの取得 #-------------------------------------------------------------------------- def get_d_by_d /<#{S_B_D::N}[::](\S+),(\S+)>/ =~ @name ? [$1.to_i,$2.to_i] : false end end class Game_Event < Game_Character #-------------------------------------------------------------------------- # 距離によるスイッチ切り替え情報の初期化 #-------------------------------------------------------------------------- alias set_distance_switch_ex set_distance_switch def set_distance_switch set_distance_switch_ex @sd_by_d = @event.get_d_by_d end #-------------------------------------------------------------------------- # プレイヤーからの距離を取得 #-------------------------------------------------------------------------- alias distance_from_player_extra distance_from_player def distance_from_player flag = false if @sd_by_d case self.direction when 2;flag = (($game_player.y < self.y or distance_x_from($game_player.x).abs > distance_y_from($game_player.y).abs + @sd_by_d[0]) or distance_y_from($game_player.y).abs > @sd_by_d[1]) when 4;flag = (($game_player.x > self.x or distance_x_from($game_player.x).abs + @sd_by_d[0] < distance_y_from($game_player.y).abs) or distance_x_from($game_player.x).abs > @sd_by_d[1]) when 6;flag = (($game_player.x < self.x or distance_x_from($game_player.x).abs + @sd_by_d[0] < distance_y_from($game_player.y).abs) or distance_x_from($game_player.x).abs > @sd_by_d[1]) when 8;flag = (($game_player.y > self.y or distance_x_from($game_player.x).abs > distance_y_from($game_player.y).abs + @sd_by_d[0]) or distance_y_from($game_player.y).abs > @sd_by_d[1]) end end flag ? S_B_D::D : distance_from_player_extra end end
翠靈月 发表于 2017-2-14 16:47
如果不考虑遮蔽物之类的东西
先假设NPC座标为6,11
触发方式设置为并行事件
QQ蚊子湯 发表于 2017-2-14 18:08
兩個腳本一起用www
=begin
七重 发表于 2017-2-14 16:27
有个这样的思路。
并行一个事件,记录npc的x,y坐标。记录玩家的x,y坐标。
欢迎光临 Project1 (https://rpg.blue/) | Powered by Discuz! X3.1 |