查看: 3416|回复: 9

[已经解决] 请问一下有没有那种怪物随机移动,发现玩家后快速靠近...

[复制链接]
梦石
0
星屑
160
在线时间
19 小时
注册时间
2018-12-19
回帖
12
发表于 2018-12-30 01:33:18 | 显示全部楼层 |阅读模式
悬赏10星屑已解决
急缺地图上怪物智能追逐主角的脚本……平时随机移动,进入警戒范围后快速接近主角并开启战斗……搜索里关于追逐的脚本我基本上都看过了,要么是没法用要么是不会用……还请大神指点……

最佳答案

All for one.
梦石
0
星屑
3557
在线时间
2337 小时
注册时间
2015-8-25
回帖
928

开拓者

发表于 2018-12-30 01:33:19 | 显示全部楼层
汉化 BY 七重[pre lang="ruby"]=begin
     RGSS3

注意:
本脚本生效之后,事件页中的自主移动项将会不再是原来的效果。

效果:
本脚本生效时。
从背后接近敌人 → 我方先手攻击
被敌人从背后接触 → 敌方先手攻击
被敌人接触到己方队伍的末尾 → 敌方先手攻击

接近到一定距离之后,敌人会发现并开始追击玩家。

根据相隔距离,敌人的透明度可以随之变化。

视乎等级差距,敌人会有追击与逃走两种行为。

奔跑中时,敌人会更早对玩家做出反应。
也即是,慢走时就没有那么容易被发现。

敌人在发现玩家时会显示叹号(默认情况下)

可以制作让敌人无法发现玩家的物品和技能。

可以设定敌人不可穿过的区域。

==
本脚本的设定方式:

请在敌人的事件页中,将自主移动的移动频率设为5档最高。

然后请在敌人的事件页中,移动路线项中插入脚本
enable_symbol_encount(id)
这里的id的含义是在设定部分中设定的。
其实就是自己预定的怪物的行动方式类型

==
隐身效果设置方法:

在技能或者物品的备注栏目中添加「ステルス:n」
那么就可以让敌人不对玩家做出反应一段时间。

想要强制解除的话,可以用事件脚本。
reset_stealth

你可以在需要换角色的时候,或者是过场的时候使用该功能

==
注意
插入这个脚本之后,只能从新游戏开始。
换言之,就是旧存档作废。


     ver1.01

     Last Update : 2012/03/04
     03/04 : 追跡中のイベントが存在する際にイベントが発生すると、
             追跡状態がおかしくなる不具合を修正
     ----------------------2012--------------------------
     12/23 : RGSS2からの移植
     ----------------------2011--------------------------

     ろかん   http://kaisou-ryouiki.sakura.ne.jp/
=end

#===================================
#  ●設定
#===================================
module SymbolEncount

FOLLOWER_CONTACT = true #设定本脚本是否生效

#开始设定
SYMBOL_SETTING_LIST = {
   #-----------------------------------------------------------
   0 => [

         #玩家多少级别时候敌人会逃,0的话就是不会逃走
         0,

         #判断等级的方式,0:队伍平均,1:队伍成员最高等级,2:领队的等级
         0,

         #敌人产生反应的距离
         3,

         #敌人产生反应的距离(奔跑时)
         6,

         #不追击玩家时,敌人的行动
         #0:随机移动,1:不动
         0,

         #透明度变化与玩家距离之间的关系。
         #0:无效
         #否则,越远越透明
         0,

         # 未开始追击玩家前的速度
         #   1:1/8倍速、2:1/4倍速、3:1/2倍速、4:標準速、5:2倍速、6:4倍速      
         3,

         # 开始追击玩家的移动速度
         #   1:1/8倍速、2:1/4倍速、3:1/2倍速、4:標準速、5:2倍速、6:4倍速
         4,

         # 反応前移動頻度
         #   1:最低、2:低、3:通常、4:高、5:最高
         5,

         # 反応後の移動頻度
         #   1:最低、2:低、3:通常、4:高、5:最高
         5,

         #做出反应时显示的图标id
         #0是封印这个效果
         1,

         #敌人不能通过的区域id
         #请用数组的方式设定
         [1, 3]


        ],
   #-----------------------------------------------------------
   1 => [
         15,# 逃逸等级
         0, # 计算逃逸等级的方式
         3, # 行走时反应距离
         5, # 奔跑时反应距离
         1, # 敌人普通时的行动
         0, # 透明度变化的距离
         0, # 反応前移動速度
         4, # 反応後移動速度
         0, # 反応前移動頻度
         5, # 反応後移動頻度
         1, # 反応時显示的图标id
         [] # 敌人不能通过的区域ID
        ],
   #-----------------------------------------------------------
   2 => [
         0, # シンボルが逃げるプレイヤーレベル
         0, # プレイヤーレベルの判断種別
         0, # シンボルが反応するプレイヤーとの距離
         0, # シンボルが反応するプレイヤーとの距離(プレイヤーダッシュ時)
         0, # プレイヤーに反応していない時の移動パターン
         0, # 透明度の変化するプレイヤーとの距離
         0, # 反応前の移動速度
         0, # 反応後の移動速度
         0, # 反応前の移動頻度
         0, # 反応後の移動頻度
         0, # 反応時に再生するフキダシアイコンID
         [] # シンボルが移動することのできないリージョンID
        ],
   #-----------------------------------------------------------
   3 => [
         0, # シンボルが逃げるプレイヤーレベル
         0, # プレイヤーレベルの判断種別
         0, # シンボルが反応するプレイヤーとの距離
         0, # シンボルが反応するプレイヤーとの距離(プレイヤーダッシュ時)
         0, # プレイヤーに反応していない時の移動パターン
         0, # 透明度の変化するプレイヤーとの距離
         0, # 反応前の移動速度
         0, # 反応後の移動速度
         0, # 反応前の移動頻度
         0, # 反応後の移動頻度
         0, # 反応時に再生するフキダシアイコンID
         [] # シンボルが移動することのできないリージョンID
        ],
   #-----------------------------------------------------------
}
end
#===================================
#  ここまで
#===================================

$rsi ||= {}
$rsi["シンボルエンカウント補助"] = true

class RPG::UsableItem < RPG::BaseItem
def stealth_obj_count
   self.note.each_line{|line|
     return $1.to_i if line =~ /ステルス\d+)/i
   }
   0
end
end

class << BattleManager
#--------------------------------------------------------------------------
# ● モジュールのインスタンス変数
#--------------------------------------------------------------------------
attr_writer   :run_event
@run_event = nil # 戦闘を呼び出したイベント
#--------------------------------------------------------------------------
# ● セットアップ
#--------------------------------------------------------------------------
alias _symbol_encount_setup setup
def setup(troop_id, can_escape = true, can_lose = false)
   _symbol_encount_setup(troop_id, can_escape, can_lose)
   set_battle_condition
end
#--------------------------------------------------------------------------
# ● シンボルエンカウントイベントから戦闘が呼び出されている場合の処理
#--------------------------------------------------------------------------
def set_battle_condition
   if @run_event && @run_event.symbol_encount
     @run_event.set_contact_condition
     case @run_event.contact_condition
     when 1
       @preemptive = true
     when 2
       @surprise = true
     end
   end
   @run_event = nil
end
end

class Game_Actor < Game_Battler
#--------------------------------------------------------------------------
# ● スキル/アイテムの使用
#--------------------------------------------------------------------------
def use_item(item)
   stealth_effect(item)
   super
end
#--------------------------------------------------------------------------
# ● ステルス効果の適用
#--------------------------------------------------------------------------
def stealth_effect(item)
   result = item.stealth_obj_count
   $game_player.stealth_count = result if result > 0
end
end

class Game_Party < Game_Unit
#--------------------------------------------------------------------------
# ● プレイヤーレベルの取得
#--------------------------------------------------------------------------
def get_player_level(type)
   case type
   when 0
     members.inject(0){|r, actor| r += actor.level} / members.size
   when 1
     members.max_by{|actor| actor.level}
   when 2
     $game_party.members.first.level
   end
end
end

class Game_Character < Game_CharacterBase
#--------------------------------------------------------------------------
# ● 非公開メンバ変数の初期化
#--------------------------------------------------------------------------
alias _symbol_init_private_members init_private_members
def init_private_members
   _symbol_init_private_members
   @origin_opacity = @opacity
end
#--------------------------------------------------------------------------
# ● 移動コマンドの処理
#--------------------------------------------------------------------------
alias _symbol_process_move_command process_move_command
def process_move_command(command)
   params = command.parameters
   @origin_opacity = params[0] if command.code == ROUTE_CHANGE_OPACITY
   _symbol_process_move_command(command)
end
#--------------------------------------------------------------------------
# ● 指定キャラクターとの位置関係を取得(接触していることを前提)
#--------------------------------------------------------------------------
def positional_relationship(character)
   if character.real_x == real_x
     character.real_y > real_y ? 1 : 0
   elsif character.real_y == real_y
     character.real_x > real_x ? 2 : 3
   else
     -1
   end
end
#--------------------------------------------------------------------------
# ● シンボルエンカウント関連処理による透明度の更新
#--------------------------------------------------------------------------
def update_symbol_opacity
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias _symbol_opacity_update update
def update
   _symbol_opacity_update
   update_symbol_opacity
end
end

class Game_Player < Game_Character
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_writer :stealth_count
#--------------------------------------------------------------------------
# ● 公開メンバ変数の初期化
#--------------------------------------------------------------------------
def init_public_members
   super
   reset_stealth
end
#--------------------------------------------------------------------------
# ● ステルス状態の初期化
#--------------------------------------------------------------------------
def reset_stealth
   @stealth_count = 0
end
#--------------------------------------------------------------------------
# ● ステルス判定
#--------------------------------------------------------------------------
def stealth?
   !@stealth_count.zero?
end
#--------------------------------------------------------------------------
# ● 歩数増加
#--------------------------------------------------------------------------
alias _increase_stealth_count increase_steps
def increase_steps
   _increase_stealth_count
   @stealth_count -= 1 if stealth?
end
#--------------------------------------------------------------------------
# ● シンボルエンカウント関連処理による透明度の更新
#--------------------------------------------------------------------------
def update_symbol_opacity
   if stealth? && !$game_map.interpreter.running?
     @opacity = 128
   else
     @opacity = @origin_opacity
   end
end
end

class Game_Follower < Game_Character
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :member_index
end

class Game_Event < Game_Character
#--------------------------------------------------------------------------
# ● インクルード SymbolEncount
#--------------------------------------------------------------------------
include SymbolEncount
#--------------------------------------------------------------------------
# ● 公開インスタンス変数
#--------------------------------------------------------------------------
attr_reader :symbol_encount
attr_reader :contact_condition
#--------------------------------------------------------------------------
# ● 非公開メンバ変数の初期化
#--------------------------------------------------------------------------
alias _symbol_encount_ini init_private_members
def init_private_members
   _symbol_encount_ini
   init_symbol_encount
end
#--------------------------------------------------------------------------
# ● イベントページのセットアップ
#--------------------------------------------------------------------------
alias _symbol_encount_setup_page setup_page
def setup_page(new_page)
   init_symbol_encount
   _symbol_encount_setup_page(new_page)
end
#--------------------------------------------------------------------------
# ● シンボルエンカウントの初期化
#--------------------------------------------------------------------------
def init_symbol_encount
   @forming = false
   @symbol_encount = false
   @symbol_away_level = 0
   @symbol_away_level_type = 0
   @reaction_distance = 0
   @reaction_distance_with_dash = 0
   @nonreaction_move_type = 0
   @visibility_distance = 0
   @reaction_before_speed = 0
   @reaction_after_speed = 0
   @reaction_before_speed = 0
   @reaction_after_frequency = 0
   @reaction_balloon_id = 0
   @unpassable_region = []
   @contact_index = -1
   @contact_condition = 0
end
#--------------------------------------------------------------------------
# ● シンボルエンカウントを有効化
#--------------------------------------------------------------------------
def enable_symbol_encount(id)
   data = SYMBOL_SETTING_LIST[id]
   @symbol_encount = true
   @symbol_away_level = data[0]
   @symbol_away_level_type = data[1]
   @reaction_distance = data[2]
   @reaction_distance_with_dash = data[3]
   @nonreaction_move_type = data[4]
   @visibility_distance = data[5]
   @reaction_before_speed = data[6]
   @reaction_after_speed = data[7]
   @reaction_before_frequency = data[8]
   @reaction_after_frequency = data[9]
   @reaction_balloon_id = data[10]
   @unpassable_region = data[11].dup
end
#--------------------------------------------------------------------------
# ● 通行可能判定
#--------------------------------------------------------------------------
def passable?(x, y, d)
   if @symbol_encount
     x2 = $game_map.round_x_with_direction(x, d)
     y2 = $game_map.round_y_with_direction(y, d)
     return false if @unpassable_region.include?($game_map.region_id(x2, y2))
   end
   super
end
#--------------------------------------------------------------------------
# ● ロック(実行中のイベントが立ち止まる処理) ※再定義
#--------------------------------------------------------------------------
def lock
   unless @locked
     @prelock_direction = @direction
     turn_toward_player unless @symbol_encount
     @locked = true
   end
end
#--------------------------------------------------------------------------
# ● プレイヤーレベルの取得
#--------------------------------------------------------------------------
def player_level
   $game_party.get_player_level(@symbol_away_level_type)
end
#--------------------------------------------------------------------------
# ● プレイヤーからの距離を取得
#--------------------------------------------------------------------------
def distance_from_player
   distance_x_from($game_player.x).abs + distance_y_from($game_player.y).abs
end
#--------------------------------------------------------------------------
# ● 指定キャラクターからの距離を取得
#--------------------------------------------------------------------------
def distance_from_character(character)
   distance_x_from(character.x).abs + distance_y_from(character.y).abs
end
#--------------------------------------------------------------------------
# ● 反応するプレイヤーからの距離を取得
#--------------------------------------------------------------------------
def reaction_distance
   if @forming
     @reaction_distance_with_dash.next
   elsif $game_player.dash? && $game_player.moving?
     @reaction_distance_with_dash
   else
     @reaction_distance
   end
end
#--------------------------------------------------------------------------
# ● シンボルエンカウントを動作させるか
#--------------------------------------------------------------------------
def active_symbol_encount?
   if $game_map.interpreter.running?
     false
   elsif @erased || $game_player.stealth?
     @forming = false
     false
   else
     true
   end
end
#--------------------------------------------------------------------------
# ● プレイヤーと同じ方向を向いているか
#--------------------------------------------------------------------------
def direction_as_player?
   direction == $game_player.direction
end
#--------------------------------------------------------------------------
# ● 指定キャラクターとの簡易接触判定
#--------------------------------------------------------------------------
def contact?(character)
   distance_from_character(character) <= 1
end
#--------------------------------------------------------------------------
# ● プレイヤーへの反応判定
#--------------------------------------------------------------------------
def reaction?
   distance_from_player <= reaction_distance
end
#--------------------------------------------------------------------------
# ● プレイヤーからの逃走判定
#--------------------------------------------------------------------------
def away?
   player_level > @symbol_away_level
end
#--------------------------------------------------------------------------
# ● 接触状況の判断
#--------------------------------------------------------------------------
def set_contact_condition
   @contact_index = -1
   @contact_condition = 0
   if contact?($game_player)
     @contact_index = 0
   elsif FOLLOWER_CONTACT
     $game_player.followers.visible_folloers.each{|follower|
       @contact_index = follower.member_index if contact?(follower)
     }
   end
   if @contact_index.zero?
     @contact_condition = direction_and_positional
   elsif $game_player.followers.visible_folloers.size == @contact_index
     @contact_condition = 2
   else
     @contact_condition = 0
   end
end
#--------------------------------------------------------------------------
# ● プレイヤーとの位置と向き関係から接触状況を取得
#--------------------------------------------------------------------------
def direction_and_positional
   position = positional_relationship($game_player)
   if position == -1
     0
   else
     case direction
     when 2
       direction_as_player? ? (position == 0 ? 1 : 2) : 0
     when 4
       direction_as_player? ? (position == 2 ? 1 : 2) : 0
     when 6
       direction_as_player? ? (position == 3 ? 1 : 2) : 0
     when 8
       direction_as_player? ? (position == 1 ? 1 : 2) : 0
     else
       0
     end
   end
end
#--------------------------------------------------------------------------
# ● 接触イベントの起動判定
#--------------------------------------------------------------------------
alias _symbol_encount_trigger check_event_trigger_touch
def check_event_trigger_touch(x, y)
   if @symbol_encount && FOLLOWER_CONTACT
     unless $game_map.interpreter.running?
       if @trigger == 2 && collide_with_player_characters?(x, y)
         start unless jumping?
       end
     end
   else
     _symbol_encount_trigger(x, y)
   end
end
#--------------------------------------------------------------------------
# ● 追跡の開始
#--------------------------------------------------------------------------
def start_forming
   @move_speed = @reaction_after_speed
   @move_frequency = @reaction_after_frequency
   unless @reaction_balloon_id.zero?
     Audio.se_play('Audio/SE/Decision1', 50, 150)
     @balloon_id = @reaction_balloon_id
   end
end
#--------------------------------------------------------------------------
# ● 追跡の終了(見失う)
#--------------------------------------------------------------------------
def end_forming
   @move_speed = @reaction_before_speed
   @move_frequency = @reaction_before_frequency
end
#--------------------------------------------------------------------------
# ● 反応している時の移動処理
#--------------------------------------------------------------------------
def reaction_movement
   @move_speed = @reaction_after_speed
   @move_frequency = @reaction_after_frequency
   if @symbol_away_level.zero?
     move_type_toward_player
   elsif away?
     move_away_from_player
   else
     move_type_toward_player
   end
end
#--------------------------------------------------------------------------
# ● 反応していない時の移動処理
#--------------------------------------------------------------------------
def nonreaction_movement
   @move_speed = @reaction_before_speed
   @move_frequency = @reaction_before_frequency
   case @nonreaction_move_type
   when 0
     move_type_random
   when 1
   end
end
#--------------------------------------------------------------------------
# ● フレーム更新
#--------------------------------------------------------------------------
alias _update_with_symbol update
def update
   update_symbol_reaction if @symbol_encount && @wait_count <= 0 && !@move_route_forcing
   _update_with_symbol
end
#--------------------------------------------------------------------------
# ● プレイヤーへの反応判定を更新
#--------------------------------------------------------------------------
def update_symbol_reaction
   if active_symbol_encount?
     if !@forming && reaction?
       start_forming
     elsif @forming && !reaction?
       end_forming
     end
     @forming = reaction?
   end
end
#--------------------------------------------------------------------------
# ● シンボルエンカウント関連処理による透明度の更新
#--------------------------------------------------------------------------
def update_symbol_opacity
   if @visibility_distance.zero?
     @opacity = @origin_opacity
   else
     @opacity = @origin_opacity - 50 * (distance_from_player - @visibility_distance)
   end
end
#--------------------------------------------------------------------------
# ● 自律移動の更新
#--------------------------------------------------------------------------
alias _update_self_movement_with_symbol update_self_movement
def update_self_movement
   if @symbol_encount
     update_symbol_movement if near_the_screen? && @stop_count > stop_count_threshold
   else
     _update_self_movement_with_symbol
   end
end
#--------------------------------------------------------------------------
# ● シンボルの動作を更新
#--------------------------------------------------------------------------
def update_symbol_movement
   if near_the_screen? && @stop_count > stop_count_threshold
     if active_symbol_encount?
       @forming ? reaction_movement : nonreaction_movement
     else
       nonreaction_movement
     end
   end
end
end

class Game_Interpreter
#--------------------------------------------------------------------------
# ● バトルの処理
#--------------------------------------------------------------------------
alias _command_301_with_symbol_encount command_301
def command_301
   unless $game_party.in_battle
     BattleManager.run_event = $game_map.events[@event_id]
     _command_301_with_symbol_encount
   end
end
#--------------------------------------------------------------------------
# ● ステルス状態の解除
#--------------------------------------------------------------------------
def reset_stealth
   $game_player.reset_stealth
end
end[/pre]

点评

感谢汉化!虽然有一点小问题,但我试着看看能不能自己解决,多谢大佬帮助 !  发表于 2018-12-30 13:38
回复

使用道具 举报

梦石
0
星屑
3557
在线时间
2337 小时
注册时间
2015-8-25
回帖
928

开拓者

发表于 2018-12-30 09:45:00 | 显示全部楼层
回复

使用道具 举报

梦石
0
星屑
160
在线时间
19 小时
注册时间
2018-12-19
回帖
12
 楼主| 发表于 2018-12-30 12:54:53 | 显示全部楼层
七重 发表于 2018-12-30 09:45
http://kaisou-ryouiki.sakura.ne.jp/material/rgss3/symbol_encout.txt
我觉得这个不错。

全日文的我不大懂,请问一下需要在事件页内加什么脚本语句吗?谢谢!
All for one.
回复

使用道具 举报

梦石
0
星屑
5217
在线时间
494 小时
注册时间
2018-6-18
回帖
598

超评测参与

发表于 2018-12-30 16:08:22 来自手机 | 显示全部楼层
本帖最后由 RMVXA 于 2018-12-30 16:32 编辑

所谓的追逐战在RPG MAKER的场景里真的不太合适:四方向接触面…… 这个引擎更适合做传统类型的RPG吧。
回复

使用道具 举报

梦石
0
星屑
160
在线时间
19 小时
注册时间
2018-12-19
回帖
12
 楼主| 发表于 2018-12-30 16:27:11 | 显示全部楼层
RMVXA 发表于 2018-12-30 16:08
所谓的追逐战在RPG MAKER的场景里真的不太合适:四方向接触面…… 很多追逐战的效果看上去不伦不类。
这个 ...

嗯嗯,其实我要做的就是传统类型的RPG,如果用这个脚本去做正统的追逐战的话确实看上去不是很合适
All for one.
回复

使用道具 举报

梦石
0
星屑
5217
在线时间
494 小时
注册时间
2018-6-18
回帖
598

超评测参与

发表于 2018-12-30 16:31:33 来自手机 | 显示全部楼层
H000000216 发表于 2018-12-30 16:27
嗯嗯,其实我要做的就是传统类型的RPG,如果用这个脚本去做正统的追逐战的话确实看上去不是很合适 ...

哦,是传说那种遇敌,不错~
回复

使用道具 举报

梦石
0
星屑
382
在线时间
24 小时
注册时间
2018-11-28
回帖
55
发表于 2018-12-30 21:02:16 | 显示全部楼层
首先新建一个事件,将事件图像设置成为任意一个怪物,设置该事件的自主移动由“固定”调整为“随机”,完成事件随机移动。在加入mog插件Event Sensor,进入插件管理器,开启这个插件,按照插件给新建的事件添加注释,即可完成怪物随机走动后碰见玩家立刻扑过来。如果怪物扑过来还要进入战斗界面,那么还需在事件设置一个战斗处理,匹配你所需要战斗的对象。希望我的描述对你有所帮助。
回复

使用道具 举报

梦石
0
星屑
160
在线时间
19 小时
注册时间
2018-12-19
回帖
12
 楼主| 发表于 2018-12-31 12:04:36 | 显示全部楼层
2283258119 发表于 2018-12-30 21:02
首先新建一个事件,将事件图像设置成为任意一个怪物,设置该事件的自主移动由“固定”调整为“随机”,完成 ...

已经解决啦,谢谢你的提议!
All for one.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部