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

Помогите разобраться с event.pull() и event.listen()

Вопрос

Есть следующий код для примера:
 

local event = require("event")
local component = require('component')
local computer = require('computer')
local gpu = component.gpu
local check = true

function test()
 store = computer.energy()
 gpu.set(10,10,''..store..'')
end

function touch(_,_, x, y)
  if x >= 1 and y >= 1 then
   check = false
   os.exit()
  end 
end

function run()
  while check do
    pcall(test)
  end
end

event.listen('touch', touch)
run()

 

Вопрос 1: в коде присутствует event.listen(), но он не работает. Почему?? Что я делаю не так? И как изменить код, чтобы он заработал?

 

Вопрос 2: когда я делаю тачскрин через event.pull('touch') то все циклы в программе останавливаются. Как этого избежать?

 

И вообще, дайте совет пожалуйста как лучше всего реализовывать систему тачскрина, чтобы в дальнейшем не наступать на те же грабли... Спасибо!

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

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


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

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

 

  1. function run()
  2. while check do
  3. pcall(test)
  4. os.sleep(1) -- добавь
  5. end
  6. end

 

 

Спасибо, помогло) лойс в карму!

На русской вики уже давно есть инфа по всем библиотекам. Например вот инфа о библиотеки event.

 

Теперь перейдём к проблеме.

event.pull() ждёт пока произойдёт событие и до тех пор пока оно не произошло, не реагирует. В скобках указывается собитие и "прямой эфир" (нечто вроде критерия по которому евент будет срабатывать, например на нужную клавишу)

Пример: tb = {event.pull("key_down")}

Таким образом комп будет ждать нажатия любой клавиши, когда он произойдёт вся инфа сохранится в пронумерованную таблицу tb и дальше что хочешь делой с этой инфой.

 

event.lister же работает "в фоне" (по факту в моменты ожидания os.sleep ведётся обработка евентов)

Пример: создадим функцию local function slowpoke() <какой то код> end далее привяжем эту функцию к нажатию на экран клика мыши event.lister("touch", slowpoke)

Далее например создадим бесконечный цикл с обработкой евентов while true do os.sleep(10) end

В таком случае при нажатии на экран будет вызываться функция slowpoke(), а в аргументы будут выводится всё та же инфа о координатах мыши, нике игрока и так далее.

Это более выгодно по сравнению с event.pull, так как позволяет обрабатывать сразу несколько эвентов параллельно, обрабатываемых при ожидании os.sleep()

Но нужно помнить что по окончание программы обязательно нужно будет убрать event.lister при помощи event.ignore("событие", название функции)

 

Если хочешь, могу код какой нибудь скинуть с применением эвентов.

 

Понял насчёт listen.ignore()

Спасибо за совет! Я кстати использовал как пример код твоей игрухи OpenClicker, но os.sleep() упустил видимо

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

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


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

  1. function run()

  2. while check do

pcall(test)

os.sleep(1) -- добавь

end

end

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


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

На русской вики уже давно есть инфа по всем библиотекам. Например вот инфа о библиотеки event.

 

Теперь перейдём к проблеме.

event.pull() ждёт пока произойдёт событие и до тех пор пока оно не произошло, не реагирует. В скобках указывается собитие и "прямой эфир" (нечто вроде критерия по которому евент будет срабатывать, например на нужную клавишу)

Пример: tb = {event.pull("key_down")}

Таким образом комп будет ждать нажатия любой клавиши, когда он произойдёт вся инфа сохранится в пронумерованную таблицу tb и дальше что хочешь делой с этой инфой.

 

event.lister же работает "в фоне" (по факту в моменты ожидания os.sleep ведётся обработка евентов)

Пример: создадим функцию local function slowpoke() <какой то код> end далее привяжем эту функцию к нажатию на экран клика мыши event.lister("touch", slowpoke)

Далее например создадим бесконечный цикл с обработкой евентов while true do os.sleep(10) end

В таком случае при нажатии на экран будет вызываться функция slowpoke(), а в аргументы будут выводится всё та же инфа о координатах мыши, нике игрока и так далее.

Это более выгодно по сравнению с event.pull, так как позволяет обрабатывать сразу несколько эвентов параллельно, обрабатываемых при ожидании os.sleep()

Но нужно помнить что по окончание программы обязательно нужно будет убрать event.lister при помощи event.ignore("событие", название функции)

 

Если хочешь, могу код какой нибудь скинуть с применением эвентов.

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


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

-- первый вариант
local tb = {event.pull("key_down")} --ждём нажатия клавиши
for i=1, #tb do
print(tb[i]) --отображаем все данные о действии
end

-- второй вариант
local function  func(...)
tb = {...} --сохраняем всё в таблицу
for i=1, #tb do
print([i]) --отображаем все данные
end
end

event.lister("touch", func) -- регистрируем евент (можно зарегистрировать сколько угодно разных одновременно)

for i=1, 6 do
os.sleep(10) --минуту будет ловить все евенты
end

event.ignore("touch", func) -- уберём евент, чтобы на него не реагировать

Кстати да, с event.lister работать не очень приятно. В случае ошибки или любого другого варианта когда не выполнился event.ignore, он при следующем включении второй раз зарегистрирует евент и их уже будет два. Так что не смотря на свою крутость, тестировать проги с их участием не очень приятно. Приходится в случае ошибок перезагружать комп.

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


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

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

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

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

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

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

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

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

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


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