Перейти к публикации

Вся активность

Эта лента обновляется автоматически     

  1. Сегодня
  2. Давным-давно делал модный файловый менеджер с графическим интерфейсом для опенкомпов. Переходы по папкам, запуск файлов, распаковака tarball'ов и просмотр картинок в одной программе, к тому же фичи в виде листания свайпами, экранной клавиатуры и горстки настроек. И все это добро занимало меньше килобайта. Но развивать идею не стал, код удалил и осталась только одна картинка тестовой версии. Недавно решил это дело возродить, без зависимостей и лишних свистоплясок. Для начала напишем функции, которые добавят дополнительные возможности для пользователя. Когда игрок тыкает в экран, создаются два события - touch и drop. Когда зажимает и тащит - touch, потом куча drag и в конце drop. Из имеющихся событий, можно развить дополнительные события - клик, двойной клик и свайп. Можно даже добавить сложные жесты, но пока не понятно, как они могут пригодиться. На все нужные события повесим слушателей и будем сохранять результат в переменную. Слушатель для события touch будет проверять, было ли предыдущее событие drop. Затем сравнит с временем от последнего клика, вычислит расстояние между точками, в которых произошло событие. При совпадении координат и заданным временем между кликами пошлет событие double_click. Для события drop надо проверить, было ли предыдущим touch и по тому же параметру скорости проверять время между событиями, чтобы не захватывать долгие нажатия. Если предыдущим событием было drag, то надо определить расстояние между началом и концом действия, вычислить угол и послать это все в виде события swipe. В итоге получится примерно такой код: local computer = require('computer') -- подгрузить обертку для uptime & pushSignal local event = require('event') -- подгрузить библиотеку событий local lastEvent = nil -- последнее действие local lastTouch = nil -- последнее касание local eventTime = nil -- время от последнего события local clickSpeed = 0.5 -- время, за которое совершается клик и дабл-клик event.listen('drag', function(...) lastEvent = {...} -- просто сохранить событие end) event.listen('touch', function(...) local e = {...} -- сохранить событие в таблицу if e[5] == 0 and lastEvent and lastEvent[1] == 'drop' then -- если нажата ЛКМ и предыдущее было drop if eventTime and computer.uptime()-eventTime < clickSpeed then -- если прошло меньше времени, чем задано if lastTouch and lastTouch[3]-e[3]+lastTouch[4]-e[4] == 0 then -- если координаты событий не отличаются computer.pushSignal('double_click', e[2], e[3], e[4], e[6]) -- послать дабл-клик с координатами end end lastTouch = e -- сохранить последнее касание end eventTime = computer.uptime() -- обновить таймштамп события lastEvent = e -- сохранить событие end) event.listen('drop', function(...) local e = {...} -- сохранить событие в таблицу if e[5] == 0 and lastEvent then -- если нажата ЛКМ if lastEvent[1] == 'touch' then -- если предыдущее событие было касанием if eventTime and computer.uptime()-eventTime < clickSpeed then -- если прошло меньше времени, чем задано computer.pushSignal('click', e[2], e[3], e[4], e[6]) -- послать клик с координатами end elseif lastEvent[1] == 'drag' then -- если предыдущее было тасканием local dx, dy = lastTouch[3]-e[3], lastTouch[4]-e[4] -- найти дельту до координат касания computer.pushSignal('swipe', e[2], dx, dy, math.floor(math.deg(math.atan(dx/dy))), e[6]) -- послать свайп с дельтой и углом end end eventTime = computer.uptime() -- обновить таймштамп события lastEvent = e -- сохранить событие end) Пока он ничего не делает, только создает события, когда будет готов функционал отрисовки и взаимодействия с файловой системой, добавим к этим слушателям управляющие функции.
  3. Вчера
  4. Да, но для однопоточной ОС без параллелизма может прокатить.
  5. Угу, оберточная функция только занимает память, а к ней еще приколхожен объект, который моментально создается и исчезает. Нужны либо мухи, либо котлеты. А это ниндзя-индусский код.
  6. А кто говорил про 10 elseif? Если по простому, то нужно просто принтить содержимое элемента таблицы, а для отсутствующих элементов выводить "Об этом я не ничего знаю"
  7. На самом деле кроме метатаблиц я хотел показать, что можно возвращать не выходные данные в ответ на входные, а функцию-обработчик. В итоге мы для каждого элемента сети тупо делаем knowns[item_stack.name]() и для тех предметов, которые мы определили, мы можем обрабатывать их или единообразно, выводя про них комментарий или неоднородно, в зависимости от типа. В итоге вместо 10 elseif будет 2-3 функции-обработчика, организованных в одну таблицу.
  8. Наш случай это упрощает ровно на один оператор if. Какой в этом смысл не знаю. Не я придумал использовать метатаблицу. Ну, можно почувствовать себя крутым прогером.
  9. Да, в определённых случаях метатаблицы, конечно, помогают сократить код. Это понятно. Вопрос в том, как это поможет упросить наш случай.
  10. Это удобней уже тем, что обращений к элементу таблиц в программе может быть множество. И при каждом обращении нужно ставить проверку, "а существует ли такой элемент?". В случае с метатаблицей такую проверку берет на себя Луа. Конечно это никак не ускоряет выполнение программы (наверное), но количество кода сокращает.
  11. Если задаваться вопросами о смысле, то какой смысл и в функции __index, если наличие элемента в таблице легко проверяется обычным обращением к самому элементу? Чем это удобнее уже обсуждённой конструкции if tbl[idx] then?
  12. Вот я о чем: local knowns = {"A","B","C"} local indexer = { __index = function(self, key) return "unknown" end } setmetatable(knowns, indexer) for i=1,5 do print(knowns[i]) end результат: A B C unknown unknown т..е. __index стреляет только для тех элементов, которые отсутствуют в таблице knowns.
  13. Похоже, ты не уловил сути метатаблиц. Нет, теперь то код рабочий. Но какой смысл в метатаблице если сама таблица knowns не содержит элементов? Просто вызывай функцию __index и всё.
  14. Действительно, тут нужна прокси таблица. Вот исправленная версия local prefix = "Я знаю, это " local function unknown() print("Об этом я не ничего знаю") end local descriptions = { ["minecraft:cobblestone"] = "опять чертова кобла", ["minecraft:planks"] = "доски", ["minecraft:tnt"] = "кубик веселья", ["minecraft:log"] = "бревно, как моя бывшая" } local indexer = { __index = function(self, key) local value = descriptions[key] if value then return function() print(prefix .. value) end else return unknown end end } local knowns = {} setmetatable(knowns, indexer) local me_controller = require("component").me_controller for _, item_stack in pairs( me_controller.getItemsInNetwork() ) do print(item_stack.label, " = ", item_stack.size) knowns[item_stack.name]() end
  15. Неправда t = {1,2,3,4} mt = {__index=function(self, key) v=rawget(self,key) if v then return v else return "shit!" end end } setmetatable(t,mt) for i=1,6 do print(t[i]) end
  16. Сомнение в том, что __index вызывается только при отсутствии элемента в таблице.
  17. Это точно рабочий код? Есть у меня сомнение, хотелось бы развеять.
  18. Вот тебе еще один способ сравнения: local prefix = "Я знаю, это " local function unknown() print("Об этом я не ничего знаю") end local indexer = { __index = function(self, key) local value = rawget(self, key) if value then return function() print(prefix .. value) end else return unknown end end } local knowns = { ["minecraft:cobblestone"] = "опять чертова кобла", ["minecraft:planks"] = "доски", ["minecraft:tnt"] = "кубик веселья", ["minecraft:log"] = "бревно, как моя бывшая" } setmetatable(knowns, indexer) local me_controller = require("component").me_controller for _, item_stack in pairs( me_controller.getItemsInNetwork() ) do print(item_stack.label, " = ", item_stack.size) knowns[item_stack.name]() end Для того чтоб посмотреть как оно работает, надо подключиться к контроллеру МЭ-сети адаптером.
  19. Последняя неделя
  20. ECS

    Как иконки красивые сделать

    @FelixBanan Дык это, а папки-то у него в каком виде вообще отображаются? Опеносовский ls? Или он хочет софтину для листинга с нуля написать? НиПаНЯяяТна
  21. @ECS , Как я понял речь идет о том как папке дать значок, как в швиндусе например можно у папки значок сменить. Хотя не уверен.
  22. Клевые шейдеры. Но оно у нас смотрелось не колхозно, когда было в меру. Просто Kimapr не признает условностей и живет на всю катушку.
  23. ECS

    Как иконки красивые сделать

    Рили не понятно, о чем идет речь, прости. Что за папки, в какой софтине - в ls.lua или в какой-то иной? Что подразумевается под иконкой - однопиксельный значок или изображение?
  24. Ну выделить папку иконкой
  25. Вот подборка глючных шейдеров, некоторые смотрятся не так колхозно. https://www.shadertoy.com/view/MlVSD3 https://www.shadertoy.com/view/MllBzs https://www.shadertoy.com/view/4tyfDR https://www.shadertoy.com/view/4syfRt https://www.shadertoy.com/view/MltBzf
  26. С аберрациями в меню ты конечно переборщил. Да и вообще треш творится, цветной хаос. Но лайк за то что не бросаешь. 😃
  1. Загрузить больше активности
  • Рассылка

    Хотите узнавать о наших последних новостях и информации?

    Подписаться
×