Перейти к содержимому
  • 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

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


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

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

  • 0

 

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

...

io.read убирал?

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


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

io.read убирал?

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

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


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

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

 

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

 

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

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

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

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

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


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

Такой всё равно не обрабатывается (заменил на 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

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


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

замени 

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

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


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

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

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


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

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

for name in buttons do

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


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

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

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


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

должно быть

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

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


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

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

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


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

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

 

pull тоже отдает

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


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

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

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

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

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

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

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

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

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


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