我正在尝试使用luasocket连接到Irc频道,并在我的游戏中发送和接收消息(Wolfenstein Enemy Territory,如果有帮助的话)。
现在我能够完成所有这些,只有一个问题。一旦我将其设置为侦听消息,它基本上就会锁定。我有一个后备命令,如果我在Irc中键入stoplisten它只是停止脚本,我可以看到它得到了所有的消息,但游戏本身在等待消息时被锁定。
关于如何在不冻结游戏的情况下执行此操作的任何想法?我刚刚学到了一些协同程序所以我不知道我是否正确使用它们。 我还应该注意到我可以访问运行帧函数,如果有帮助的话,每毫秒运行一次(尽管通常它是这样的:如果math.mod(currentTime,50)〜= 0则返回结束)
以下是我的代码中的部分:http://pastebin.com/j1gCqm4R (我不会用缩进编辑我的所有代码只是为了在这里发布,所以我只是把它放在pastebin上)
答案 0 :(得分:0)
你的问题是,默认情况下,所有套接字都是阻塞,这意味着它们将暂停('阻止')当前执行的线程(在这种情况下,你的游戏),直到他们得到所需的结果或'超时'。
解决方案是非阻塞套接字。在您的客户端套接字对象上调用:settimeout(0)
,将来所有:send(...)
:recieve(...)
将立即返回,或者已成功或超时。
LuaSocket reference包含完整的详细信息,但您必须修改代码以处理“超时”失败状态,或者添加对socket.select()的调用以确保您只使用套接字已经“准备好”使用了。