Project1

标题: 是设置问题吗?用事件做一个油灯但无法正常关灯。 [打印本页]

作者: 崭翼    时间: 2018-4-5 18:25
标题: 是设置问题吗?用事件做一个油灯但无法正常关灯。
请前辈指教一下原因!












应该不需要发工程吧…?
………问题出在哪里呢?


光环.png (33.44 KB, 下载次数: 53)

这一张是光环图片

这一张是光环图片

作者: 文雅夕露    时间: 2018-4-5 18:57
公共事件2请设置为并行处理。
不然正常条件之下不调用的话是无法自动自行的...
公共事件1无需设置为并行处理。
作者: gforce    时间: 2018-4-5 19:08
公共事件2,开关操作跟消除图片之间等数帧试试
確保公共事件1是真的不在运作中。
作者: 崭翼    时间: 2018-4-5 19:21
文雅夕露 发表于 2018-4-5 18:57
公共事件2请设置为并行处理。
不然正常条件之下不调用的话是无法自动自行的...
公共事件1无需设置为并行处 ...

谢谢0 0
不过事件1不并行的话似乎会走得很慢……事件2并行啊……思考
作者: 崭翼    时间: 2018-4-5 19:34
gforce 发表于 2018-4-5 19:08
公共事件2,开关操作跟消除图片之间等数帧试试
確保公共事件1是真的不在运作中。 ...

……没有办法的连帖……
谢谢前辈。
做事件时不知道应该在哪里添加等待帧…
作者: 刀光渴    时间: 2018-4-5 20:03
崭翼 发表于 2018-4-5 19:34
……没有办法的连帖……
谢谢前辈。
做事件时不知道应该在哪里添加等待帧… ...

实在找不出错误的话,可以在每个地方加一句文本,看看文本是否输出就行了
过于流畅也是影响游戏体验的,适当的等待还是必要的
作者: 百里_飞柳    时间: 2018-4-5 22:55
在事件1最后加个 如果开关21被关闭,就消除图片1
并行公共事件的执行时机很迷幻。并不是条件不满足就立刻停止,有可能会多执行一次
作者: 崭翼    时间: 2018-4-6 00:20
本帖最后由 崭翼 于 2018-4-6 16:44 编辑
百里_飞柳 发表于 2018-4-5 22:55
在事件1最后加个 如果开关21被关闭,就消除图片1
并行公共事件的执行时机很迷幻。并不是条件不满足就立刻停 ...


是的……这也是让人困惑的问题,不符合条件以后并行公共事件是怎样地停止……
不过按鹰大所说在事件1后面加分支好像也无效了…因为开关关闭的话大概就不再往下执行……
作者: shencao    时间: 2018-4-6 04:17
本帖最后由 shencao 于 2018-4-6 04:42 编辑

你在【002 开灯】最后加个“等待1帧”就可以了。
等待1帧效果就是之前的命令执行完毕,停1帧,再执行之后的。
这里我加在最后是想确保开灯事件一次执行完,放在消除图片1后应该也可以吧,放在关闭开关后大概也可以(后两种情况我没测试)。
rm事件执行顺序有点迷的,并行可能不知道哪里的几行命令在同时执行,并不懂。如果发生了奇怪的bug可以加上试试,反正1帧肉眼也分辨不出。

另外如果是按照我自己的思路,事件我会这么写:
【油灯光】get玩家坐标,移动图片(移动时间1帧,等待移动结束/不等待移动结束我测试的时候都OK)
【开灯】如果开关开启:消除图片,关闭开关;否则:get玩家坐标,显示图片,开启开关。
功能分开就不会出现一个事件消除图片另一个事件显示图片两个事件打架的情况了,(效果大概没差)供参考啦~
作者: 百里_飞柳    时间: 2018-4-6 10:31
本帖最后由 百里_飞柳 于 2018-4-6 10:43 编辑

那真的是很神秘的bug了
按照你的事件编写,触发物品效果(关灯)前后的脚本逻辑是:
第一帧(使用物品前,依旧在地图中):是否需要刷新普通事件、并行公共事件的当前激活状态(否)→预定调用的公共事件更新一帧(无)→普通事件全部更新一帧(忽略)→在上一帧判定为激活(满足了触发条件)的并行公共事件按照序号依次更新一帧(更新灯光公共事件)
第二帧(使用物品后,从菜单返回地图):是否需要刷新事件激活状态(否)→预定调用的公共事件更新一帧(关灯公共事件启动,因为其中无挂起指令(如等待n帧),可直接更新完;开关关闭,预定下一帧需要刷新事件激活状态;但本事件的解释器要到下一帧时才会被清除,因此原本此处也有的刷新事件激活状态也被跳过※)→普通事件更新(忽略)→公共事件更新(还未被刷新激活状态,公共事件仍然被调用了一次,此时图片又显示出来)
※ 原因解释
  1. class Game_Interpreter
  2.   #--------------------------------------------------------------------------
  3.   # ● 执行
  4.   #--------------------------------------------------------------------------
  5.   def run
  6.     wait_for_message
  7.     while @list[@index] do
  8.       execute_command
  9.       @index += 1
  10.     end
  11.     Fiber.yield # 此处使得事件结束时不会自己清除,而需要等待到下一帧再刷新时清除(原因:使自动执行的事件能够挂起玩家的移动更新等)
  12.     @fiber = nil
  13.   end
  14. end
复制代码

第三帧:是否需要刷新事件激活状态(是,直接删去不满足条件的公共事件的更新)→预定公共事件的更新(无)→普通事件全部更新一帧(忽略)→并行公共事件按照序号更新一帧(无)

推了很多次都是这样的结果,你可以试试在第一个公共事件的首行or末行增加 等待1帧,错开它们更新的时机?
作者: 崭翼    时间: 2018-4-6 16:33
本帖最后由 崭翼 于 2018-4-6 16:52 编辑
百里_飞柳 发表于 2018-4-6 10:31
那真的是很神秘的bug了
按照你的事件编写,触发物品效果(关灯)前后的脚本逻辑是:
第一帧(使用物品前, ...


用力地看了好几遍
总之是不是可以理解成,系统为了【挂起】其他可能的事件操作而需要留一点“空隙”……(虽然不知挂起指令是什么,瞎猜是像挂钩衔接一样把程序放到后台且不结束)
总之这一点是需要加等待的核心原因了吧……
------------------------------
测试了一下,等待1帧分别放在公共事件1开头、末尾以及公共事件2各处……只有放在开关关闭和图片消除之间才能完全解决。
另外“没有正常关灯”的状况其实是,图片不会随玩家移动而移动 , 但图片不消失。看来就是开关关了,公共事件1停止,  一定是"图片消除"没有执行。(早该发现!!)
作者: 浮云OvO    时间: 2018-4-18 23:54
把油灯使用效果改成公共事件1就行
公共事件1 正常处理
公共事件2 并行处理
这样就行了




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