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

Project1

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

[已经解决] 同一地图既有并行处理移动又有移动事件会有时卡一段

[复制链接]

Lv5.捕梦者

梦石
0
星屑
35138
在线时间
4164 小时
注册时间
2007-12-15
帖子
10061
跳转到指定楼层
1
发表于 2017-1-11 15:51:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

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

Lv4.逐梦者

梦石
0
星屑
9707
在线时间
3226 小时
注册时间
2011-3-24
帖子
739

开拓者

2
发表于 2017-1-11 21:29:06 | 只看该作者
本帖最后由 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)



评分

参与人数 2星屑 +220 梦石 +1 收起 理由
RyanBern + 100 + 1 认可答案
89444640 + 120 解决了~非常感谢

查看全部评分

>>→Lanza Games 2020←<<
Lanza Schneider
浪子心,孤星梦永远流浪……
~不会放弃,我的精力永远充沛~
>>>>>Lanza Adventure<<<<<
>>>>>Lanza的新年派对!<<<<<
>>>>>Lanza的口袋心脏病!<<<<<
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
35138
在线时间
4164 小时
注册时间
2007-12-15
帖子
10061
3
 楼主| 发表于 2017-1-12 08:16:41 | 只看该作者
本帖最后由 89444640 于 2019-9-20 10:30 编辑

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

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

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

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-9-21 22:31

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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