Добавление таймера в мою программу 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 тиков. вот мой ответ на эту тему формирует вопрос.

Другие вопросы по тегам