Lua/Computercraft 既可以监听也可以作为函数?

我正在尝试使用Computercraft在Tekkit上制作计算机系统/网络。

Computecraft是一种基于Lua的修改版,可在Minecraft/Tekkit和其他修改版包中运行。

基本上,我目前正在使用无线路由器执行以下操作:

rednet.open('top') -- 打开与无线路由器的连接
print ("test")
input = read()
rednet.receive()  -- 监听发送/广播的消息

if message then
 print (message)
end

我尝试对所有我的系统进行更改,就像这样:

rednet.open ('top')
 -- 执行所有正常操作

rednet.receive()
if message == "Lock202" then
 os.pullEvent = os.pullEventRaw
 term.clear()
 term.setCursorPos(1,1)
 print ("警报进行中,终端已锁定")
end

在执行所有正常操作时,我希望用户能够导航和使用计算机的功能。但是当调用 rednet.receive() 时,它会冻结并等待传入的消息。

我希望它在后台运行,仅在接收到消息时才执行操作。

我已经尝试查看文档、帮助站点,并思考将这个问题带到SO,因为有许多可用的Lua程序员。

点赞
用户2369088
用户2369088

命令rednet.receive()可以在其参数中有一个参数,即 "超时"。

这是以秒为单位测量的。它也是一个浮点数(十进制),例如 4.50、1.23 等。

这意味着它将在该段时间内接收消息。

完成您想要的一个很好的方法是让另一台计算机不断接收消息,然后向您想要进行模块接收并编写类似以下内容的内容的计算机提供一个红石信号

`` ` 函数检查()   如果rs.getInput("back") then       local id,message = rednet.receive(5)       print("接收消息")   结束 结束

`` `

另一台计算机将执行以下操作:

`` ` computerid = 50

id,message = rednet.receive()    rs.setOutput("后面",true)    睡眠(1)    rednet.send(computerid,message)    rs.setOutput("返回",false)

`` `

computerid 将等于您想要运行的初始计算机的ID。在运行代码时,您还必须定期使用 Check() 函数,除非正在接收消息,否则它不会影响计算机,在这种情况下,它将按“rednet.receive”的参数中指定的时间接收消息。

希望这很有帮助

--EwilDawe

2013-05-10 08:13:32
用户3189167
用户3189167

parallel.waitForAll()

这是一个基本可以多线程运行你的程序的函数... 所以你可以这么做...

function listen()
 while true do
  id, msg, distance = rednet.receive()
  FUNCTION_THAT_RUNS_STUFF(id, msg, distance)
  sleep(1)
 end
end

function main_loop()
 while true do
  --在此处执行其他操作
 end
end

--文件末尾运行所有内容
parallel.waitForAll(listen, main_loop)
2014-01-13 06:24:09
用户4378313
用户4378313

我所做的是让一台PC运行os.pullEvent,而其他一些PC则收集信息并通过rednet发送信息,这使得只有一台PC像这样被卡住,尽管其他的PC基本上是无法使用的。当然,如果您像我所做的那样,您可以使它检测键盘按键、rednet_message等等。

2014-12-19 15:42:12