查看: 3121|回复: 11

[已经解决] 如何实现事件触发后暂时消失,此后又能批量复原

[复制链接]
梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

发表于 2022-4-21 11:46:30 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 纯属小虫 于 2022-4-22 16:16 编辑

想制作一个像黑魂那样,坐火之后会复原所有怪物的系统。
现有的《暂时消除事件》只要过了地图就会重新刷新
用《独立开关》不便于批量重新打开
用《普通开关》的话,量太大了,而且不大好控制

有没有什么办法,在事件末尾加上  《指令A》  ,让它暂时消失,并储存(记录)在《暂时消失库》里
然后要唤出这些消失库的事件时,执行  《指令B》  就能实现重新打开这一批事件?


篝火刷怪工程文件:
https://rpg.blue/forum.php?mod=attachment&aid=Mzg4MzkyfDA2N2QzNGFmfDE3OTA4NDk5NjZ8MHw%3D

[fold=已解决——]
[pre lang="ruby"]# 会刷新的事件的名称中,加上“[刷怪]”
# 触发事件后,用打开独立开关D使其消失
# $game_self_switches.refresh_enemy    在篝火处使用这个指令,能把带“[刷怪]”的事件的独立开关D全部关闭
class Interpreter
  def command_123
    if @event_id > 0
      # 判断执行独立开关时,选的是不是ON
      a = (@parameters[1] == 0)
      # 如果打开独立开关D;且时间名称含有“[刷怪]” ; a = “ref”
      if a and @parameters[0] == "D" and $game_map.events[
      @event_id].instance_variable_get(:@event).name.include?("[刷怪]")
        a = "ref"
      end
      # 正常的独立开关操作↓
      key = [$game_map.map_id, @event_id,@parameters[0]]
      # 如果不符合上面条件,就是普通的独立开关操作;如果满足,则这个变量值会变成“ref”
      $game_self_switches[key] = a
    end
    $game_map.need_refresh = true
    return true
  end
end
  
class Game_SelfSwitches
# 这里是基于独立开关定义类的修改
# 获取独立开关(跟原版一样)
  def [](key)
    return @data[key] ? true : false
  end
  # 定义做篝火的方法,删除含有“ref”的开关
  def refresh_enemy
    @data.delete_if{|a,b|b=="ref"}
    $game_map.need_refresh = true
  end
end[/pre][/fold]
梦石
8
星屑
4153
在线时间
656 小时
注册时间
2021-8-13
回帖
629

极短26参与极短25获奖

发表于 2022-4-21 12:22:26 | 显示全部楼层
本帖最后由 asukalin 于 2022-4-21 12:30 编辑

我能想到最简单的做法,还是在篝火处批量关闭《普通开关》

2022-04-21.png

开始项目时预留1到100号开关专门用来标记,就不怕出错。
如果100个都用完了就再预留100个,例如501到600号开关。
回复

使用道具 举报

梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

 楼主| 发表于 2022-4-21 15:00:47 | 显示全部楼层
asukalin 发表于 2022-4-21 12:22
我能想到最简单的做法,还是在篝火处批量关闭《普通开关》

嗯嗯,这个方式是可以实现目的的,不过操作起来还是有些复杂。
比如如果制作了两个相同的敌人,就没法通过直接复制事件的方式编辑,而是复制了还要修改事件的末处理开关以及事件自身开关,会多两个步骤。
此外,还有可能记错或忘记自己的开关标记到哪个号了
回复

使用道具 举报

梦石
0
星屑
42235
在线时间
6017 小时
注册时间
2006-11-10
回帖
6966
发表于 2022-4-21 18:12:20 | 显示全部楼层
本帖最后由 灯笼菜刀王 于 2022-4-22 15:14 编辑
  1. class Interpreter
  2.   def command_123
  3.     if @event_id > 0
  4.       a = (@parameters[1] == 0)
  5.       if a and @parameters[0] == "D" and $game_map.events[
  6.       @event_id].instance_variable_get(:@event).name.include?("[刷怪]")
  7.         a = "ref"
  8.       end
  9.       key = [$game_map.map_id, @event_id,@parameters[0]]
  10.       $game_self_switches[key] = a
  11.     end
  12.     $game_map.need_refresh = true
  13.     return true
  14.   end
  15. end

  16. class Game_SelfSwitches
  17.   def [](key)
  18.     return @data[key] ? true : false
  19.   end
  20.   def refresh_enemy
  21.     @data.delete_if{|a,b|b=="ref"}
  22.   end
  23. end
复制代码


塞到main前试试

然后  $game_self_switches.refresh_enemy  用这个命令, 可以把"所有名字里带有 [刷怪] 的事件的独立开关D关闭"

没测试, 应该不会出BUG吧

点评

因为XP的F1里没有 delete_if, 怕ruby1.0没这方法=.=  发表于 2022-4-22 15:11
考虑执行性能,应该用Hash#delete_if  发表于 2022-4-22 14:09

评分

参与人数 1星屑 +100 赞 +1 收起 理由
RyanBern + 100 + 1 认可答案

查看全部评分

回复 1 0

使用道具 举报

梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

 楼主| 发表于 2022-4-22 12:15:11 | 显示全部楼层
本帖最后由 纯属小虫 于 2022-4-22 16:12 编辑
灯笼菜刀王 发表于 2022-4-21 18:12
塞到main前试试

然后  $game_self_switches.refresh_enemy  用这个命令, 可以把"所有名字里带有 [刷怪]  ...


稍微解读了一下,感觉思路好棒,使用起来应该也很灵活
不过刚才实机测试了一下,$game_self_switches.refresh_enemy 那个命令木有反应
盲猜可能是23行不能用“delete”?
我把工程附件发头上了,还请指教一下






可以的,更新之后能够实现了,不过还有个小缺陷,当篝火跟怪物在同一个图的时候没法即时刷新,得换图

我在 @data.delete_if{|a,b|b=="ref"} 后面加上了 $game_map.need_refresh = true 就可以了~~~
感谢前辈的帮助

[fold=修正后的代码(顶楼工程文件已经更新)][pre lang="ruby"]# 会刷新的事件的名称中,加上“[刷怪]”
# 触发事件后,用打开独立开关D使其消失
# $game_self_switches.refresh_enemy    在篝火处使用这个指令,能把带“[刷怪]”的事件的独立开关D全部关闭
class Interpreter
  def command_123
    if @event_id > 0
      # 判断执行独立开关时,选的是不是ON
      a = (@parameters[1] == 0)
      # 如果打开独立开关D;且时间名称含有“[刷怪]” ; a = “ref”
      if a and @parameters[0] == "D" and $game_map.events[
      @event_id].instance_variable_get(:@event).name.include?("[刷怪]")
        a = "ref"
      end
      # 正常的独立开关操作↓
      key = [$game_map.map_id, @event_id,@parameters[0]]
      # 如果不符合上面条件,就是普通的独立开关操作;如果满足,则这个变量值会变成“ref”
      $game_self_switches[key] = a
    end
    $game_map.need_refresh = true
    return true
  end
end
  
class Game_SelfSwitches
# 这里是基于独立开关定义类的修改
# 获取独立开关(跟原版一样)
  def [](key)
    return @data[key] ? true : false
  end
  # 定义做篝火的方法,删除含有“ref”的开关
  def refresh_enemy
    @data.delete_if{|a,b|b=="ref"}
    $game_map.need_refresh = true
  end
end[/pre][/fold]

点评

俄, 应该是 delete(i[0]) ,不过加菲兄说可以用delete_if, 那用这个效率点, 更新了下,试试吧  发表于 2022-4-22 15:13

评分

参与人数 1星屑 +20 收起 理由
RyanBern + 20 我很赞同

查看全部评分

回复

使用道具 举报

梦石
0
星屑
35248
在线时间
4171 小时
注册时间
2007-12-15
回帖
9489
发表于 2022-4-22 16:54:41 | 显示全部楼层
我觉得明雷加上战斗胜利暂时消除事件,坐篝火用临时变量1、2记录篝火x,y坐标,黑屏播放me,随便跳转一个空白地图再回到刚才的坐标,系统自动就刷新暂时消除的所有事件了,这样更绿色。

点评

妙啊  发表于 2022-4-22 17:19
回复

使用道具 举报

梦石
24
星屑
8942
在线时间
248 小时
注册时间
2020-12-4
回帖
259

极短24获奖极短23获奖极短22获奖

 楼主| 发表于 2022-4-22 17:25:24 | 显示全部楼层
89444640 发表于 2022-4-22 16:54
我觉得明雷加上战斗胜利暂时消除事件,坐篝火用临时变量1、2记录篝火x,y坐标,黑屏播放me,随便跳转一个空 ...

hhhh~黑屏播放ME很带感~~~

嘛~~不过,做这个的意义,其实是为了换图不会刷新事件,只有坐火才会刷新事件。
应用场景有点像DNF打怪这种副本,在副本内杀掉的怪不会刷新(即使换图也不会),而重新进图之后,各种怪物和资源会重置~~这样一来副本就可以方便重复挑战了~~

点评

哦明白了,这样可以避免换图来回自动刷新造成麻烦,也是个不错的方法  发表于 2022-4-23 05:32
回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部