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

Project1

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

[已经解决] [已解决]脚本怎么写等待按键后执行和循环等待指定时间。

[复制链接]

Lv4.逐梦者

梦石
0
星屑
14096
在线时间
2139 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

跳转到指定楼层
1
发表于 2020-8-1 20:13:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
本帖最后由 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上面在继续执行

Lv5.捕梦者

梦石
0
星屑
37754
在线时间
5385 小时
注册时间
2006-11-10
帖子
6545
2
发表于 2020-8-1 20:35:09 | 只看该作者
本帖最后由 灯笼菜刀王 于 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

回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14096
在线时间
2139 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

3
 楼主| 发表于 2020-8-1 21:22:16 | 只看该作者
本帖最后由 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
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37754
在线时间
5385 小时
注册时间
2006-11-10
帖子
6545
4
发表于 2020-8-1 22:19:17 | 只看该作者
本帖最后由 灯笼菜刀王 于 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: 其实用战斗事件也可以做到你要的效果,而且不用改动默认流程, 更绿色的哦, 笑


评分

参与人数 2星屑 +100 +2 收起 理由
RyanBern + 100 + 1 认可答案
miantouchi + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
31867
在线时间
5079 小时
注册时间
2012-11-19
帖子
4877

开拓者

5
发表于 2020-8-2 08:16:18 | 只看该作者
def update
   if 信息显示中
       if Input.press?(Input::C)
           结束信息显示
      end
      return
   end
   刷新其他的
end

评分

参与人数 1+1 收起 理由
miantouchi + 1 塞糖

查看全部评分

xp vx va mv  va mz 各类型脚本/插件定制
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14096
在线时间
2139 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

6
 楼主| 发表于 2020-8-2 13:34:46 | 只看该作者
本帖最后由 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
我的原代码就是到这个步骤的时候,隐藏消息窗口,显示指令窗口,如果再往后移不知道会咋样,如果后移的太严重了,指令窗口害怕显示的就不是时间了。
也就是我的消息窗口显示的时候、指令窗口是隐藏的,
当指令窗口出来的时候,消息窗口是隐藏的。
因为游戏界面就那么大。
最后看到你说用战斗事件处理,绿色,如果是这样那最好啊,这个是怎么实现的?
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
37754
在线时间
5385 小时
注册时间
2006-11-10
帖子
6545
7
发表于 2020-8-2 17:52:28 | 只看该作者
miantouchi 发表于 2020-8-2 13:34
第一个问题解决了
def update_phase2方法里面加上按键判断就好了。
第二个问题,经过你的提示

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

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

栗子



要自动消失就把按键处理换成等待XX, 搞定

点评

哈哈,无意中学到默认脚本写法start_phase2 赋值 等待时间 def update_phase2 里面计算,就达到效果了。  发表于 2020-8-2 21:00
回复 支持 反对

使用道具 举报

Lv4.逐梦者

梦石
0
星屑
14096
在线时间
2139 小时
注册时间
2019-1-24
帖子
1121

R考场第七期纪念奖

8
 楼主| 发表于 2020-8-2 20:16:13 | 只看该作者
灯笼菜刀王 发表于 2020-8-2 17:52
第二个问题也一样嘛, 把按键判断换成等待处理就是了, 等待时间就在 start_phase2 设置就好了

至于事件,  ...

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

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

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

111.png
回复 支持 反对

使用道具 举报

Lv5.捕梦者

梦石
0
星屑
33143
在线时间
10485 小时
注册时间
2009-3-15
帖子
4756
9
发表于 2020-8-2 21:34:42 | 只看该作者
miantouchi 发表于 2020-8-2 20:16
第二问题不太会啊,
@wait_count没有赋值
如果再开头赋值了也不行,也就是造成每次刷机都是初始值-1,永 ...


一次性@wait_count赋值

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

点评

放在开头咯..  发表于 2020-8-4 21:02
你这个写法应该怎么替换我上面写的?  发表于 2020-8-4 20:52
其实@wait_count = 0 if @wait_count .nil?也行啦..上面的方法可以用来定义新属性时不用初始化和重新开始  发表于 2020-8-3 11:03
神补刀,我试试哈!还有这个功能。。  发表于 2020-8-2 22:22

评分

参与人数 1星屑 +40 收起 理由
RyanBern + 40 塞糖

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-4-19 20:47

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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