设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 214|回复: 9
打印 上一主题 下一主题

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
110
在线时间
8 小时
注册时间
2022-10-7
帖子
5
跳转到指定楼层
1
发表于 2025-10-21 19:09:16 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

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

Lv4.逐梦者

素材区好人

梦石
3
星屑
9399
在线时间
3774 小时
注册时间
2011-7-21
帖子
2398

极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

2
发表于 2025-10-21 19:28:35 | 只看该作者
1,最简单的方法,把一个大地图拆分成复数小地图
2,做成明雷或暗雷
回复 支持 反对

使用道具 举报

Lv4.逐梦者

素材区好人

梦石
3
星屑
9399
在线时间
3774 小时
注册时间
2011-7-21
帖子
2398

极短26参与极短25参与极短24参与极短23参与极短22参与极短21参与

3
发表于 2025-10-22 04:00:02 | 只看该作者
3,如果以上皆不愿的话
RUBY 代码复制
  1. encounter_list = $game_map.encounter_list
  2. encounter_list.clear
  3. $game_map.encounter_list.push(2)
  4. $game_map.encounter_list.push(3)

将(2)和(3)替换为你实际的怪物队伍ID即可
另外如果你还想保留原有队伍列表,前两行可以不用加
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
8 小时
注册时间
2022-10-7
帖子
5
4
 楼主| 发表于 2025-10-22 11:32:38 | 只看该作者
无忧谷主幻 发表于 2025-10-22 04:00
3,如果以上皆不愿的话
encounter_list = $game_map.encounter_list
encounter_list.clear

感谢大神赐教,我研究研究~~拜谢~~~
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
40207
在线时间
5849 小时
注册时间
2006-11-10
帖子
6712
5
发表于 2025-10-22 11:59:14 | 只看该作者
RUBY 代码复制
  1. class Game_Map
  2.   def encounter_list
  3.     return [] if (f=@map.encounter_list).empty?
  4.     tag = 1.to_s
  5.     return f.find_all{|i| $data_troops[i].name[/【(\d+)】/] ;
  6.     ($1.nil? or $1 == tag)}
  7.   end
  8. end


把这段脚本塞到 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: 没测试, 有问题再说

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
8 小时
注册时间
2022-10-7
帖子
5
6
 楼主| 发表于 5 天前 | 只看该作者
灯笼菜刀王 发表于 2025-10-22 11:59
class Game_Map
  def encounter_list
    return [] if ([email protected]_list).empty?

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

123.jpg (185.01 KB, 下载次数: 2)

123.jpg
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
40207
在线时间
5849 小时
注册时间
2006-11-10
帖子
6712
7
发表于 4 天前 | 只看该作者
本帖最后由 灯笼菜刀王 于 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了, 此时遇敌就是指定的敌群啦

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

RUBY 代码复制
  1. class Game_Player
  2.   def tag_set(ary)
  3.     (@tag_list = nil ;return) if ary.nil?
  4.     @tag_list = ary
  5.   end
  6.   alias old_increase_steps increase_steps
  7.   def increase_steps #[id,x1,y1,x2,y2]
  8.     old_increase_steps
  9.     return if @tag_list.nil? or @tag_list.empty?
  10.     f = @tag_list.find{|j| @x >= j[1] && @x <= j[3] && @y >= j[2] && @y <= j[4]}
  11.     $game_variables[10086] = f.nil? ? 0 : f[0]
  12.   end
  13. end
  14. class Interpreter
  15.   def 区域设置(*ary)
  16.     ($game_player.tag_set(nil)) if ary[0] == nil
  17.     $game_player.tag_set(ary)
  18.   end
  19. end


每个区域都要写一串代码太麻烦了,  就附赠你一个直接设置的方法吧, 把它复制到上面那个脚本之下(记得把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; 就可以了, 比用变量方便, 缺点是需要你会用这个脚本



回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
8 小时
注册时间
2022-10-7
帖子
5
8
 楼主| 发表于 4 天前 | 只看该作者
灯笼菜刀王 发表于 2025-10-27 10:29
栗子, 比如你想要  A区域出现 幽灵 , B区域出现 丧尸,  那, 在数据库建两个敌群, 起名为  ”【0】幽灵“  ...

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

使用道具 举报

Lv4.逐梦者

梦石
2
星屑
13435
在线时间
2295 小时
注册时间
2011-6-4
帖子
623
9
发表于 3 天前 | 只看该作者
本帖最后由 真·可乐 于 2025-10-28 12:07 编辑

写过一个类似的,范围暗雷遇敌。
RUBY 代码复制
  1. #范围暗雷遇敌
  2. #2018/10/5 By真可乐
  3. #配置步骤
  4. #创建配置事件
  5.   # 在地图上放置一个事件
  6.   # 事件名称设置为:/encounter_list
  7.   #  在事件的第一页中,选择“注释”命令
  8.   #  在注释框中输入配置信息
  9.   #  每行一个敌群区域配置
  10.   #  支持多个敌群在不同区域同时生效
  11.   #
  12.   # 例子 ,在地图的x坐标2到12,y坐标3到13区域内遇到敌群15,t[15]r[2,12,3,13]
  13. #======================================================================================================================================================
  14. module RangEncounter
  15.   RANG_EC = 46 #几号开关控制范围暗雷遇敌开启,默认设置为46号
  16. end
  17.  
  18. class Game_Event
  19.   attr_reader    :event
  20. end
  21.  
  22. class Rang_Troop #范围遇敌队伍
  23.   attr_reader       :troop_id
  24.   attr_reader       :xmax
  25.   attr_reader       :xmin
  26.   attr_reader       :ymax
  27.   attr_reader       :ymin
  28. def initialize(troop_id,xmin,xmax,ymin,ymax)
  29.    @troop_id = troop_id ; @xmax = xmax ; @xmin = xmin ; @ymax = ymax ;@ymin = ymin
  30. end
  31. end
  32.  
  33. class Game_Map
  34.   #--------------------------------------------------------------------------
  35.   # * 先阉掉原来的遇敌
  36.   #--------------------------------------------------------------------------
  37.   def encounter_list
  38.     return ($game_switches[RangEncounter::RANG_EC] ? [] : @map.encounter_list)
  39.   end
  40.  
  41.   alias setup_zcl20181005 setup
  42.   def setup(map_id)
  43.     setup_zcl20181005(map_id)
  44.     @encounter_list_range = Array.new
  45.     @events.values.each do |ev|
  46.       if ev.event.name == "/encounter_list"
  47.  
  48.         @encounter_list_range = get_troop(ev)
  49.         #以检索到的首个为准
  50.         break
  51.  
  52.       end
  53.     end
  54.   end
  55.  
  56.   def get_troop(ev)
  57.     return [] unless ev.is_a?(Game_Event)
  58.      return [] if ev.list.nil?
  59.      encounter = []
  60.        for i in 0...ev.list.size  
  61.          next if ev.list[i].code != 108
  62.           pa = ev.list[i].parameters[0]  
  63.           /(t\[(.*)\])/ =~ pa
  64.           next if $1.nil?
  65.           troop =  $1.delete("t[").delete("]").to_i unless $1.nil?
  66.            /(r\[(.*)\,(.*)\,(.*)\,(.*)\])/ =~ pa
  67.          # rang = [$2.to_i,$3.to_i,$4.to_i,$5.to_i]
  68.          next if $1.nil? or  $2.nil? or $3.nil? or $4.nil? or $5.nil?
  69.  
  70.           encounter.push(Rang_Troop.new(troop,$2.to_i,$3.to_i,$4.to_i,$5.to_i))
  71.  
  72.  
  73.        end
  74.      return  encounter
  75.    end
  76.   #--------------------------------------------------------------------------
  77.   # * 再定义一个新的遇敌列表
  78.   #--------------------------------------------------------------------------   
  79.     def encounter_list_range
  80.      return @encounter_list_range
  81.     end
  82. end
  83.  
  84. class Scene_Map
  85.   alias update_zcl20181005 update
  86.   def update
  87.     update_zcl20181005
  88.  
  89.       # If encounter list isn't empty, and encounter count is 0
  90.     if $game_player.encounter_count == 0 and $game_map.encounter_list_range != [] and $game_switches[RangEncounter::RANG_EC]
  91.       # If event is running or encounter is not forbidden
  92.       unless $game_system.map_interpreter.running? or
  93.              $game_system.encounter_disabled or
  94.              (tr = confirm_troop).nil?
  95.  
  96.  
  97.         troop_id = tr.troop_id
  98.         # If troop is valid
  99.         if $data_troops[troop_id] != nil
  100.           # Set battle calling flag
  101.           $game_temp.battle_calling = true
  102.           $game_temp.battle_troop_id = troop_id
  103.           $game_temp.battle_can_escape = true
  104.           $game_temp.battle_can_lose = false
  105.           $game_temp.battle_proc = nil
  106.         end
  107.       end
  108.     end
  109.   end
  110.  
  111.   def confirm_troop
  112.      p_x = $game_player.x
  113.       p_y = $game_player.y
  114.       str = Array.new
  115.     $game_map.encounter_list_range.each do |tr|
  116.       next unless tr.is_a?(Rang_Troop)
  117.         if p_x >= tr.xmin and p_x <= tr.xmax and p_y >= tr.ymin and p_y <= tr.ymax
  118.  
  119.           str.push(tr)
  120.         end
  121.       end
  122.       return nil if str.empty?
  123.       return str[rand(str.size)]
  124.     end
  125. end
BUG反馈请加QQ 529283039
水友群 917854767

回复 支持 1 反对 0

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
110
在线时间
8 小时
注册时间
2022-10-7
帖子
5
10
 楼主| 发表于 3 天前 | 只看该作者
真·可乐 发表于 2025-10-28 12:01
写过一个类似的,范围暗雷遇敌。
#范围暗雷遇敌
#2018/10/5 By真可乐

你这头像比较牛B
回复 支持 反对

使用道具 举报

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

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-10-31 23:51

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表