Добавление таймера в мою программу Lua
Я довольно новичок в Lua и пишу программу. Программа состоит из писем, собирающих и собирающих другие письма (вроде как программа-червь). Тем не менее, я хочу, чтобы это было приурочено. (Я работаю над computercraft, который является модом для Minecraft, но все еще использует Lua, поэтому я не думаю, что это имеет значение) Я использую os.PullEvent( "ключ"), чтобы я мог переместить букву, но ОС. Функция pullEvent() будет приостанавливать работу программы до тех пор, пока она не будет выполнена. Моя проблема в том, что я хочу, чтобы таймер постоянно работал одновременно. Есть идеи, как я могу это сделать? Спасибо!
term.clear()
w = 1
h = 1
score = 0
function topLine()
term.setTextColor(colors.orange)
term.setCursorPos(5,1)
print("Score: ", score)
end
function randLoc()
w,h = math.random(2,50) , math.random(3,17)
term.setCursorPos(w,h)
term.setTextColor(colors.red)
print"O"
end
function drawBorder()
term.setTextColor(colors.blue)
term.setCursorPos(1,2)
print"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
print"X X"
print"X X"
print"X X"
print"X X"
print"X X"
print"X X"
print"X X"
print"X X"
print"X X"
print"X X"
print"X X"
print"X X"
print"X X"
print"X X"
print"X X"
print"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
end
function checkTouch()
if x ~= w or y ~= h then
term.setCursorPos(w,h)
term.setTextColor(colors.red)
print"O"
elseif x == w and y == h then
w,h = math.random(2,50) , math.random(3,17)
term.setCursorPos(w,h)
term.setTextColor(colors.red)
print"O"
score=score+1
end
end
x = 2
y = 3
randLoc()
while true do
topLine()
drawBorder()
checkTouch()
term.setCursorPos(x,y)
term.setTextColor(colors.lime)
print"T"
local e,move = os.pullEvent( "key" )
if move == 30 or move == 203 then
x=x-1
if x <= 1 then
x = 2
end
end
if move == 32 or move == 205 then
x=x+1
if x >= 51 then
x = 50
end
end
if move == 31 or move == 208 then
y=y+1
if y >= 18 then
y = 17
end
end
if move == 17 or move == 200 then
y=y-1
if y <= 2 then
y = 3
end
end
term.clear()
end
4 ответа
Вы можете использовать os.StartTimer()
который будет генерировать "timer"
событие от вашего звонка до os.pullEvent()
См. Документацию по ComputerCraft OS API.
Мои программы Computercraft следуют этой "многозадачной" конструкции
local keepAlive = true
local function NetworkingLoop()
while true do
-- Do Networking
end
end
local function InputLoop()
while true do
-- Do Input
end
end
local function DrawingLoop()
while true do
-- Do drawing
end
end
local function KeepAlive()
while keepAlive do
os.sleep(1)
end
end
parallel.waitForAny(NetworkingLoop, InputLoop, DrawingLoop, KeepAlive)
NetworkingLoop
, InputLoop
, DrawingLoop
а также KeepAlive
будет работать в одно и то же время
(не совсем, потому что Луа не может этого сделать)
Чтобы остановить программу keepAlive
(обратите внимание на строчные k
) чтобы false
где угодно (внутри петель)
Я не уверен, что это ответит на ваш вопрос, но вы можете видеть, сколько времени занимает выполнение кода следующим образом:
local x = os.clock()
----------------------
---- Timed code ------
----------------------
print(string.format("Elapsed time: %.6f\n", os.clock() - x))
Сейчас люди обычно просто используют os.startTimer в переменной, но есть другой метод, включающий переменные и операторы if в циклах внутри функций
tick = 0
time = 0
function timer()
tick=tick+1
if tick == 60 then
time=time+1
tick=0
end
end
running=true
while running do
timer()
sleep(.1)
end
это то, что вы обычно видите в smilebasic, но вы все еще можете повторить, что это lua. Теперь добавление к нему было бы похоже на то, как если бы он говорил каждую секунду, чтобы он что-то печатал
tick=0
time=0
running=true
function timer()
tick=tick+1
if tick==60 then
time=time+1
tick=0
end
if tick > 15 and tick < 30 then
print("it inbetween 15 - 30 please wait")
end
end
running=true
while running do
timer()
end
Теперь это будет просто печатать эту строку текста каждый раз по 15-30 тиков. вот мой ответ на эту тему формирует вопрос.