Перейти к содержимому
ECS

Библиотека пользовательского интерфейса "GUI"

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

Возникла проблемка, 

Хочу забить в функцию переменную силы сигнала, но чета как то никак. Компилятор ругается, без понятия почему.
 

local GUI = require("GUI")
local component = require("component")
local sides = require("sides")
local colors = require("colors")
local rs = component.redstone 
local MaxSignalPower = 256

--------------------------------------------
local mainContainer = GUI.fullScreenContainer()
mainContainer:addChild(GUI.panel(1, 1, mainContainer.width, mainContainer.height, 0x2D2D2D))

local inputPower = mainContainer:addChild(GUI.input(5, 4, 30, 3, 0xEEEEEE, 0x555555, 0x999999, 0xFFFFFF, 0x2D2D2D, "", ""))

local powerSignal

inputPower.onInputFinished = function()
	powerSignal = inputPower.text 
end

  
local function rOutput()
 rs.setOutput(sides.top, powerSignal)
end

local function rOutputOff()
 rs.setOutput(sides.top, 0)
end

local switch2 = mainContainer:addChild(GUI.switch(5, 12, 8, 0x66DB80, 0x1D1D1D, 0xEEEEEE, false))
switch2.onStateChanged = function()
  if switch2.state then
    rOutput(sides.top, powerSignal)
  else
    rOutputOff()
  end
end

------------------------------------------------
mainContainer:drawOnScreen(true)
mainContainer:startEventHandling()

Снимок.PNG

Изменено пользователем ZloyApelsihchik
объединение сообщений

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


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

Дык поле input.text является строкой, ты ж ее сам вводишь в виде текста, в виде чертовых символов. А функция redstone.setOutput(side, strength) в качестве второго аргумента принимает только числа. Ясен фиг ругается, если ты ей пытаешься текст скормить. Юзай что-то типа этого:

inputPower.onInputFinished = function()
  -- Зачекай, а то мало ли там вообще не число введено
  if inputPower.text:match("%d+") then
  	powerSignal = tonumber(inputPower.text)
  end
end

Второй вариант с автоматической валидацией:

inputPower.validator = function()
	return inputPower.text:match("%d+")
end

-- При наличии validator этот метод выполнится только в случае успешной валидации текста
inputPower.onInputFinished = function()
  powerSignal = tonumber(inputPower.text)
end

 

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


Ссылка на сообщение
Поделиться на других сайтах
14 часов назад, ECS сказал:

Дык поле input.text является строкой, ты ж ее сам вводишь в виде текста, в виде чертовых символов. А функция redstone.setOutput(side, strength) в качестве второго аргумента принимает только числа. Ясен фиг ругается, если ты ей пытаешься текст скормить. Юзай что-то типа этого:


inputPower.onInputFinished = function()
  -- Зачекай, а то мало ли там вообще не число введено
  if inputPower.text:match("%d+") then
  	powerSignal = tonumber(inputPower.text)
  end
end

Второй вариант с автоматической валидацией:


inputPower.validator = function()
	return inputPower.text:match("%d+")
end

-- При наличии validator этот метод выполнится только в случае успешной валидации текста
inputPower.onInputFinished = function()
  powerSignal = tonumber(inputPower.text)
end

 

Ох, как сложно. 
Так, то что ты написал, это как я понял, проверка введённого текста, на то число ли это?
Я не совсем понимаю что такое tonumber. Но опять же как я понял, это что вроде конвертера в число?
И что такое validator, тоже хотелось бы узнать.
Простите за такое большое кол-во вопросов, я новичок в это деле и вопросов тьма. 
Спасибо за помощь :3 Кусь 
 

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

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


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, ZloyApelsihchik сказал:

Я не совсем понимаю что такое tonumber. Но опять же как я понял, это что вроде конвертера в число?

 

Дыа, так и есть. Я не понимаю, зачем ты, не изучив основ, лезешь в написание интерфейсного софта. Хоть потренькался бы чутка на хелловорлдах

 

2 часа назад, ZloyApelsihchik сказал:

И что такое validator, тоже хотелось бы узнать.

 

Вообще из коммента в коде выше все должно быть понятно, да и в документации эта инфа подробно разжевана. Захотел бы - узнал бы

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


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

ECS, ну я тоже плохо знаю lua, и ниче пишу проги под твоей оболочки)

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


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

@Fronun, мяу, однако ты ознакомлен с tonumber(), правда? Правда-правда?

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


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

dafaq!1111

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


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

вопрос снят, сори

image.png

image.png

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

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


Ссылка на сообщение
Поделиться на других сайтах
03.01.2019 в 16:56, SkinnerDE сказал:

вопрос снят, сори

image.png

image.png

Надеюсь, ты конвертнул картинку.png в картинку.pic

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


Ссылка на сообщение
Поделиться на других сайтах
05.01.2019 в 13:12, Fronun сказал:

Надеюсь, ты конвертнул картинку.png в картинку.pic

 

Да, додумался все-таки))

Вот только прикрутить туда таймер не получается никак. Чтобы картинка менялась по таймеру

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


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

@SkinnerDE, юзай eventHandler для пикчи:

 

-- Загружаем все пикчи из папки в единую таблицу
local path = "/Pictures/"
local currentPicture = 1

local pictures = {}
for file in filesystem.list(path) do
  table.insert(pictures, image.load(path .. file))
end

-- Добавляем объект изображения в контейнер или куда-то еще
local GUIImage = application:addChild(GUI.image(1, 1, pictures[currentPicture]))

-- Как часто пикча будет меняться
local interval = 5
-- Время, когда условие ниже сработает в следующий раз
local deadline = computer.uptime() + interval

-- Обработчик событий вызывается каждый пуллящийся ивент (даже если его не было при нулевом интервале)
kartinka.eventHandler = function(application, myImage)
  if computer.uptime() > deadline then
    -- Отображаем следующую пикчу
    currentPicture = currentPicture + 1
    if currentPicture > #pictures then
      currentPicture = 1 
    end
    
    GUIImage.image = pictures[currentPicture]
    application:draw()
    
    -- Обновляем время следующего срабатывания условия
    deadline = computer.uptime() + interval
  end
end

-- Обязательно с ноликом, чтоб ивенты пуллились с минимальным интервалом
application:start(0)

 

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


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

Спасибо, вроде бы понятно (сам принцип), кроме того откуда эти имена и что туда поставить.

image.png.f2c8fe95b04f623dda8a5df8ffee3e33.png

kartinka - вроде контейнер, а myImage?

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

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


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

@SkinnerDE, пардон, я на ходу писал, myImage можно в расчет не брать. Главное принцип, дыа. MyImage в данном случае - это ссылка на объект изображения,  передаваемая в обработчик событий для удобства, называть переменные можно как угодно. Для ясности код приведу:

local function myEventHandler(application, objectPointer, e1, e2, e3, ...)
   -- Ох уж эти события
end

-- Переменная object и objectPointer из обработчика событий - это один тот же объект
object.eventHandler = myEventHandler

 

Аналогичный функционал, кстати, можно запилить и средствами event.timer, однако так куда проще, да и отменять таймеры впоследствии не придется.

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


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

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

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

Гость
Ответить в тему...

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

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

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

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

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


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