【问题标题】:How to add a "sleep" or "wait" to my Lua Script?如何在我的 Lua 脚本中添加“睡眠”或“等待”?
【发布时间】:2013-08-01 23:54:20
【问题描述】:

我正在尝试通过更改一天中的时间来为游戏制作一个简单的脚本,但我想快速完成。所以这就是我要说的:

function disco ( hour, minute)
setTime ( 1, 0 )
SLEEP
setTime ( 2, 0 )
SLEEP
setTime ( 3, 0 )
end

等等。我该怎么做呢?

【问题讨论】:

标签: timer lua sleep wait


【解决方案1】:

Lua 没有提供标准的sleep 函数,但是有几种方法可以实现一种,详见Sleep Function

对于 Linux,这可能是最简单的一个:

function sleep(n)
  os.execute("sleep " .. tonumber(n))
end

在 Windows 中,您可以使用ping:

function sleep(n)
  if n > 0 then os.execute("ping -n " .. tonumber(n+1) .. " localhost > NUL") end
end

使用select 的方法值得关注,因为它是获得亚秒级分辨率的唯一可移植方式:

require "socket"

function sleep(sec)
    socket.select(nil, nil, sec)
end

sleep(0.2)

【讨论】:

  • @DonavonDecker 然后按照链接中的其他方法。有几个可用于 Windows。比如写一个C扩展
  • 我明白,但是当我尝试链接中的其他方法时,我收到一条错误消息“尝试索引全局 'os' nil 值”
  • @DonavonDecker 这很奇怪,因为os 是一个标准的Lua 库,我自己在Windows XP 下使用ping 测试了它,它运行良好。你使用的是什么版本的 Lua?
  • 我认为他使用的游戏引擎不提供os 库。如果是,请指定哪一个,因为它更有可能提供更好的解决方案。
  • 对于打算在 Android 移动设备上玩的游戏来说,这是一个好的解决方案吗?
【解决方案2】:

如果你安装了 luasocket:

local socket = require 'socket'
socket.sleep(0.2)

【讨论】:

  • 如何安装lua包?
【解决方案3】:

这个自制函数的精度低至十分之一秒或更小。

function sleep (a) 
    local sec = tonumber(os.clock() + a); 
    while (os.clock() < sec) do 
    end 
end

【讨论】:

  • 别忘了这是一个忙碌的等待,消耗处理器时间
  • 如果你不想让 Lua 忙于等待视频游戏或应用程序的帧中使用,也许 wxLua 或其他库可能会提供更少的资源渴望睡眠功能。我提供的 sleep 功能对于错误测试、较小脚本中的自动化和不太严重的项目很有用。
【解决方案4】:

wxLua 具有三个睡眠功能:

local wx = require 'wx'
wx.wxSleep(12)   -- sleeps for 12 seconds
wx.wxMilliSleep(1200)   -- sleeps for 1200 milliseconds
wx.wxMicroSleep(1200)   -- sleeps for 1200 microseconds (if the system supports such resolution)

【讨论】:

    【解决方案5】:

    我需要一些简单的轮询脚本,所以我尝试了Yu Hao's answer 中的os.execute 选项。但至少在我的机器上,我不能再用 Ctrl+C 终止脚本。所以我尝试了一个非常相似的函数,使用io.popen 代替,这个函数确实允许提前终止。

    function wait (s)
        local timer = io.popen("sleep " .. s)
        timer:close()
    end
    

    【讨论】:

      【解决方案6】:

      如果您使用的是基于 MacBook 或 UNIX 的系统,请使用:

      function wait(time)
      if tonumber(time) ~= nil then
      os.execute("Sleep "..tonumber(time))
      else
      os.execute("Sleep "..tonumber("0.1"))
      end
      wait()
      

      【讨论】:

        【解决方案7】:

        我知道这是一个非常古老的问题,但我在做某事时偶然发现了它。这是一些对我有用的代码...

        time=os.time()
        wait=5
        newtime=time+wait
        while (time<newtime)
        do
          time=os.time()
        end
        

        我需要随机化,所以我添加了

        math.randomseed(os.time())
        math.random(); math.random(); math.random()
        randwait = math.random(1,30)
        time=os.time()
        newtime=time+randwait
        while (time<newtime)
        do
          time=os.time()
        end
        

        【讨论】:

          【解决方案8】:

          您应该阅读以下内容: http://lua-users.org/wiki/SleepFunction

          有多种解决方案,每一种都有描述,了解这一点很重要。

          这是我用的:

          function util.Sleep(s)
              if type(s) ~= "number" then
                  error("Unable to wait if parameter 'seconds' isn't a number: " .. type(s))
              end
              -- http://lua-users.org/wiki/SleepFunction
              local ntime = os.clock() + s/10
              repeat until os.clock() > ntime
          end
          

          【讨论】:

            【解决方案9】:
            function wait(time)
                local duration = os.time() + time
                while os.time() < duration do end
            end
            

            这可能是向脚本添加等待/睡眠功能的最简单方法之一

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-08-13
              • 1970-01-01
              • 2010-11-05
              • 1970-01-01
              • 2013-10-19
              • 2016-09-03
              • 2012-10-29
              相关资源
              最近更新 更多