查看: 1972|回复: 4

[交流讨论] 异步方法处理

[复制链接]
梦石
0
星屑
38
在线时间
4 小时
注册时间
2023-1-17
回帖
3
发表于 2023-1-18 10:38:53 | 显示全部楼层 |阅读模式

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

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

×
请教一下各位关于异步改同步问题

写了一个方法, 是一个异步方法. 返回Promise对象(比如我现在发起一个网络请求).
在事件里面, 选择调用脚本, 怎么才能使得等待异步完成, 再执行后面事件?

第一次我以为mz有全局async, 我在脚本调用前添加了await, 会报异常说没有async.
后面我就没有尝试了.
Snipaste_2023-01-18_10-37-41.jpg
梦石
2
星屑
8479
在线时间
463 小时
注册时间
2021-12-4
回帖
486

MZ评测员

发表于 2023-1-18 12:21:12 | 显示全部楼层
你也许会注意到有很多事件指令对应的commandXxx函数都以if ($gameMessage.isBusy()) { return false; }开头、以this.setWaitMode("xxx");结尾。
我猜想这个结尾的作用是“令具有上述开头的下一条指令保持阻塞,直到当前指令的异步回调解除了该waitMode再继续执行”,不妨试试看?
回复

使用道具 举报

梦石
0
星屑
38
在线时间
4 小时
注册时间
2023-1-17
回帖
3
 楼主| 发表于 2023-1-18 14:42:06 | 显示全部楼层
小秋橙 发表于 2023-1-18 12:21
你也许会注意到有很多事件指令对应的commandXxx函数都以if ($gameMessage.isBusy()) { return false; }开头 ...

谢谢您的回复, 我去试试
回复

使用道具 举报

梦石
0
星屑
5204
在线时间
457 小时
注册时间
2011-3-26
回帖
100
发表于 2023-1-20 00:44:11 | 显示全部楼层
本帖最后由 rfvtgbzxc 于 2023-1-31 03:45 编辑

这个问题有一个比较简单的解决方式,还有更系统性的,真正异步的解决方案。
简单的解决方案就是,你的脚本添加一行:
  1. Graphics.stopGameLoop()
复制代码

此时游戏被完全冻结。
等待异步函数返回,再使用
  1. Graphics.startGameLoop()
复制代码

恢复游戏运行。
具体到你的事件,其形如

  1. Graphics.stopGameLoop();
  2. $http.init(1).then(result=>{
  3. // 回应promise
  4. // ...

  5. // 恢复游戏运行
  6. Graphics.startGameLoop()
  7. });
复制代码


考虑到异步过程可能报错的问题,可以稍微优化逻辑链:

  1. Graphics.stopGameLoop();
  2. $http.init(1).then(result=>{
  3.   // promise成功
  4.   // ....
  5. }).catch(err=>{
  6.   // promise失败
  7.   // ...
  8. }).finally(()=>{
  9.   // 恢复游戏运行
  10.   Graphics.startGameLoop();
  11. });
复制代码

最后需要在脚本指令后面加一条指令:等待1帧。因为本次逻辑帧中的事件的执行尚未告一段落,需要执行一次这种会触发事件暂停的指令来暂停事件的执行。

如果需要在回应到达前,游戏正常运行,回应到达后,择机跳回刚刚的事件,则较为麻烦。
这是因为非并行事件共用一个事件解释器,没有保存进度的功能,因此几乎没有任何方法可以不通过修改源码,让一个事件在请求完成后继续原进度执行。
每个并行事件有单独的解释器,每帧update一次,如果是并行事件,可能可以在微调源码的情况下比较简单的做到从一个“中断”中返回。待研究。
回复 1 0

使用道具 举报

梦石
0
星屑
38
在线时间
4 小时
注册时间
2023-1-17
回帖
3
 楼主| 发表于 2023-1-21 00:19:23 | 显示全部楼层
rfvtgbzxc 发表于 2023-1-20 00:44
这个问题有一个比较简单的解决方式,还有更系统性的,真正异步的解决方案。
简单的解决方案就是,你的脚本 ...

这个牛逼啊.....! 学到了. 谢谢你了

改成这样的话,我想都可以直接在html标签中添加一个加载框,覆盖在游戏渲染之上, 就想浏览网页一样, 发起某个请求, 会有一个用户反馈. 当然, 网页的处理办法就简单的多了.
等待框避免用户体验差, 会觉得游戏卡了.
后面试试!
回复 1 0

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部