查看: 2310|回复: 14

[有事请教] XP,如何实现同一地图不同区域遇到不同的怪物

[复制链接]
梦石
0
星屑
158
在线时间
12 小时
注册时间
2022-10-7
回帖
8
发表于 2025-10-21 19:09:16 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
在下新人,地图可以设定敌人队伍,但是貌似都是随机刷的,有没有什么办法不同区域刷新不同的怪物,我现在是用了一堆的触发事件来实现,弊端就是地图一打开,全是事件方块……不知道大神有没有更好的办法,小弟在此拜谢了~~

素材区好人

梦石
5
星屑
12559
在线时间
4345 小时
注册时间
2011-7-21
回帖
2264

超评测参与极短28参与极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

发表于 2025-10-21 19:28:35 | 显示全部楼层
1,最简单的方法,把一个大地图拆分成复数小地图
2,做成明雷或暗雷
回复

使用道具 举报

素材区好人

梦石
5
星屑
12559
在线时间
4345 小时
注册时间
2011-7-21
回帖
2264

超评测参与极短28参与极短27参与极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

发表于 2025-10-22 04:00:02 | 显示全部楼层
3,如果以上皆不愿的话
[pre lang="ruby"]encounter_list = $game_map.encounter_list
encounter_list.clear
$game_map.encounter_list.push(2)
$game_map.encounter_list.push(3)[/pre]
将(2)和(3)替换为你实际的怪物队伍ID即可
另外如果你还想保留原有队伍列表,前两行可以不用加
回复

使用道具 举报

梦石
0
星屑
158
在线时间
12 小时
注册时间
2022-10-7
回帖
8
 楼主| 发表于 2025-10-22 11:32:38 | 显示全部楼层
无忧谷主幻 发表于 2025-10-22 04:00
3,如果以上皆不愿的话
encounter_list = $game_map.encounter_list
encounter_list.clear

感谢大神赐教,我研究研究~~拜谢~~~
回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2025-10-22 11:59:14 | 显示全部楼层
[pre lang="ruby"]class Game_Map
  def encounter_list
    return [] if (f=@map.encounter_list).empty?
    tag = 1.to_s
    return f.find_all{|i| $data_troops.name[/【(\d+)】/] ;
    ($1.nil? or $1 == tag)}
  end
end[/pre]

把这段脚本塞到 main 之前

然后, 你就可以在敌群的名字里添加 【1】 作为不同区域的标志, 在该区域里就只会出现带有对应数字标志的敌群(没有设置【数字】的敌群视为通用敌群,任何区域都会出现)

接下来, 就是如何定义"区域"

1, 用变量法, 在区域入口处铺上"接触执行"的事件, 事件内容为改变指定变量的数值从而实现区域区分 ; 这种做法需要把脚本第4行的 tag = 1.to_s 改成 tag = $game_variables[10086].to_s ; 10086换成你要指定的变量ID

2, 地形标志法, 通过不同的地形标志来区分区域 ; 这种做法需要把tag = 1.to_s 改成 tag = terrain_tag($game_player.x, $game_player.y).to_s

3, 扩展法, 使用脚本定义区域ID等
这种做法把 tag = 1.to_s 改成脚本提供的区域ID函数就行了 (记得最后要加上 .to_s 点不要漏了哦)

PS: 没测试, 有问题再说

回复

使用道具 举报

梦石
0
星屑
158
在线时间
12 小时
注册时间
2022-10-7
回帖
8
 楼主| 发表于 2025-10-26 13:17:12 | 显示全部楼层
灯笼菜刀王 发表于 2025-10-22 11:59
class Game_Map
  def encounter_list
    return [] if (f=@map.encounter_list).empty?

大佬,您说的这个我大概理解意思了,可能我的思路有点窄,假如是大地图遇敌普通的怪,地图中这一个区域要遇敌特定怪,是不是要在这个区域边上都铺上触发就可以了?
123.jpg
回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2025-10-27 10:29:06 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2025-10-27 10:36 编辑
傀儡马夫 发表于 2025-10-26 13:17
大佬,您说的这个我大概理解意思了,可能我的思路有点窄,假如是大地图遇敌普通的怪,地图中这一个区域要 ...


栗子, 比如你想要  A区域出现 幽灵 , B区域出现 丧尸,  那, 在数据库建两个敌群, 起名为  ”【0】幽灵“ 和 “【1】丧尸”,然后在地图遇敌列表里把这两个敌群放进去

然后, 想办法给AB两区域做区分,  可以用变量法 也可以用其他, 地形标志,区域ID(新增脚本)等, 只要让pleyer在进入指定区域时, 能获得"0","1" 这样的判断即可

这里用变量法举例子,  可以在地上铺事件,  但是要并排铺两个,  一个踩上的时候改变量为0, 一个踩上时改变量为1,  这样玩家在走出来的时候, 就会自动改变量数值, 并且走到一半回头也不会出问题

但是, 铺事件的方式在有"入口出口"的区域比较好用,  像你图上这样四通八达的区域, 铺一圈事件太麻烦了, 此时可以用并行处理, 通过player的坐标判断, 实时切换变量值

例如, 并行处理, 执行脚本

x = $game_player.x
y = $game_player.y
if x > 10 and x < 16 and y > 10 and y < 11
  $game_variables[10086] = 1
else
  $game_variables[10086] = 0
end

这样, 就把一个区域给圈上了, 只要玩家走到对应坐标就会改变量为1, 走出去就会改为0了, 此时遇敌就是指定的敌群啦

--------------

[pre lang="ruby"]class Game_Player
  def tag_set(ary)
    (@tag_list = nil ;return) if ary.nil?
    @tag_list = ary
  end
  alias old_increase_steps increase_steps
  def increase_steps #[id,x1,y1,x2,y2]
    old_increase_steps
    return if @tag_list.nil? or @tag_list.empty?
    f = @tag_list.find{|j| @x >= j[1] && @x <= j[3] && @y >= j[2] && @y <= j[4]}
    $game_variables[10086] = f.nil? ? 0 : f[0]
  end
end
class Interpreter
  def 区域设置(*ary)
    ($game_player.tag_set(nil)) if ary[0] == nil
    $game_player.tag_set(ary)
  end
end[/pre]

每个区域都要写一串代码太麻烦了,  就附赠你一个直接设置的方法吧, 把它复制到上面那个脚本之下(记得把10086 改成你的区域变量ID数字)

然后, 每张地图, 都设置个"自动执行"的事件, 事件内容为
脚本:  区域设置([1,8,9,10,11],
[2,12,13,14,15],[3,16,17,18,19])
暂时消除事件

-
中括号内的数字是 [区域ID, x1,y1,x2,y2] , 这样在 第一个点和第二个点之间拉出来的矩形就是指定区域, 可以无限添加区域(不过受脚本框限制,笑, 写不下再去改造吧), 在添加的区域以外就是区域0
PS: 要换行的话从逗号处换, 有重叠的区域, 取最靠前的ID

如果想解除区域设置, 就执行事件脚本:  区域设置(nil)  ;


========================
也可以用区域设置脚本, 传送门

此时, 把上面的脚本, tag = 1.to_s 改成  tag = $game_map.xy_ids($game_player.x,$game_player.y)[0].to_s; 就可以了, 比用变量方便, 缺点是需要你会用这个脚本



回复

使用道具 举报

梦石
0
星屑
158
在线时间
12 小时
注册时间
2022-10-7
回帖
8
 楼主| 发表于 2025-10-27 10:59:23 | 显示全部楼层
灯笼菜刀王 发表于 2025-10-27 10:29
栗子, 比如你想要  A区域出现 幽灵 , B区域出现 丧尸,  那, 在数据库建两个敌群, 起名为  ”【0】幽灵“  ...

6666666 大佬就是大佬,思路开阔,技术硬核,万分感谢赐教~~~~~~
回复

使用道具 举报

梦石
2
星屑
13779
在线时间
2319 小时
注册时间
2011-6-4
回帖
586
发表于 2025-10-28 12:01:38 | 显示全部楼层
本帖最后由 真·可乐 于 2025-10-28 12:07 编辑

写过一个类似的,范围暗雷遇敌。
[pre lang="ruby"]#范围暗雷遇敌
#2018/10/5 By真可乐
#配置步骤
#创建配置事件
  # 在地图上放置一个事件
  # 事件名称设置为:/encounter_list
  #  在事件的第一页中,选择“注释”命令
  #  在注释框中输入配置信息
  #  每行一个敌群区域配置
  #  支持多个敌群在不同区域同时生效
  #
  # 例子 ,在地图的x坐标2到12,y坐标3到13区域内遇到敌群15,t[15]r[2,12,3,13]
#======================================================================================================================================================
module RangEncounter
  RANG_EC = 46 #几号开关控制范围暗雷遇敌开启,默认设置为46号
end

class Game_Event
  attr_reader    :event
end

class Rang_Troop #范围遇敌队伍
  attr_reader       :troop_id
  attr_reader       :xmax
  attr_reader       :xmin
  attr_reader       :ymax
  attr_reader       :ymin
def initialize(troop_id,xmin,xmax,ymin,ymax)
   @troop_id = troop_id ; @xmax = xmax ; @xmin = xmin ; @ymax = ymax ;@ymin = ymin
end
end

class Game_Map
  #--------------------------------------------------------------------------
  # * 先阉掉原来的遇敌
  #--------------------------------------------------------------------------
  def encounter_list
    return ($game_switches[RangEncounter::RANG_EC] ? [] : @map.encounter_list)
  end
  
  alias setup_zcl20181005 setup
  def setup(map_id)
    setup_zcl20181005(map_id)
    @encounter_list_range = Array.new
    @events.values.each do |ev|
      if ev.event.name == "/encounter_list"
      
        @encounter_list_range = get_troop(ev)
        #以检索到的首个为准
        break
        
      end
    end
  end
  
  def get_troop(ev)
    return [] unless ev.is_a?(Game_Event)
     return [] if ev.list.nil?
     encounter = []
       for i in 0...ev.list.size  
         next if ev.list.code != 108
          pa = ev.list.parameters[0]  
          /(t\[(.*)\])/ =~ pa
          next if $1.nil?
          troop =  $1.delete("t[").delete("]").to_i unless $1.nil?
           /(r\[(.*)\,(.*)\,(.*)\,(.*)\])/ =~ pa
         # rang = [$2.to_i,$3.to_i,$4.to_i,$5.to_i]
         next if $1.nil? or  $2.nil? or $3.nil? or $4.nil? or $5.nil?
      
          encounter.push(Rang_Troop.new(troop,$2.to_i,$3.to_i,$4.to_i,$5.to_i))
        
      
       end
     return  encounter
   end
  #--------------------------------------------------------------------------
  # * 再定义一个新的遇敌列表
  #--------------------------------------------------------------------------   
    def encounter_list_range
     return @encounter_list_range
    end
end

class Scene_Map
  alias update_zcl20181005 update
  def update
    update_zcl20181005
   
      # If encounter list isn't empty, and encounter count is 0
    if $game_player.encounter_count == 0 and $game_map.encounter_list_range != [] and $game_switches[RangEncounter::RANG_EC]
      # If event is running or encounter is not forbidden
      unless $game_system.map_interpreter.running? or
             $game_system.encounter_disabled or
             (tr = confirm_troop).nil?
        
        
        troop_id = tr.troop_id
        # If troop is valid
        if $data_troops[troop_id] != nil
          # Set battle calling flag
          $game_temp.battle_calling = true
          $game_temp.battle_troop_id = troop_id
          $game_temp.battle_can_escape = true
          $game_temp.battle_can_lose = false
          $game_temp.battle_proc = nil
        end
      end
    end
  end
  
  def confirm_troop
     p_x = $game_player.x
      p_y = $game_player.y
      str = Array.new
    $game_map.encounter_list_range.each do |tr|
      next unless tr.is_a?(Rang_Troop)
        if p_x >= tr.xmin and p_x <= tr.xmax and p_y >= tr.ymin and p_y <= tr.ymax
        
          str.push(tr)
        end
      end
      return nil if str.empty?
      return str[rand(str.size)]
    end
end[/pre]
BUG反馈请加QQ 529283039
水友群 917854767

回复 1 0

使用道具 举报

梦石
0
星屑
158
在线时间
12 小时
注册时间
2022-10-7
回帖
8
 楼主| 发表于 2025-10-28 20:46:56 | 显示全部楼层
真·可乐 发表于 2025-10-28 12:01
写过一个类似的,范围暗雷遇敌。
#范围暗雷遇敌
#2018/10/5 By真可乐

你这头像比较牛B
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部