Project1

标题: 同一地图既有并行处理移动又有移动事件会有时卡一段 [打印本页]

作者: 89444640    时间: 2017-1-11 15:51
标题: 同一地图既有并行处理移动又有移动事件会有时卡一段
如例所示
Project3.rar (187.35 KB, 下载次数: 64)
在地图中存在并行处理的复杂移动事件
然后在与其他npc对话 npc执行移动等待之类时候,会出现卡住一小段时间,感觉应该是并行处理的等待与执行当前事件移动的等待冲突了吧?
这个有方法解决吗?或者一个地图只能有一个并行处理的移动事件?

作者: Mr.Jin    时间: 2017-1-11 21:29
本帖最后由 Mr.Jin 于 2017-1-11 21:31 编辑

RUBY 代码复制
  1. class Interpreter
  2.   def update
  3.     # 初始化循环计数
  4.     @loop_count = 0
  5.     # 循环
  6.     loop do
  7.       # 循环计数加 1
  8.       @loop_count += 1
  9.       # 如果执行了 100 个事件指令
  10.       if @loop_count > 100
  11.         # 为了防止系统崩溃、调用 Graphics.update
  12.         Graphics.update
  13.         @loop_count = 0
  14.       end
  15.       # 如果地图与事件启动有差异
  16.       if $game_map.map_id != @map_id
  17.         # 事件 ID 设置为 0
  18.         @event_id = 0
  19.       end
  20.       # 子注释器存在的情况下
  21.       if @child_interpreter != nil
  22.         # 刷新子注释器
  23.         @child_interpreter.update
  24.         # 子注释器执行结束的情况下
  25.         unless @child_interpreter.running?
  26.           # 删除字注释器
  27.           @child_interpreter = nil
  28.         end
  29.         # 如果子注释器还存在
  30.         if @child_interpreter != nil
  31.           return
  32.         end
  33.       end
  34.       # 信息结束待机的情况下
  35.       if @message_waiting
  36.         return
  37.       end
  38.       # 移动结束待机的情况下
  39.       if @moving_character != nil           # 等待移动结束
  40.         if @moving_character.move_route_forcing
  41.           return
  42.         end
  43.         @moving_character = nil
  44.       end
  45.       # 输入按钮待机中的情况下
  46.       if @button_input_variable_id > 0
  47.         # 执行按钮输入处理
  48.         input_button
  49.         return
  50.       end
  51.       # 等待中的情况下
  52.       if @wait_count > 0
  53.         # 减少等待计数
  54.         @wait_count -= 1
  55.         return
  56.       end
  57.       # 如果被强制行动的战斗者存在
  58.       if $game_temp.forcing_battler != nil
  59.         return
  60.       end
  61.       # 如果各画面的调用标志已经被设置
  62.       if $game_temp.battle_calling or
  63.          $game_temp.shop_calling or
  64.          $game_temp.name_calling or
  65.          $game_temp.menu_calling or
  66.          $game_temp.save_calling or
  67.          $game_temp.gameover
  68.         return
  69.       end
  70.       # 执行内容列表为空的情况下
  71.       if @list == nil
  72.         # 主地图事件的情况下
  73.         if @main
  74.           # 设置启动中的事件
  75.           setup_starting_event
  76.         end
  77.         # 什么都没有设置的情况下
  78.         if @list == nil
  79.           return
  80.         end
  81.       end
  82.       # 尝试执行事件列表、返回值为 false 的情况下
  83.       if execute_command == false
  84.         return
  85.       end
  86.       # 推进索引
  87.       @index += 1
  88.     end
  89.   end
  90.   def command_209
  91.     # 获取角色
  92.     @character = get_character(@parameters[0])
  93.     # 角色不存在的情况下
  94.     if @character == nil
  95.       # 继续
  96.       return true
  97.     end
  98.     # 强制移动路线
  99.     @character.force_move_route(@parameters[1])
  100.     # 继续
  101.     return true
  102.   end
  103.   def command_210
  104.     # 如果不在战斗中
  105.     unless $game_temp.in_battle
  106.       @moving_character = @character
  107.     end
  108.     # 继续
  109.     return true
  110.   end
  111. end


RGSS1对Interpreter的设计还不是很成熟,
我按照RGSS2的写法做了一些修改,
你可以粘贴到原工程的Main脚本页上方试一试。

也可以直接下载这个工程:
Project3改.zip (202.28 KB, 下载次数: 75)




作者: 89444640    时间: 2017-1-12 08:16
本帖最后由 89444640 于 2019-9-20 10:30 编辑

非常感谢,导入工程测试也正常。
希望不会产生冲突~

20190920补充:自我提醒作用
使用本脚本后,会造成有多个事件或者npc移动时候,等待移动结束以最靠近等待移动结束的事件为基准进行等待,而不是默认的以移动最长的事件进行等待,
因此就是说:

#等待移动结束是以"最后的移动事件" 为基准
#有多个移动路线的情况,把续时间最长的放在最下面

只要不是只有一个npc在执行动作,一定要注意让时间最长的在下面,否则需要进行麻烦的测试,然后再最后一个事件补上等待XX帧。




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