如何让os.pullEvent不产生?

时间:2014-10-30 18:33:55

标签: lua minecraft computercraft

我正在尝试创建while true do循环,使用os.pullEvent对点击作出反应,并更新监视器。

问题在于,当我按下其中一个屏幕按钮时,它只会更新屏幕,我发现这是因为pullEvent会停止脚本,直到事件被触发为止。

是否可以这样做pullEvent不会阻止我更新显示器?

function getClick()
    event,side,x,y = os.pullEvent("monitor_touch")
    button.checkxy(x,y)
end

local tmp = 0;

while true do
    button.label(2, 2, "Test "..tmp)
    button.screen()
    tmp++
    getClick()
end

2 个答案:

答案 0 :(得分:4)

您可以轻松地使用并行api同时运行这两个代码。它是如何工作的,它按顺序运行它们,直到它碰到使用os.pullEvent的东西,然后交换并执行另一侧,如果两者都停在os.pullEvent的某个位置,那么它会一直交换到一个收益率并从那里继续。

local function getClick()
  local event,side,x,y = os.pullEvent("monitor_touch")
  buttoncheckxy(x,y)
end

local tmp = 0
local function makeButtons()
  while true do
    button.label(2,2,"Test "..tmp)
    button.screen()
    tmp++
    sleep(0)
  end
end
parallel.waitForAny(getClick,makeButtons)

现在,如果你注意到,首先,我已经将你的while循环变成了一个函数并在其中添加了一个睡眠,这样它就会产生并允许程序交换。最后,您会看到parallel.waitForAny()运行指定的两个函数,当其中一个函数完成时,在这种情况下,只要您单击按钮,它就会结束。但是请注意,在我没有调用函数的论证中,我只是传递它们。

答案 1 :(得分:0)

我现在没有计算机技术或查找功能,但我知道你可以使用os.startTimer(t)函数,这将导致t秒内的事件(我认为它是秒)

用法:

update_rate = 1

local _timer = os.startTimer(update_rate)

while true do
    local event = os.pullEvent()

    if event == _timer then
        --updte_screen()
        _timer = os.startTimer(update_rate)
    elseif event == --some oter events you want to take action for
        --action()
    end
end

注意:代码未经过测试,我很长一段时间没有使用计算机技术,如果我犯了错误,请求纠正我。