Project1

标题: [已解决]脚本怎么写等待按键后执行和循环等待指定时间。 [打印本页]

作者: miantouchi    时间: 2020-8-1 20:13
标题: [已解决]脚本怎么写等待按键后执行和循环等待指定时间。
本帖最后由 miantouchi 于 2020-8-2 21:01 编辑

两个问题。
打个比方,问题1.
第一部分
if Input.press?(Input::C)
  do_something
end
第二部分

脚本执行顺序是第一部分,这时候会卡住,只有玩家输入C后,才继续运行第二部分。

问题2:
另外一个问题是
第一部分
等待 60s
第二部分

脚本执行顺序是第一部分,这时候会等待玩家定义指定的实际,才继续运行第二部分。
第一部分
    # 等待中的情况下
     @wait_count =60
    if @wait_count > 0
      # 减少等待计数
      @wait_count -= 1
      return
    end
第二部分

我自己写的,我还不想让他return,就是想让他返回到if上面在继续执行


作者: 灯笼菜刀王    时间: 2020-8-1 20:35
本帖最后由 灯笼菜刀王 于 2020-8-1 20:38 编辑

答案很简单,  你把第二部分放到if end 里就好了

栗子


def 第二部分
   该干嘛干嘛
end

def update
   if Input.press?(Input::C)
       第二部分
   end
   @wait_count -= 1 if @wait_count > 0
   if @wait_count == 1
      第二部分
      @wait_count -= 1
   end
end


作者: miantouchi    时间: 2020-8-1 21:22
本帖最后由 miantouchi 于 2020-8-1 21:24 编辑
灯笼菜刀王 发表于 2020-8-1 20:35
答案很简单,  你把第二部分放到if end 里就好了

栗子


直接上图吧,就是进入战斗界面后,显示左上角的消息内容。

我想要两种效果,一种是卡在这里,然后等待玩家输入空格,再往下进行

另外一种就是,显示足够的时间,自动往下进行。

因为现在的情况是,进入战斗一扫而过,玩家来不及看完左上角的字,所以我就想加点延迟或者卡住玩家自己确认。

我看你给的代码是update,但是我在def start_phase1这里面,能拆出来吗?

1.png (20.36 KB, 下载次数: 7)

1.png

2.png (53.04 KB, 下载次数: 6)

2.png

作者: 灯笼菜刀王    时间: 2020-8-1 22:19
本帖最后由 灯笼菜刀王 于 2020-8-1 22:34 编辑

脚本和事件执行情况不太一样的哦

事件是有index逐条运行的, 而脚本是一瞬间执行全部可执行的内容的。

而各种即时判定,主动等待等,都是通过循环执行某段脚本(通常就是update的方法)来达到的

所以你的写法有根本上的逻辑错误

scene battle的脚本运行原理你应该知道吧, 它是通过 @phase 来分歧各个阶段的循环, 我把这种通过某个变量控制每个阶段进行不同的循环过程叫做"流程"

而 phase4 还有自己的小流程, 是通过 @phase4_step 来分歧的

update具体是怎么工作的呢?

战斗开始的时候, 在main的主循环loop do之前,调用了start_phase1, 这个方法把 @phase = 1 , 看scene battle1 的updete, 可以发现通过 @phase的分歧,这个时候是开始循环 update_phase1 的内容, update_phase1 很简单, 就是判断是否达成胜负条件, 达成后中断处理,进入胜负处理环节, 没达成的话, 就调用 start_phase2

然后start_phase2这个方法, 把@phase = 2, 这样就开始循环 update_phase2 的方法, 同时 start_phase2 还打开了战斗/逃跑窗口, 而 update_phase2 里,把跳到别的阶段的方法放在按键分歧里, 这个时候,因为@phase == 2, 所以它是一直被循环执行的, 但是没有按键的话,就会一直不满足跳出条件,从而在这个阶段持续循环

当玩家按下C键,满足了条件,根据@party_command_window的index分支,调用start_phase3或者update_phase2_escape, 这个时候就进入了新的循环("流程前进")


好了,原理说完, 如果能理解的话, 可以在scene battle里搜索 @help_window.set_text 这句, 这句是显示HELP窗口,并刷新设置的文字, 然后搜索 @help_window.visible = false 这句是隐藏HELP窗口, 思考下,HELP窗口是怎么做到"自动出现,自动消失, 而且不会一闪而过让人家看不清楚"

最后,回到主题, 你想要的效果, 1就是"战斗/逃跑"的方法,  2就是HELP窗口的方法, 试试吧


--------
PS: 其实用战斗事件也可以做到你要的效果,而且不用改动默认流程, 更绿色的哦, 笑



作者: 芯☆淡茹水    时间: 2020-8-2 08:16
def update
   if 信息显示中
       if Input.press?(Input::C)
           结束信息显示
      end
      return
   end
   刷新其他的
end
作者: miantouchi    时间: 2020-8-2 13:34
本帖最后由 miantouchi 于 2020-8-2 13:36 编辑
灯笼菜刀王 发表于 2020-8-1 22:19
脚本和事件执行情况不太一样的哦

事件是有index逐条运行的, 而脚本是一瞬间执行全部可执行的内 ...


第一个问题解决了
def update_phase2方法里面加上按键判断就好了。
第二个问题,经过你的提示
  def phase3_setup_command_window
    # 同伴指令窗口无效化
    @party_command_window.active = false
    @party_command_window.visible = false
    # 角色指令窗口无效化
    @actor_command_window.active = true
    @actor_command_window.visible = true
    #隐藏消息窗口
    @inf_window.visible = false #2020.8.1窗口指令出现时,隐藏消息内容
    # 设置角色指令窗口的位置
    @actor_command_window.x = 0 #@actor_index * 160 人物指令光标位置
    # 设置索引为 0
    @actor_command_window.index = 0
  end
我的原代码就是到这个步骤的时候,隐藏消息窗口,显示指令窗口,如果再往后移不知道会咋样,如果后移的太严重了,指令窗口害怕显示的就不是时间了。
也就是我的消息窗口显示的时候、指令窗口是隐藏的,
当指令窗口出来的时候,消息窗口是隐藏的。
因为游戏界面就那么大。
最后看到你说用战斗事件处理,绿色,如果是这样那最好啊,这个是怎么实现的?
作者: 灯笼菜刀王    时间: 2020-8-2 17:52
miantouchi 发表于 2020-8-2 13:34
第一个问题解决了
def update_phase2方法里面加上按键判断就好了。
第二个问题,经过你的提示

第二个问题也一样嘛, 把按键判断换成等待处理就是了, 等待时间就在 start_phase2 设置就好了

至于事件, 因为战斗开始可以调用事件,而且会等到事件运行结束才开始战斗, 这个特性不就正好和你要的效果一样咯, 所以,直接回合0调用公共事件去显示个窗口就好了

栗子



要自动消失就把按键处理换成等待XX, 搞定
作者: miantouchi    时间: 2020-8-2 20:16
灯笼菜刀王 发表于 2020-8-2 17:52
第二个问题也一样嘛, 把按键判断换成等待处理就是了, 等待时间就在 start_phase2 设置就好了

至于事件,  ...

第二问题不太会啊,
@wait_count没有赋值
如果再开头赋值了也不行,也就是造成每次刷机都是初始值-1,永远也进不去下一步。。

战斗事件处理,等我再试试,忘记说了,不光是要开头这个消息,期间怪物攻击、玩家攻击
提示使用什么物品啦,使用什么法术啦,等等这些信息,
是不是用这个战斗事件就不太行了。

111.png (18.9 KB, 下载次数: 7)

111.png

作者: soulsaga    时间: 2020-8-2 21:34
miantouchi 发表于 2020-8-2 20:16
第二问题不太会啊,
@wait_count没有赋值
如果再开头赋值了也不行,也就是造成每次刷机都是初始值-1,永 ...


一次性@wait_count赋值

@wait_count = @wait_count.nil? ? 0 : @wait_count




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