Lua Coroutine错误

时间:2014-03-19 04:30:23

标签: lua coroutine

我目前正在制作一个简单的猜测数字'使用Lua的游戏。我通过iPad上的应用程序(TouchLua +)进行编程。其中一种游戏模式是你有一定的时间来猜测这个数字。我认为要做到这一点,我会创建一个从给定时间倒计时的协程。出于某种原因,我无法在协同程序运行时输入数字。有人可以帮忙吗?这是我到目前为止所拥有的。

  target = math.random(1, 100)
  coroutine.resume(coroutine.create(function()
     for i = 1, roundTime do
        sleep(1000)
        sys.alert("tock")
     end
     lose = true
     coroutine.yield()
  end))
  repeat
     local n = tonumber(io.read())
     if (n > target) then
        print("Try a lower number.\n")
     elseif (n < target) then
        print("Try a higher number.\n")
     else
        win = true
     end
  until (lose or win)
  return true

1 个答案:

答案 0 :(得分:2)

协同程序不是多处理的一种形式,它们是一种合作多线程的形式。因此,当协同程序正在运行时,没有其他任何东西在运行。协程通常意味着将控制权交还给调用者,并且调用者意味着恢复协程,因此协程可以在其产生的地方继续。您可以看到这似乎是并行处理。

所以在你的情况下,你想要在一个小的睡眠时间之后从循环内部产生:

co = coroutine.create(function()
    for i = 1, roundTime do
        sleep(1)
        sys.alert("tock")
        coroutine.yield()
    end
   lose = true
end)

不幸的是,你不能打断io.read(),这意味着上面没有用。理想情况下,您需要“io.peek”功能,以便执行以下操作:

while coroutine.status(co) ~= "dead" do
    coroutine.resume(co)
    if io.peek() then -- non-blocking, just checks if a key has been pressed
        ... get the answer and process ...
    end
end

我不知道Lua中的非阻塞键盘IO。假设TouchLua +支持C扩展,您可以创建一个C扩展,将一些C non-blocking keyboard input公开给Lua。我怀疑它,因为它是一个iOS应用程序。

似乎没有时间循环或回调等,并且找不到文档。如果您可以选择创建用户可以输入答案的文本框,并且必须单击“接受”,则可以测量所需的时间。如果有时间循环,您可以检查那里的时间并在时间不足时显示消息。所有这些在Corona中都很容易做到,也许在TouchLua +中是不可能的。