Project1

标题: 有办法判定是哪个事件打开了开关吗 [打印本页]

作者: 风雨流盼    时间: 2021-2-5 00:04
标题: 有办法判定是哪个事件打开了开关吗
比方我让一个事件打开了1号开关,触发了公共事件的并行处理,

如果我想让打开1号开关的事件显示动画要怎么做呢
作者: KB.Driver    时间: 2021-2-5 00:31
可以做一个反馈(callback)机制。

思路是这样的:
在Game_Interpreter中找到开关操作的command,
在这里猴子补丁一下,判断操作的开关是否在CALLBACK_LIST这个哈希表中有设置反馈的公共事件编号。
假如有,则当场在Game_Interpreter实例中触发公共事件,这里具体怎么写可以参考Game_Interpreter自身实现。

时间有限,仅提供一个思路,看看有没有热心坛友实现一下。

作者: alexncf125    时间: 2021-2-5 00:47
本帖最后由 alexncf125 于 2021-2-5 15:48 编辑
  1. class Game_Interpreter
  2.   alias show_animation_command_121 command_121          #別名
  3.   def command_121
  4.     show_animation_command_121                    #呼叫原方法
  5.     (@params[0]..@params[1]).each do |i|          #遍历被操作的开关
  6.       character = get_character(0)          #character获取本事件
  7.       if character && i == 1 && @params[2] == 0          #如果character(本事件)不为nil, 並当 "开关的ID是1" 及 "是在打开开关" 时
  8.         character.animation_id = 1          #在character(本事件)上播放动画
  9. #~           Fiber.yield while character.animation_id > 0
  10.       end
  11.     end
  12.   end
  13. end
复制代码

作者: 怕鼠的猫    时间: 2021-2-5 07:59
还是尽量养成好的编程习惯。 如果事件中可能触碰到开关,就在事件名称中留个记号。例如 “事件1: switch01”。   
另一方面,在触发开关之前,如果有必要,就把事件id保留到某个变量中,便于公共事件了解 调用者是谁。 例如 “set 变量100(调用者)= 1” 。

顺便说一句:使用 “调用公共事件” 这个命令的时候,动画效果可以针对当前事件的。而且是立即执行。  如果你调整了开关再去触发公共事件,那要等你现在的命令表都执行完了才会执行,而且公共事件就不知道谁是调用者了,所谓“当前事件”就没法用了。   这都是很常用的知识。
作者: 风雨流盼    时间: 2021-2-5 14:03
alexncf125 发表于 2021-2-5 00:47

感谢,就是看不太懂,

还有想要多添加几个开关要在哪改呢
作者: 风雨流盼    时间: 2021-2-5 15:30
alexncf125 发表于 2021-2-5 00:47

有点懂了,但这样开关打开时只能播放指定的动画,

我想让事件在不同条件下会出现不同的效果,所以放在公共事件里,用并行处理和条件分歧做

其实现在遇到公共事件里本事件“显示动画”的时候不会显示

简单说就是想让打开开关的事件被锁定,让并行处理的公共事件可以知道是这个事件

貌似这段脚本有点接近了
作者: soulsaga    时间: 2021-2-5 16:02
不用开关用变量记录就好..?
作者: alexncf125    时间: 2021-2-5 16:16
本帖最后由 alexncf125 于 2021-2-5 17:56 编辑
风雨流盼 发表于 2021-2-5 15:30
有点懂了,但这样开关打开时只能播放指定的动画,

我想让事件在不同条件下会出现不同的效果,所以放在公 ...


喔...
我3L的脚本旨在达成「让打开1号开关的事件即时显示一特定动画」...
所以你现在6L说的情況我就不懂了...

或许是把3L脚本中的character.animation_id = 1换成
$game_variables[1] = character.id          #1号变量代入character(本事件)的事件编号

之后在公共事件用
if $game_variables[1] > 0          #可以用事件指令代替, 条件分歧 - 1号变量>0时
  $game_map.events[$game_variables[1]].animation_id = 动画ID          #不可用事件指令代替, 此句的意思为:当前地图的x(1号变量)号事件, 播放y(动画ID)号动画
  $game_variables[1] = 0          #可以用事件指令代替, 变量操作 - 1号变量代入0
end

作者: 风雨流盼    时间: 2021-2-5 17:27
alexncf125 发表于 2021-2-5 16:16
喔...
我3L的脚本旨在达成「让打开1号开关的事件即时显示一特定动画」...
所以你现在6L说的情況我就不懂 ...

可以了,不过怎么做第二个呢,我试着自己改了下结果动画显示在第一个事件上
作者: soulsaga    时间: 2021-2-5 18:09
某事件变量操作=某事件ID..然后播放该变量的动画..
作者: soulsaga    时间: 2021-2-5 19:27
本帖最后由 soulsaga 于 2021-2-5 19:35 编辑

RUBY 代码复制
  1. #--------------------------------------------------------------------------
  2.   # ● 操作开关
  3.   #--------------------------------------------------------------------------
  4.   def command_121
  5.     (@params[0]..@params[1]).each do |i|
  6.       $game_switches[i] = (@params[2] == 0)
  7.       character = get_character(0)
  8.       if character && @params[2] == 0
  9.       case i
  10.       when 1
  11.       character.animation_id = 1
  12.       when 2
  13.       character.animation_id = 2
  14.       when 3
  15.       character.animation_id = 3
  16.       when 4
  17.       character.animation_id = 4
  18.       when 5
  19.       character.animation_id = 5
  20.       end
  21.     end
  22. end
  23.   end

作者: 风雨流盼    时间: 2021-2-5 22:26
感谢大家了,把两个脚本结合起来就能有想要的效果了




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1