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

Project1

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

[有事请教] mv的等待机制是咋实现的啊?

[复制链接]

Lv4.逐梦者

梦石
0
星屑
11175
在线时间
2066 小时
注册时间
2013-6-10
帖子
1516
跳转到指定楼层
1
发表于 2020-8-22 22:43:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
今天我突发奇想,想用js做出mv的等待功能。
比如说等待1000ms再执行后边的代码,
但setTimeout只能执行指定函数,
在网上搜好像js是一下子执行到底的没法等待??
有大佬可以解释一下子么??

Lv3.寻梦者

梦石
0
星屑
3476
在线时间
293 小时
注册时间
2020-1-27
帖子
190
2
发表于 2020-8-22 23:42:37 | 只看该作者
js 一等待 整个脚本进程就死住了 啥都干不了

唯一类似的方法 用 async function
里面 用 Promise 写个 类似sleep的方法
https://blog.csdn.net/kingbaron/article/details/78508142
看看这个。
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3476
在线时间
293 小时
注册时间
2020-1-27
帖子
190
3
发表于 2020-8-22 23:47:18 | 只看该作者
兼容老MV的写法的话:
  1. function sleep(time) {
  2.     return new Promise(function(resolve){
  3.         setTimeout(resolve, time)
  4.     })
  5. }

  6. (async function() {
  7.     for (var i = 0;i < 10;i++) {
  8.         await sleep(1000)
  9.         console.log(i)
  10.     }
  11. })()
复制代码
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21646
在线时间
9415 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

4
发表于 2020-8-23 03:42:13 | 只看该作者
zths 发表于 2020-8-22 23:42
js 一等待 整个脚本进程就死住了 啥都干不了

唯一类似的方法 用 async function

不是,这不就是个普通的setTimeout吗咋就promise async await 这些优化回调地狱的手段都拉出来了

并且也不是唯一,还有已经没人用的generator 和 yield咧

点评

照着你这示意代码在同步函数里用不是照样回调地狱……  发表于 2020-8-23 03:57
如果只用 setTimeout 不就真开始回调地狱了。。。。  发表于 2020-8-23 03:50
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21646
在线时间
9415 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

5
发表于 2020-8-23 04:08:14 | 只看该作者
zths 发表于 2020-8-22 23:47
兼容老MV的写法的话:
  1. function sleep(time){
  2.   return new Promise(function(resolve){
  3.     setTimeout(resolve, time)
  4.   })
  5. }

  6. function foo(){
  7.   console.log(123)
  8.   sleep(1000)
  9.     .then(function(){
  10.       console.log(456)
  11.     })
  12.     .then(function(){
  13.       return sleep(500)
  14.     })
  15.     .then(function(){
  16.       console.log(789)
  17.     })
  18. }

  19. foo()
复制代码

点评

还有针对两个但不跨整段的异常处理。。。这样也难写。。 搞成同步方法就没意义了。。  发表于 2020-8-23 05:05
这么写 变量定义就得都写到sleep外面了。。。。 我写内方法也就是在异步方法里面有意义。。(好看和变量作用域)  发表于 2020-8-23 05:03

评分

参与人数 1+1 收起 理由
wtyliangting + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21646
在线时间
9415 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

6
发表于 2020-8-23 04:14:37 | 只看该作者
另外,MV的等待机制是靠一个计数器来实现的,类似这样:
  1. var wait = 1000
  2. function updateWait(){
  3.   if (wait > 0){ wait -= 1 }
  4. }
  5. function foo(){
  6.   console.log('时间到的时候执行的内容')
  7. }
  8. function update(){
  9.   updateWait()
  10.   if (wait > 0){ return }
  11.   foo()
  12. }
复制代码

update 是每帧都在调用的方法,调用的时候会检查计数器的值是否大于零,大于零则计数器-1,否则就跳过后续的处理,所以计数器是1000 = 等待1000帧,其他同理
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21646
在线时间
9415 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

7
发表于 2020-8-23 18:36:03 | 只看该作者
本帖最后由 喵呜喵5 于 2020-8-23 18:38 编辑
zths 发表于 2020-8-22 23:47
兼容老MV的写法的话:


“这么写 变量定义就得都写到sleep外面了。。。。”
啊?为啥?

  1. function sleep(time){
  2.   return new Promise(function(resolve){
  3.     setTimeout(resolve, time)
  4.   })
  5. }

  6. function foo(){
  7.   var bar = 12345
  8.   console.log(123)
  9.   sleep(1000)
  10.     .then(function(){
  11.       console.log(bar)
  12.       console.log(456)
  13.     })
  14.     .then(function(){
  15.       console.log(bar)
  16.       return sleep(500)
  17.     })
  18.     .then(function(){
  19.       console.log(bar)
  20.       console.log(789)
  21.     })
  22. }

  23. foo()
复制代码


“我写内方法也就是在异步方法里面有意义。。(好看和变量作用域)”
并不好看,除非你把 MV 整套重写成 async 的,否则就是个回调地狱

  1. function foo(){
  2.   (async function() {
  3.     await sleep(1000)
  4.     console.log(123)
  5.     (async function() {
  6.       await sleep(1000)
  7.       console.log(456)
  8.       (async function() {
  9.         await sleep(1000)
  10.         console.log(789)  
  11.       })()
  12.     })()
  13.   })()
  14. }
复制代码


如果这个你觉得好看的话,那这个更好看

  1. setTimeout(function(){
  2.   console.log(123)
  3.   setTimeout(function(){
  4.     console.log(456)
  5.     setTimeout(function(){
  6.       console.log(789)   
  7.     }, 1000)  
  8.   }, 1000)
  9. }, 1000)
复制代码


“还有针对两个但不跨整段的异常处理。。。这样也难写。。 搞成同步方法就没意义了。。”
大哥你这么用 aysnc  又不想要回调地狱,那异常处理就还是 promise 那套啊

  1. function foo(){
  2.   console.log(123)
  3.   sleep(1000)
  4.     .then(function(){
  5.       console.log(456)
  6.       throw 666
  7.     })
  8.     .catch(function(e){
  9.       console.error(`error:${e}`)
  10.     })
  11.     .then(function(){
  12.       return sleep(500)
  13.     })
  14.     .catch(function(e){
  15.       console.error(`error2:${e}`)
  16.     })
  17.     .then(function(){
  18.       console.log(789)
  19.     })
  20.     .catch(function(e){
  21.       console.error(`error3:${e}`)
  22.     })
  23. }
复制代码

点评

不是,变量声明在 foo 里面啊,最外层就一个 foo 一个 sleep  发表于 2020-8-23 21:19
promise 的异常处理并不是一出异常直接到最后  发表于 2020-8-23 21:17
你这个异常处理 难道不是一出异常直接就到最后了吗? 执行代码肯定要找个时机整成异步的啊 不然没有等待的意义。 而且你变量声明的确在sleep外啊  发表于 2020-8-23 19:42
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3476
在线时间
293 小时
注册时间
2020-1-27
帖子
190
8
发表于 2020-8-23 19:45:58 | 只看该作者
喵呜喵5 发表于 2020-8-23 18:36
“这么写 变量定义就得都写到sleep外面了。。。。”
啊?为啥?


try{
var变量1=1
可能出错的指令
异步等待
然后可能出错的指令
调用(变量1)
}catch(e){}
try{
别的指令
等待
可能出错的
}catch(e){}
问题 异步方法本身就是为了好看和好处理 你写成回调没意义了啊?

点评

反正 只有在异步方法里才有用sleep的意义。 不然这就是自找麻烦 你非往同步方法里搬 咋整咋难受。  发表于 2020-8-23 19:47
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21646
在线时间
9415 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

9
发表于 2020-8-23 21:18:26 | 只看该作者
本帖最后由 喵呜喵5 于 2020-8-23 21:22 编辑
zths 发表于 2020-8-23 19:45
try{
var变量1=1
可能出错的指令


可你的示意代码里并不是在 try catch ,而是包了个返回 promise 的匿名函数在同步方法里调用啊

另:直接上图反驳你说的异常 catch 直接到最后

点评

我觉得我们没在一个频道上 算了吧  发表于 2020-8-24 01:58
回复 支持 反对

使用道具 举报

Lv2.观梦者

梦石
0
星屑
571
在线时间
91 小时
注册时间
2020-8-10
帖子
32
10
发表于 2020-8-26 14:42:33 | 只看该作者
怎么等?是等待指定的时间,然后执行代码吗?例如等待500帧然后执行代码:

var TimeVar = 500;
var TimeRate = TimeVar ;//初始化两个变量,意思是等待500帧

var _Time_update = Scene_Map.prototype.update;
Scene_Map.prototype.update = function() {

    $gameSystem._refresh_window_time = false;

      Time += 1;
       if (Time >= TimeVar)
    {
        TimeVar+= TimeRate ;
        //dosomething.......
}
      _Time_update.call(this);  
};
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-19 16:32

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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