北大侠客行MUD论坛

 找回密码
 注册
搜索
热搜: 新手 wiki 升级
楼主: ltblue

还得求助啊,异步果然是大坑......

[复制链接]
发表于 2015-5-26 15:05:52 | 显示全部楼层
真正牛x的mc你没见过。跳开你目前的思路。用mc模拟zmud功能
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-5-26 15:30:53 | 显示全部楼层
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-5-26 15:37:49 | 显示全部楼层
有现成的mush机器不研究 楼主自己开发的毅力佩服啊
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-5-26 16:27:51 | 显示全部楼层
回复 11# oolong


模拟zmud很容易,关键不打算模拟
模拟zmud存在一些问题,有时候可能更麻烦
而且,都用mush了,还用zmud的做法,岂不是显得很low?呵呵
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-5-26 16:30:34 | 显示全部楼层
一个脚本走天下
xiaocao 发表于 2015-5-26 03:30 PM



其实我就是学他的做法吧,只是细节上很难做
其实我的做法也是把各个模块封装,然后自己调用自己的东西
可是有些时候存在”抢占“的情况,而任务本身又只能”自杀“,不能”他杀“,所以任务要随时打算”去死“,这个功能做起来很麻烦。
其实我的函数表已经不比小刀的少了吧......
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-5-26 16:44:17 | 显示全部楼层
今天把机器大改了一下,趁着还没写好
加入了全局变量:是否任务被打断
这样一旦被打断,这个变量就会变为”yes”,这样免除了到处返回(有没有被打断)的情况
不过其实还是治标不治本,只不过被打断的情况不是函数间口口相传,而是写在黑板上大家都能看罢了,仍然需要不停的去“看”,即任何模块只要调用了需要“耗时”的模块,都需要看一下黑板,看有没有被打断......
问题只是从一个方法换到另外一个方法罢了
ps:据说我这种问题叫“回调函数”的问题,貌似很常见,没啥好办法貌似
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-5-26 20:55:04 | 显示全部楼层
做成死循环,给条件跳出
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-5-26 22:08:53 | 显示全部楼层
本帖最后由 ltblue 于 2015-5-26 10:14 PM 编辑
做成死循环,给条件跳出
oolong 发表于 2015-5-26 08:55 PM



没懂你的意思
我举个例子哈
假设某协程函数如下:
fun main()
wait.make(fun()
a()
print("main")
end)
end

fun a()
b()
[size=13.9130439758301px]print("a")
end

fun b()
c()
[size=13.9130439758301px]print("b")
end

fun c()
wait.time(100)
[size=13.9130439758301px]print("c")
end

就大体这么个情况吧
我想在这个协程运行的时候,被外部终结(本协程不知道何时终结,只知道通过某种指令被终结),怎么做?
即如果在wait.time期间,要保证不输出任何print(因为一旦被终结,意味着代码完全不再运行了)
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
 楼主| 发表于 2015-5-26 22:16:06 | 显示全部楼层
我目前的做法大概是这样的
ifbreak="no"
fun main()
wait.make(fun()
a()
if ifbreak=="yes" then return
print("main")
end)
end

fun a()
b()
[size=13.9130439758301px]if ifbreak=="yes" then return
print("a")
end

fun b()
c()
[size=13.9130439758301px]if ifbreak=="yes" then return
print("b")
end

fun c()
for i=1,1000 do
wait.time(0.1)
[size=13.9130439758301px]if ifbreak=="yes" then return
end
print("c")
end

也就是在每个函数后面,都加个判断,然后只要外部把变量ifbreak改了,那么整个进程就被干掉了
不过,这样的做法,需要好多个
[size=13.9130439758301px]if ifbreak=="yes" then return
感觉好傻......
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
发表于 2015-5-27 11:46:02 | 显示全部楼层
感觉你被带到沟里了。

你现在做的是触发这一块,也就是说,你在试图取代mc的trigger这个部分。

那么,你接下去要做的,理论上创建一个接口,去调用真正的机器人,做相应的触发。

举个例子来说 我的客户端部分

https://github.com/jarlyyn/JNodeMud/tree/master/code/libs

里面有

mudclienttrigger.js 负责触发器这一块
mudclientvm.js 扶着创建一个虚拟机vm,并调用相应的机器代码
mudclient.js 是机器本体。

那么你现在做的大概是相当于 mudclienttrigger.js 这一块

你还需要写一个独立的机器人主题,然后通过事件/callback来驱动机器人。

每次触发后,再去调用这个时间/callback。

不然的话你先要画个流程图,把你机器人主题流程画一下。

在不需要用到协程的地方,先别去考虑多线程甚至是异步的问题。
北大侠客行Mud(pkuxkx.net),最好的中文Mud游戏!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|北大侠客行MUD ( 京ICP备16065414号-1 )

GMT+8, 2024-11-14 11:39 PM , Processed in 0.010403 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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