Перейти к содержимому
  • 0
danshat

event.pull() и while true do

Вопрос

Есть следующий код:

local component = require("component")
local debug = component.debug
local note = require("note")
local event = require("event")
local glass = component.glasses
local chatbox = component.chat_box
local isrender = 0
print("Скрипт запущен")

 local _,_,plr,msg = event.pull("chat_message")

function render(timearg)

return true
end

while true do

timefunc = os.date("%H:%M:%S", os.time())


glass.removeAll()
rect = glass.addRect()
text = glass.addTextLabel()
rect.setPosition(1,1)
rect.setSize(50,100)
rect.setColor(0.5,0.5,0.5)
rect.setAlpha(0.3)
text.setPosition(1,1)
text.setText(timefunc)
text.setAlpha(1)
text.setColor(0,1,0)

if plr == "danshat" and msg == "$$stop" then
isrender = 0
glass.removeAll()
end
if plr == "danshat" and msg == "$$start" then
isrender = 1
end
if plr == "danshat" and msg == "$$quit" then 
glass.removeAll()
print("Остановка..")
return true
end



if debug.getWorld().isRaining() == true or debug.getWorld().isThundering() == true then
debug.getWorld().setRaining(false)
debug.getWorld().setThundering(false)
print("Дождь отключен")
note.play(90,0.5)
end

if debug.getPlayer("danshat").getHealth() <= 4 then
debug.getPlayer("danshat").setHealth(20)
print("Здоровье восстановлено")
note.play(90,0.5)
end

end

Собственно, небольшая программка на отдельном сервере по остановке дождя, восстановлению ХП и выводом времени на очки OpenGlasses. Дело в том, что при запуске рендер компонентов на OpenGlasses происходит один раз.. И больше никогда. Путем отсеивания выяснил, что проблема в event.pull(). Когда его нет, часы работают как часы. Но когда он есть, цикл while true do проворачивается один раз и останавливается.

Возможное решение существует?

Изменено пользователем danshat

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендуемые сообщения

event.pull() ожидает какого либо события (нажатия клавиши, сообщения в чате и т.д.)

Т.е. программа дальше не пойдет пока событие не случится. Ожидание можно прервать по тайм-ауту если сделать например так event.pull(3)

В этом случае, если события нет, цикл продолжит свою работу через три секунды.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Есть следующий код:

...

Вынеси своё имя в переменную, например так local name = "danshat"

Ты его и так часто используешь, а так другие игроки, да и ты сам сможешь легко менять ник в одном месте, не бегая по коду.

Смысл от функции render(timearg) если она всегда выводит true и ничего не делает?

В добавок можешь сократить написание local note = lrequire("note").play

В начале программы можешь очистить экран командой require("term").clear

 

И в окончание скажу что return true не обязательно писать. Можно просто return, или в случае с render(timearg) вообще не писать return

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Вынеси своё имя в переменную, например так local name = "danshat"

Ты его и так часто используешь, а так другие игроки, да и ты сам сможешь легко менять ник в одном месте, не бегая по коду.

Смысл от функции render(timearg) если она всегда выводит true и ничего не делает?

В добавок можешь сократить написание local note = lrequire("note").play

В начале программы можешь очистить экран командой require("term").clear

 

И в окончание скажу что return true не обязательно писать. Можно просто return, или в случае с render(timearg) вообще не писать return

Спасибо за уточнения, кодер то я такой быдлокодер)

 

 

event.pull() ожидает какого либо события (нажатия клавиши, сообщения в чате и т.д.)

Т.е. программа дальше не пойдет пока событие не случится. Ожидание можно прервать по тайм-ауту если сделать например так event.pull(3)

В этом случае, если события нет, цикл продолжит свою работу через три секунды.

Интересно, я видел же порт вашей библиотеки thread.lua, а можно как-то разделить рендер и ожидание события используя потоки? Чтобы одно в одном, другое в другом и друг другу не мешали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

event.listen (событие, фунуция) привязывает к событию функцию - при получении указанного события функция выполнится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

event.listen (событие, фунуция) привязывает к событию функцию - при получении указанного события функция выполнится.

Не понял, как пользоваться. В гугле очень туманные ответы на этот вопрос на зарубежном говоре. Если можно привязать функцию, как ей передать параметры от события? или они сами передаются? и отсеивать в самой функции эти параметры знаками "_" ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не понял, как пользоваться. В гугле очень туманные ответы на этот вопрос на зарубежном говоре. Если можно привязать функцию, как ей передать параметры от события? или они сами передаются? и отсеивать в самой функции эти параметры знаками "_" ?

Они передаются в функцию.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не понял, как пользоваться. В гугле очень туманные ответы на этот вопрос на зарубежном говоре. Если можно привязать функцию, как ей передать параметры от события? или они сами передаются? и отсеивать в самой функции эти параметры знаками "_" ?

Сначала я хотел расписать тебе полностью как этим пользоваться, но вдруг понял что моя речь слишком слаба чтобы это сделать.

Так что вот держи http://pastebin.com/bvxyh7fX

Это код моей бета версии игры Open Clicker

Просто промотай вниз и увидишь строку 

event.listen('touch', touch)

Я привязал функцию touch к событию "touch" которая реагирует на клик экрана.

Далее смотри функцию touch()

Разберёшься - молодец.

 

P.S. Скрины к игре не отображаются, потому что доступ к хостингу картинок нет. Сайт недоступен.

Изменено пользователем qwertyMAN

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сначала я хотел расписать тебе полностью как этим пользоваться, но вдруг понял что моя речь слишком слаба чтобы это сделать.

Так что вот держи http://pastebin.com/bvxyh7fX

Это код моей бета версии игры Open Clicker

Просто промотай вниз и увидишь строку 

event.listen('touch', touch)

Я привязал функцию touch к событию "touch" которая реагирует на клик экрана.

Далее смотри функцию touch()

Разберёшься - молодец.

 

P.S. Скрины к игре не отображаются, потому что доступ к хостингу картинок нет. Сайт недоступен.

Ну как я и предполагал, передаются в функцию и отбрасываем нижними подчеркиваниями. Спасибо. Завтра проверю на деле.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну как я и предполагал, передаются в функцию и отбрасываем нижними подчеркиваниями. Спасибо. Завтра проверю на деле.

Учти что в цикле обязательно должен быть os.sleep() или обычный event.pull(), так как именно в них обрабатываются event'ы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не понял, как пользоваться. В гугле очень туманные ответы на этот вопрос на зарубежном говоре. Если можно привязать функцию, как ей передать параметры от события? или они сами передаются? и отсеивать в самой функции эти параметры знаками "_" ?

Рекомендую почитать это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...