Xytabich
-
Публикации
143 -
Зарегистрирован
-
Посещение
-
Победитель дней
25
Сообщения, опубликованные пользователем Xytabich
-
-
@Oleshe компонент "openperipheral_bridge" возвращает объект типа TerminalGlassesBridge, у него нет подобных методов. Для использования setDragParameters и подобных методов, необходим объект CaptureControl, который доступен только в режиме захвата (насколько я помню). Т.е. необходимо сначала удостовериться что пользователь надел очки, для этого можно использовать события glasses_capture и glasses_release. После этого можно получить CaptureControl при помощи openperipheral_bridge.getCaptureControl(uuid), используя uuid пользователя который находится в режиме захвата (т.е. ткнул пкм с клавиатурой в руках).
Примерный код:local bridge = component.openperipheral_bridge event.listen("glasses_capture", function() local uuid = bridge.getUsers()[1].uuid -- можно использовать только если один пользователь использует терминал local capture = bridge.getCaptureControl(uuid) capture.setDragParameters(5, 10) end)
В данной статье используются принципы объектно-ориентированного программирования, для сокращения объема кода и разделения функционала по своим разделам. По этому необходимо обращать внимание в каком объекте реализован необходимый функционал, а также возвращаемые функциями значения. Например:
TerminalGlassesBridge:DrawableContainer, DrawableFactory -- при использовании объекта TerminalGlassesBridge можно так же использовать функционал из объектов DrawableContainer и DrawableFactory -- TerminalGlassesBridge также реализует собственный функционал: getCaptureControl(uuid:string):CaptureControl -- принимает на вход параметр с именем uuid, имеющий тип string -- возвращает объект типа CaptureControl
-
4
-
1
-
-
-
@ProgramCrafter попытался выставить флаги, и всё равно не работает...
/rg flag <region> build -g members allow
-
Не работает добавление робота в приват, почему-то. Двигаться может, но ломать блоки - нет.
/rg addmember -n <id> [OpenComputers] <name>.robot
-
@Asior я описывал OpenPeripheral'овские очки, OpenGlasses это несколько другое https://minecraft.bymarcin.com/OpenGlasses/doku.php?id=start.
-
12 часа назад, qwertyMAN сказал:OpenOS на жёстком диске. (теперь диск вынимаем, он нам не нужен больше)
Верно, зачем нам хард, и без него консолька грузится
Извините за флуд, не удержался...
-
1
-
2
-
-
@eu_tomat весь прикол в "интересности рецептов" (гринде, на самом деле) сборки серверной, к примеру 4 лярда юю на единицу материи + специфичный материал в качестве скрапа (пол незера, коротко говоря). И таких проектов не мало. К сожалению только парочку проектов знаю с реально хорошими рецептами.
Смысл всего этого типичный для игровой индустрии: удержание клиентов, и покупка внутриигровых плюшек. По этому же поводу и ресетнуть не могут - ибо растеряют базу клиентов. -
-
@NEO кто-то ведь разработал tic, 65el02, опенкомпы, компкрафт и т.п. Если человеку интересно - сделает любое извращение)
-
1
-
-
5 минут назад, NEO сказал:луавм - это динамически линкуемая бибиотека из нативного машинного кода.
То же самое и с ассемблером можно сделать, как ни странно. Хотя учитывая синхронизацию машинного кода и мира майна задержки обращения к миру будут теми же. Но опять же тут приходят на помощь всякие буферы команд и прочее. Всё зависит от разработчика, в общем.
-
1
-
-
1 час назад, NEO сказал:только смысл с этого?
Ну смотри, у тебя есть 2 машины с одинаковыми характеристиками: 1мгц проц, 64кб оперативки, 128кб хранилище. На одной машине крутятся машинные команды, а на другой - луавм. Какую из машин лучше выбрать в плане производительности и затрат ресурсов? Если хочется удобный код, например луа - ничего не мешает закинуть на первую машину луавм, но наоборот сделать нельзя. Это порой выводит из колеи - когда вроде есть возможность сделать лучше и быстрее, но архитектура не позволяет.
-
1
-
-
@Doob да уже есть вроде компилятор, судя по тому что драйвера и программы на си написаны: https://github.com/Magneticraft-Team/Computer
Там где-то в доках было написано что используют gcc mips, процессор R3000.-
1
-
-
@Doob о, магнетикрафт уже допилил компы свои? Это интересно, да ещё и на ассемблере, пойду гляну чего там есть.
Ха-ха:- Что я могу сделать с компьютером сейчас?
- Ничего.
Пока ничего особо интересного из периферии там нет. Есть флоппик, сетевая карта, терминал (монитором язык не поворачивается называть), и робот. Всё ещё ожидание.
-
1
-
2 часа назад, Doob сказал:Потом был мод NedoComputers
Есть ещё на 1.12 RetroComputers, который скопировал архитектуру 65el02. https://www.curseforge.com/minecraft/mc-mods/retrocomputers
Правда на серверах я его особо не видел, разве что в сборках каких-то.-
1
-
-
1 час назад, Doob сказал:Функционал, правда не богатый, можно было только мигать цветными кабелями.
На самом деле там можно было запилить автокрафт с системой хранения, правда скорость оставляла желать лучшего. Вот если на ассемблере написать...
Но переписывать не вижу особого смысла, ибо зачем ограничивать луа фортом... Разве что по фану кабелями помигать.-
1
-
-
Версия 1.01:
- Оптимизация кода- Убрано использование глобальных ссылок
-
1
-
-
-
@Asior в тесте есть подключение:
В 19.05.2020 в 22:34, Xytabich сказал:local fs = require("filesystem")
if not fs.exists(file) then print("File does not exist") endА сама либа уже использует файловый поток.
Лёгких библиотек по рисованию цветом не знаю, и не делал примеров с экраном, потому вот псевдокод:local canvas, x, y = ... -- холст и позиция изображения local file = filesystem.open("/image.gif", "r") local gifFile = gif.read(file) canvas.fill(x, y, gifFile.width, gifFile.height, gifFile.colors[gifFile.bgIndex]) for _,block in pairs(gifFile.blocks) do if block.type == "image" then block = block.block for py=1, block.height do for px=1, block.width do canvas.setPixel(x+block.x+px, y+block.y+py, gifFile.colors[block.pixels:byte((py-1)*block.width + px)]) end end end end
Пиксель - это индекс цвета в палитре. Записаны они в виде линий, сверху-вниз, друг за другом, надо думаю дописать об этом.
-
1
-
-
Сделал простенькую читалку для файлов GIF, поддерживает весь функционал со спецификации: слои/кадры, прозрачность, текст, комментарии, расширение NETSCAPE2.0 и прочее. Но не все доп. расширения были найдены, потому реализовал только описанные в интернете.
Небольшая предыстория:
В общем говоря, захотел я себе как-то анимированный "телек" для дома, в качестве украшения. С отображением были конечно проблемы - голо-проектор не вмещал больше 3х цветов в палитре, но это решалось количеством. Второй проблемой встала сама картинка - пнгшки кадрами собирать было лень, да ещё и в индексы надо переводить все цвета... Подождите-ка индексы, анимация, встроенная палитра... Это-же GIF! Эврика подумал я... Пока не увидел реализацию, а потом меня поглотила пучина гифа...
При первом знакомстве GIF показался простым, как пробка, форматом (хотя, так и есть). Но сжатие изображения в LZW немного остудило мой пыл. Мне довольно трудно понимать работу хитроскрученных алгоритмов сжатия, но всё оказалось не так плачевно, и вооружившись методом проб и ошибок, я начал познавать это.. что-то. В конце концов, подняв несколько хабро-статеек, спецификацию, форумы покрывшиеся пылью, я начал открывать другую сторону GIF - она идеально подходит под реалии OpenComputers: 256 цветов, неплохое сжатие, встроенный текст. Всё это приправлено расширениями в виде анимаций, прозрачности слоёв, и разными дополнительными блоками. В конце-концов, этот формат может стать аналогом флеша в истории опенкомпов! Да здравствует новая эра, эра флеш-игр, когда-то покорившая интернет!
В итоге всех скитаний по интернетам, мне удалось сделать более-менее полную читалку, хотя некоторые расширения потерялись в могилах истории, и я не решился пока их выкапывать.
Саму читалку можно скачать для двух версий Lua:
5.2: wget -f https://github.com/Xytabich/GIF-Lua/raw/master/5.2/gif.lua /lib/gif.lua5.3: wget -f https://github.com/Xytabich/GIF-Lua/raw/master/5.3/gif.lua /lib/gif.lua
Различия между ними несущественны - Lua 5.3 использует встроенные битовые операции, а в Lua 5.2 используется библиотека bit32, соответственно.
Функционал читалки:
-- Сруктуры -- Заголовок GIF - базовая информация гифки. - width:number - ширина гифки - height:number - высота гифки - colorBits:number - кол-во бит, используемое для цветовой палитры. Устарело, но добавил на всякий. - bgIndex:number - индекс фонового цвета - aspectRatio:number - соотношение сторон, считается как: ширина/высота. Тоже устарело, но мало-ли. - colorsCount:number? - количество цветов в глобальной палитре - colors:number[]? - глобальная палитра цветов 0xRRGGBB, индексация начинается с 0 - extensions:table - список расширений гифки Блок изображения (image) - информация о слое/кадре гифки. Содерижит полное изображение, или только его часть. - x:number - отступ от левого края - y:number - отступ от верхнего края - width:number - ширина изображения - height:number - высота изображения - interlaced:bool - построчная или чересстрочная развертка - colorsCount:number? - количество цветов в локальной палитре - colors:number[]? - локальная палитра цветов 0xRRGGBB, индексация начинается с 0 - pixels:string - пиксели изображения, массив байт 0-255. Пиксель является индексом в локальной/глобальной палитре, и записаны в виде линий, слева-направо сверху-вниз. Порядок линий зависит от interlaced. - extension:table? - расширение изображения, параметры анимации и прозрачности - dispMethod:number - метод очистки экрана перед отображением: 1 - не очищается, 2 - закрасить фоновым цветом, 3 - восстановить состояние перед предыдущим кадром - delay:number - время до следующего кадра, в секундах - inputFlag:bool - ожидать ли ввода пользователя для продолжения отображения - transparentIndex:number - индекс цвета в палитре, использующегося в качестве прозрачного Блок текста (text) - отображает текст над изображением. По спецификации символы 7-bit ASCII, но ничто не мешает засунуть туда utf-8. - x:number - отступ от левого края - y:number - отступ от верхнего края - width:number - ширина текстовой области - height:number - высота текстовой области - charWidth:number - ширина символа - charHeight:number - высота символа - fgIndex:number - цвет символа - bgIndex:number - цвет фона символа - text:string - собственно, сам текст Блок комментария (comment) - произвольная текстовая запись, не влияющая на отображение. По спецификации так-же символы 7-bit ASCII, но и юникод спокойно помещается. Расширение гифки: NETSCAPE2.0 - информация о количестве циклов анимации. - iterations:number - количество итераций цикла (0 - бесконечное) - loop:bool - бесконечный ли цикл -- Функции -- gif.read(stream[, pos=0]):table -- читает весь файл. -- stream - поток данных, например - полученный через filesystem.open(...) -- возвращает заголовок с дополнительным полем - blocks:table {type:string, block:object}. В этом поле содержится список всех блоков в порядке чтения. gif.images(stream[, pos=0]):head, image -- итератор, последовательно считывает изображения. -- stream - поток данных, например - полученный через filesystem.open(...) gif.blocks(stream[, pos=0]):head, type, block -- итератор, последовательно считывает все блоки. -- stream - поток данных, например - полученный через filesystem.open(...)
Особо сильно оптимизировать не стал, да и не знаю как, так что если есть предложения - выслушаю и внесу поправки. Один из вариантов ускорения чтения - сделать буферизированный поток данных.
Код и тестовые изображения доступны в репозитории на github.
В чересстрочной развёртке линии следуют не по прямому порядку, подробнее в выписке из спецификации:
Скрытый текстAppendix E. Interlaced Images. The rows of an Interlaced images are arranged in the following order: Group 1 : Every 8th. row, starting with row 0. (Pass 1) Group 2 : Every 8th. row, starting with row 4. (Pass 2) Group 3 : Every 4th. row, starting with row 2. (Pass 3) Group 4 : Every 2nd. row, starting with row 1. (Pass 4) The Following example illustrates how the rows of an interlaced image are ordered. Row Number Interlace Pass 0 ----------------------------------------- 1 1 ----------------------------------------- 4 2 ----------------------------------------- 3 3 ----------------------------------------- 4 4 ----------------------------------------- 2 5 ----------------------------------------- 4 6 ----------------------------------------- 3 7 ----------------------------------------- 4 8 ----------------------------------------- 1 9 ----------------------------------------- 4 10 ----------------------------------------- 3 11 ----------------------------------------- 4 12 ----------------------------------------- 2 13 ----------------------------------------- 4 14 ----------------------------------------- 3 15 ----------------------------------------- 4 16 ----------------------------------------- 1 17 ----------------------------------------- 4 18 ----------------------------------------- 3 19 ----------------------------------------- 4Пример приведу на тестовом коде, для проектора на картинке выше. Этот код просто рисует файл, так что настроить пересечение областей проекторов нужно вручную, или использовать один.
Скрытый текстlocal file = ... if not file then print("Usage: program filename") end local fs = require("filesystem") if not fs.exists(file) then print("File does not exist") end local com = require("component") local computer = require("computer") local gif = require("gif") local holo = {} for k,v in com.list("hologram") do table.insert(holo, com.proxy(k)) holo[#holo].clear() end local function getColorIndex(c, i) -- возвращает индекс цвета для конкретной голограммы if c >= (i-1)*3 and c < i*3 then return c - (i-1)*3 + 1 else return 0 end end local function buildFrame(fx, fy, w, h, str) -- рисует кадр на голограммах local c for x=1,w do for y=1,h do c = str:byte((y-1)*w + x) for i=1,#holo do holo[i].set(fx+x-1, 34-(fy+y), 1, getColorIndex(c, i)) end end end end local loadPalette, time = true local f = fs.open(file) for info,img in gif.images(f) do -- последовательное чтение блоков с изображением if loadPalette then -- установка палитры голограмм, тут используется глобальная палитра, потому устанавливается только один раз local ind for i,c in pairs(info.colors) do ind = math.floor(i/3)+1 if holo[ind] then holo[ind].setPaletteColor(i%3+1, c) end end loadPalette = false end time = computer.uptime() buildFrame(img.x+1, img.y+1, img.width, img.height, img.pixels) os.sleep(img.extension and math.max(0, img.extension.delay - (computer.uptime()-time)) or 0) -- задержка до следующего кадра end f:close()
Для OpenComputers этот формат имеет хорошие возможности, как для простого хранения сжатого изображения, или даже составного изображения из различных слоёв, так и для продвинутых действий: презентаций, анимаций, картинок с подписями. А если совсем заморочиться, то можно сделать свой Anone Gif Player, используя комментарии для записи кода, или собственные расширения приложения. По крайней мере, кинетические новелки возможно сделать и в стоковом варианте.
История изменений:
Скрытый текстВерсия 1.02:
- Исправлено побитовое декодирование
Версия 1.01:
- Оптимизация кода- Убрано использование глобальных ссылок
Версия 1.0:
- Создана читалка-
11
-
1
-
-
6 часов назад, eu_tomat сказал:Да, адаптер работает через драйверы OpenPeripheral
Я сначала не понял... А потом как понял, и полез глядеть код перифералки... Так вот откуда все эти клёвые методы и данные! А я ругался на 1.12.2 почему нет всего этого, а оказывается перифералка ещё более ах*крайнее восхищение* чем я думал. Надо штудировать код и писать статейку на это чудо техники.
P.S. А вообще где-то есть описание подобных фишек? -
-
-
-
@Alex кстати, пока тестил на алмазном сундуке - заметил что через адаптер работает моментально, а через транспозер пол часа сканирует.

GIF - идеальный для OpenComputers?
в Графика
Опубликовано:
@ProgramCrafter в основном были заменены функции на операции, а работающие трюки не были затронуты. За фикс спасибо, поправил.