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

Project1

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

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

[复制链接]

Lv1.梦旅人

梦石
0
星屑
38
在线时间
4 小时
注册时间
2023-1-17
帖子
4
跳转到指定楼层
1
发表于 2023-1-18 10:38:53 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

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

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

第一次我以为mz有全局async, 我在脚本调用前添加了await, 会报异常说没有async.
后面我就没有尝试了.

Snipaste_2023-01-18_10-37-41.jpg (37.69 KB, 下载次数: 187)

Snipaste_2023-01-18_10-37-41.jpg

Lv4.逐梦者

梦石
0
星屑
7299
在线时间
475 小时
注册时间
2021-12-4
帖子
514
2
发表于 2023-1-18 12:21:12 | 只看该作者
你也许会注意到有很多事件指令对应的commandXxx函数都以if ($gameMessage.isBusy()) { return false; }开头、以this.setWaitMode("xxx");结尾。
我猜想这个结尾的作用是“令具有上述开头的下一条指令保持阻塞,直到当前指令的异步回调解除了该waitMode再继续执行”,不妨试试看?
回复 支持 反对

使用道具 举报

Lv1.梦旅人

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

谢谢您的回复, 我去试试
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
4194
在线时间
506 小时
注册时间
2011-3-26
帖子
110
4
发表于 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

使用道具 举报

Lv1.梦旅人

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

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

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

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-26 05:29

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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