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

[OpenComputers] Обработка нажатия на кнопку

Вопрос

Я пишу прогу, которая рисует кнопку, а потом обрабатывает на неё нажатие. Рисовать, то она рисует правильно, но почему-то функция onClick, которая вызывается по ивенту touch не запускается. Вот код:

local com = require"component"
local uc = require"unicode"
local e = require"event"
local term = require"term"
local gpu = com.gpu


----------------
buttons = {}




function drawButton(name,x,y, w, h, bg, fg, text, onBClick)
buttons.name = {}
buttons.name[1] = x
buttons.name[2] = y
buttons.name[3] = w
buttons.name[4] = h
buttons.name[5] = onBCLick

oldbg = gpu.getBackground()
oldfg = gpu.getForeground()

gpu.setBackground(bg)
gpu.setForeground(fg)

gpu.fill(x, y, w, h, " ")
gpu.set(x,math.max(y,h)/2 - math.min(y, h)/2, text)
gpu.setBackground(oldbg)
gpu.setForeground(oldfg)
end



local function onClick(_,_, x, y, ...)

for name in buttons do
print(x.." "..name[1].." "..name[3].." ".. y.." "..name[2].." ".. name[4])
if x >= name[1] and x <= name[3] and y >= name[2] and y <= name[4] then
name[5]()
end
end
end


local function lol()
require"computer".shutdown(false)
end


e.listen("touch", onClick)

local w, h = gpu.getResolution()

drawButton("lol", 1, 1, w/2, h/2, 0x00FF00, 0x000000, "lol", lol)
while true do
  io.read()
end

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

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


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

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

 

Я пишу прогу, которая рисует кнопку, а потом обрабатывает на неё нажатие. Рисовать, то она рисует правильно, но почему-то функция onClick, которая вызывается по ивенту touch не запускается. Вот код:

...

io.read убирал?

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


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

io.read убирал?

Ошибку to long without yielding выдает

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


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

Ошибку to long without yielding выдает

 

Замени read на os.sleep(), или на event.pull().

 

Ввод данных с клавиатуры - блокирующая операция. Во время нее эвенты не обрабатываются.

Если тебе надо одновременно слушать клавиатуру и эвенты,

то пиши кастомный ввод данных, на основе эвента key_down.

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

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


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

Такой всё равно не обрабатывается (заменил на event.pull)

local com = require"component"
local uc = require"unicode"
local e = require"event"
local term = require"term"
local gpu = com.gpu
 
 
----------------
buttons = {}
 
 
 
 
function drawButton(name,x,y, w, h, bg, fg, text, onBClick)
buttons.name = {}
buttons.name[1] = x
buttons.name[2] = y
buttons.name[3] = w
buttons.name[4] = h
buttons.name[5] = onBCLick
 
oldbg = gpu.getBackground()
oldfg = gpu.getForeground()
 
gpu.setBackground(bg)
gpu.setForeground(fg)
 
gpu.fill(x, y, w, h, " ")
gpu.set(math.max(x, w)/2 - math.min(x, w)/2 - uc.len(text)/2,math.max(y,h)/2 - math.min(y, h)/2, text)
gpu.setBackground(oldbg)
gpu.setForeground(oldfg)
end
 
 
 
local function onClick(_,_, x, y, ...)
 
for name in buttons do
print(x.." "..name[1].." "..name[3].." ".. y.." "..name[2].." ".. name[4])
if x >= name[1] and x <= name[3] and y >= name[2] and y <= name[4] then
name[5]()
end
end
end
 
 
local function lol()
require"computer".shutdown(false)
end
 
 
e.listen("touch", onClick)
 
local w, h = gpu.getResolution()
 
drawButton("lol", 1, 1, w/2, h/2, 0x00FF00, 0x000000, "lol", lol)
while true do
 e.pull()
end

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


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

замени 

for name in buttons do
print(x.." "..name[1].." "..name[3].." ".. y.." "..name[2].." ".. name[4])
if x >= name[1] and x <= name[3] and y >= name[2] and y <= name[4] then
name[5]()
end
end

на 

 

for _, name in pairs(buttons) do
  print(x.." "..name[1].." "..name[3].." ".. y.." "..name[2].." ".. name[4])
  if x >= name[1] and x <= name[3] and y >= name[2] and y <= name[4] then
    name[5]()
  end
end

 

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

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


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

Так-то работает, но в чём разница?

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


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

Насколько я помню, так таблицы не читаются в lua :) 
 

for name in buttons do

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


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

И еще выдает   ...lol: a nil value

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


Ссылка на сообщение
Поделиться на других сайтах
buttons.name[5] = onBCLick

должно быть

buttons.name[5] = onBClick
Изменено пользователем Strateg

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


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

лучше os.sleep(0.05); вместо pull в цикле поставь, он отдает управление опенос, и ради всего святого - используй табуляцию, ато нечитабельно и выглядит достаточно отвратно)

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


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

лучше os.sleep(0.05); вместо pull в цикле поставь, он отдает управление опенос, и ради всего святого - используй табуляцию, ато нечитабельно и выглядит достаточно отвратно)

 

pull тоже отдает

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


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

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

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

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

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

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

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

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

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


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