如何为我的 Lua 脚本添加“睡眠”或“等待”?

问题描述 投票:0回答:11

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

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

等等。我该怎么做呢?

timer lua sleep wait
11个回答
32
投票

Lua 没有提供标准的

sleep
函数,但是有几种方法可以实现一个函数,详见Sleep 函数

对于 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)

7
投票

如果你安装了luasocket:

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

5
投票

这个自制函数的精度可以达到十分之一秒或更短。

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

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)

2
投票

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

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

1
投票

我需要一些简单的投票脚本,所以我尝试了

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

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

1
投票

你应该读这个: 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

0
投票

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

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

0
投票

您可以将“os.time”或“os.clock”与“while”循环一起使用,我更喜欢“repeat until”循环,因为它更短,但它们很昂贵,因为它们需要完全使用单个内核。

如果你需要的东西要求不高,你可以使用各种包装器,比如我使用的 wxLua,但有时,它们中的一些也会受到使用惩罚,在游戏中特别烦人,所以最好测试它们并获得最适合你的项目的东西。

或者你可以在像Windows这样的操作系统上中继做睡眠功能,使用system32中存在的应用程序,通过Batch或PowerShell,使用“>nul”通过“os.execute”或“io.popen”隐藏它,比如“ping” " (localhost/127.0.0.1) with timeout, "choice"(适用于 XP,较新的版本可能不同,我更喜欢),"timeout"(/nobreak 可能没用,因为所有 Windows 命令都可以用 CTRL+C 取消).缺点仅限于给定的操作系统和数量限制以及秒或毫秒,例如运行它。 Linux 可能需要 Windows 的 Wine 仿真(如果应用程序是为它编写的)。您也可以使用“sleep”或“start-sleep”(来自 PowerShell),但由于 Lua 是独立的,大多数人更喜欢纯 Lua 或包装器,您可以使用适合您项目的内容。


0
投票

Lua 的安全函数 sleep (n):

function sleep (n)
    while n > 0 do
        print("Sleeping for ".. tonumber(n) .." seconds...")
        os.execute("ping -n 2 localhost > nul")
        n = n-1
    end
end

-2
投票
function wait(time)
    local duration = os.time() + time
    while os.time() < duration do end
end

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

© www.soinside.com 2019 - 2024. All rights reserved.