Поиск по сайту
Результаты поиска по тегам 'OC'.
Найдено 90 результатов
-
Писать программы для eeprom - то еще занятие. Попробуем облегчить этот процесс. в \config\OpenComputers.cfg устанавливаем bufferChanges=false Это отключит буферизацию, и все изменения файлов в каталогах сохранения будут немедленно отображены внутри игрыЗагружаем игру в сингл, строим себе базу, ставим там компьютер, и инсталлируем на него OpenOS.После этого, в каталоге \saves\%save_name%\opencomputers\ появится UID нашего виртуального "винчестера", со всем содержимымЗаписываем туда файл bibi local gpu = component.proxy(component.list("gpu")()) gpu.bind(component.list("screen")()) local cy=1 prn=function(...) local t={...} for i=1,#t do t[i]=tostring(t[i]) end gpu.set(1,cy,table.concat(t, ' ')) cy=cy+1 end local readfile=function(f) for addr in component.list("filesystem") do local fs=component.proxy(addr) local h=fs.open(f) if h then --костыль для init.lua computer.getBootAddress=function() return addr end local s,r='','' while r do r=fs.read(h,math.huge) s=s..(r or "") end fs.close(h) return s,f end end end prn('bibi: press a key to force init.lua') computer.beep(440) local s,f=readfile('boot.lua') if ({computer.pullSignal(1)})[1]=='key_down' or not s then s,f=readfile('init.lua') end if s then local r,e=load(s,f) if r then r,e=pcall(r) end prn('bibi:', r, e) else prn('bibi: no file') end prn('bibi: press a key to reboot') repeat until ({computer.pullSignal()})[1]=='key_down' computer.shutdown(true) И файл boot.lua prn('Hello world', nil~=false) После чего в OpenOS делаем: flash -q bibi bibi reboot Наблюдаем наш хелловорлд и убеждаемся, что nil и false - это две большие разницы: Теперь открываем наш boot.lua в блокноте или в чем вам удобно писать код, разминаем мозги и пальцы и погружаемся в процесс творчества. В одном окне блокнот с кодом, в другом - майнкрафт с нашим виртуальным компьютером. Написали-сохранили-проверили. --- Ошибки компиляции нашего кода будут выглядеть так: Ошибки выполнения так: А если нам захочется в OpenOS то мы нажмем секретную кнопку "а кей" когда наш bibi пискнет при старте.Также в OpenOS мы попадем если bibi не найдет файла boot.lua. А если и init.lua не найдет, то скажет "no file" и будет ждать когда мы исправим ситуацию ЗЫ Не злоупотребляйте prn(), она очень служебная и не умеет scroll, конечно scroll это всего лишь условие и две строки, но зачем?! Пишите свои prn-ы с преферансом и барышнями, предварительно поиграв ну хотя-бы с таким вот хелловорлдом:
-
Для работы крутой черепашки мне потребовалось быстро сериализировать и передавать по сети большие объемы информации. 3д массивы, таблицы, и прочее прочее. Внутренние методы СС Textutils.serialize не подходили, из за медленного оператора ".." , который добавлял в итоговую строку символы. Поискав готовые решения на сайте lua-users, я нашел подходящий код для сохранения таблиц в файл, и переписал его под работу со строкой. http://pastebin.com/AYB7u25g Код: Userdata, Функции и метотаблицы не сохраняются Сохраняются только простые значения как таблицы, строки, числа а так же true\false Замечу, что в моем коде для сбора строки используется таблица и метод table.concat(), который увеличивает скорость работы в разы. Код можно использовать как в CС так и в OС. Он добавляет новые методы в глобальную таблицу table и вызывается так: Результаты для двухмерного массива с 1 000 000 полей и замеры времени выполнения: //CC textutils serialize(): 45.94 unserialize(): 1.73 //OC serialization serialization.serialize(): 40.00 serialization.unserialize(): 0.87 //Krutoy table.tostring: table.toString(): 1.80 table.fromString(): 1.19 Пруф для меньшего количества полей: http://ideone.com/ICpS0L
- 12 ответов
-
- 4
-
- performance
- Serialization
-
(и ещё 4 )
Теги:
-
Программа предназначена для сбора латекса с деревьев гевеи. Использует геоанализатор и электрокраник. Построение фермы Деревья располагаются в узлах прямоугольной сетки (расстояние между деревьями 1 блок). Робот располагается в углу фермы на уровне пола. Над деревьями должно быть свободное пространство высотой 1 блок. Под роботом располагается сундук в который будет складываться латекс. Слева от робота располагается зарядное устройство для краника (может быть зарядным устройством из OC или энергохранителем из IC2). Зарядка для робота может располагаться сзади или справа (при необходимости). Схема фермы (вид верху) ####### #@#@#@# ####### #@#@#@# ^###### @ — дерево # — свободное пространство ^ — робот Скриншоты фермы Компоненты робота геоанализатор инвентарь контроллер инвентаря улучшение «Парение» (1-й уровень) — устанавливается, если высота фермы (включая свободное пространство над деревьями) больше 8; не нужен, если высота полёта робота увеличена в конфиге OC. солнечный генератор (уменьшает потребность в зарядке на базе, но для автономной работы недостаточен) интернет-карта (нужна только для установки программы из интернета) Возможная конфигурация робота Использование Перед началом работы необходимо просканировать ферму командой: rubber-farm --analyze <длина> <ширина> <направление_робота> <длина>, <ширина> — длина и ширина фермы (в стволах) <направление_робота> — сторона света, на которую ориентирован робот (south,west,east,north,юг,запад,восток,север) Робот произведёт сканирование фермы, и запишет конфигурацию в файл /home/rubber-farm.cfg. После этого можно запускать сбор латекса командой: rubber-farm --run Не забудьте положить в слот инструмента электрокраник. Используемые библиотеки table_io — запись/чтение луа-таблиц в файл (взят отсюда) erobot — обёртка над модулем "robot" добавляющая программную навигацию pathfinder — поиск пути от @Krutoy, оформленный в виде модуля (пост) Установка Выполнить последовательно следующие команды (необходима интернет-карта): pastebin get nxz9fk4G /lib/erobot.lua pastebin get 6qasEWEw /lib/pathfinder.lua pastebin get qVcqH0T6 /lib/table_io.lua pastebin get 7Ma8am97 /bin/rubber-farm.lua Или скачайте вручную: erobot.lua в /lib/erobot.lua pathfinder.lua в /lib/pathfinder.lua table_io.lua в /lib/table_io.lua rubber-farm.lua в /bin/rubber-farm.lua
-
Всем привет) Хочу продемонстрировать свою библиотеку для OpenOS, она берет свое начало как компонент API ядра ос, которую мы пишем с другом (пока что все в ступоре ) Данная библиотека позволяет создавать виртуальны компоненты. А зачем они нужны? Например нужно создать подобие NFS (NetworkFileSystem), можно написать отдельныю систему, работающую под OpenOS, но как бы хотелось просто примонтировать его куда нибудь в дерево файловой системы, можно для этого изменить библиотеку filesystem, но это может повлиять на другие системы (например на подобие NFS от другого автора, уоторый тоже изменяет библиотеку filesystem, но имеет другой стандарт). А вместо этого можно создать виртуальный компонент, и сама OpenOS будет воспринимать его как реальный, и соответственно виртуальный компонент типа filesystem можно будет примонтировать и пользоватся как обычной ФС. Установка библиотеки: Код можно взять сдесь http://pastebin.com/2vixEPRc По идее комманда pastebin get 2vixEPRc /lib/vdevice.lua должна установить библиотеку, но я не пробовал (не ищу легких путей ) Также файлик будет прикреплен к теме Короче файл vdevice.lua с кодом библиотеки должен быть в /lib Использование: Для этого нужно подключить библиотеку; Создать таблицу с методами (функциями), ключи к ним должны быть в виде строки, эти методы будет содержать виртуальный компонент (как например component.redstone.setOutput()); Вызвать метод библиотеки addVDevice и передать в качестве параметра тип компонента (тип может быть как у руальных компонентов, так и кастомный) и созднную таблицу с методами, метод вернет адресс виртуального компонента. После выполнения данных действий будет создан виртуальный компонент, его можно удалить вызвав метод delVDevice и передасть в качестве параметра адресс виртуального устройства. Пример: В данном примере создается 2 компонента типа mycom, с методом hello который выводит на экран hello (кэп ), которые приобретают адресса #1 и #2, после чего производится определение типа по адрессу, вывод списка компонентов этого типа и вызов метода hello тремя способами. Всем спасибо за внимание) Если кто хаметит баги или недочеты - сообщайте плс) P.S. Либа по какой-то причине не прикрепилась в виде файла .lua поэтому все в архиве vdevice.tar.gz
-
Всем привет! Я написал программу для дистанционного управления дроном (например, с планшета). Плюсы программы: Плюсы При запуске дрона требуется ввести случайный код (т.е. дрона никто не угонит). Можно изменять цвет подсветки дрона, надпись на его экране, скорость дрона. Доступен ввод своих комманд (например, для работы с лассо) Относительно нормальное управление дроном Скрины и мини инструкция для работы с программой Установка прог: Для пульта: pastebin get JTY87AiR control Для дрона: На компьютер скачиваем прошивку для дрона: pastebin get up53MtPM drone Вставляем в системник чистый EEPROM Вводим flash drone eeprom Пихаем в дрона полученную прошивку (eeprom) Включаем дрона!
- 18 ответов
-
- 3
-
- дрон
- OpenComputers
-
(и ещё 1 )
Теги:
-
Я вас категорически приветствую! Начну с небольшой истории: Сидели мы как-то с товарищами на приватном сервере и баловались с отрисовкой PNG картинок, используя библиотеку graffiti. К сожалению, она не могла отобразить любую png картинку... И вот собственно нам в голову пришла идея: "А есть ли какая-нибудь программа или библиотека на ОС для отрисовки JPG картинок..". К сожалению, не нашлась.. И мы решили написать ее сами. Собственно представляю вам сию программку для работы с jpg картинками. pastebin get TvQZb6fu JPGdraw.lua Работать с данной программой очень просто: пишем JPGdraw "название файла" ,запускаем и наслаждаемся результатом! Вот 2 картинки для примера(ссылки на оригинал), загружать через wget: http://www.gamer.ru/system/attached_images/images/000/322/659/post_thumb/7e134f018daf.jpg http://f.internetara.com/onbellek/13/01/08/kk_iuuq_NV_004_SL_cq_SL_cmphtqpu_SL_dpn0_SK_VqNwLbHmfu90UU7keBZ_2NU_tbJ0BBBBBBBBBnV0q1u_SK_lLzcbW90t27110tobudi_SK_2_SL_kqh.jpg P.S Код не мой( правда я принимал непосредственное участие в написании, автор - Alexc), так что ссаными тряпками и тухлыми помидорами в меня не кидаться =) P.S.S К сожалению программа пока не умеет нормально отображать jpg картинки с вертикальным прореживанием по Y =( P.S.S.S Извиняюсь за длинные ссылки, иначе хрен загрузит нормально картинку.
-
Всем привет! Играю на своем сервере с модом OC, но возникла проблема - две видеокарты(1 и 2 уровень) и два монитора(1 и 2) "конфликтуют". В итоге при включении ПК или сервера(И то, и другое есть) инициализация проходит на одном мониторе(рандомно), а отображается все на другом. Т.е., если запускаю GPU-программы, то они могут либо ошибку вызвать(Если монитор 1 уровня) или показать(2 уровень). Как мне сделать так, что-бы вся текстовые(1 уровня видеокарта) вводились/выводилась только через монитор 1 уровня, а вся графическая(Кнопки, там) на другой, 2 уровня? P.S.Про component.gpu.bind("adress") знаю, но работает как-то криво.
-
Я, кажется, эдак годик (ну ладно-ладно, меньше) назад фигачил чатик и вроде был доволен (нет). Вот тута хранится сей артефакт: http://computercraft.ru/topic/758-chat-dlia-googolglasses/ Как выяснилось впоследствии, чатик был совершенно непродуман и неудобен. К тому же, я изрядно получше научился кодить на Луа. И вот, полностью задолбавшить старым чатиком, я засел писать новый. В этом топике представляю вниманию перевод README на гитхабе. Фичи: Каналы Поддержка беспроводной клавиатуры Модули Сетевой интерфейс Разделённые буферы вывода Конфиг-файл ... Требования: Карта данных или блок данных (OpenSecurity) — нужен для сетевого интерфейса. Соотвественно, мост и очки OpenPeripheral (TODO здесь должна быть картина, наныть у Тоторо). Использование Установка Вам нужны будут мост, очки, адаптер, а также карта или блок данных. Подсоедините адаптер к компьютеру (рядом поставить или кабелем соединить), поставьте мост рядом с адаптером. Вставьте карту данных в компьютер, если вы скрафтили её, или подключите блок данных. Теперь пропишите edit /etc/chat.json и отконфигурируйте по своему желанию. Предсказываю, что наверняка вам хотелось бы сменить список админов, например, чтобы потушить чат по-нормальному. Когда вы морально и физически готовы, пропишите opg-chat. Базовое использование Оденьте очки. Та-даам! Появится на мой взгляд довольно красивый интерфейсик. См. пикчу внизу. Чтобы что-то туды отправить, прямо в чат пишите сообщение, добавив $$ в начало. Чтобы отправить команду, сделайте то же самое, но со / перед сообщением. Кроме того, можно использовать беспроводную клавиатуру, тогда доллары не нужны. Некоторые команды, которые желательно знать stop — стопнуть прогу. Очевидно, только для админов доступно. join <канал> — подключиться к каналу. part [канал/номер вкладки] — покинуть канал. И да, главный канал покинуть нельзя. Приносим извинения. help [команда] — попросить помощи у сервера. Можно дать команду — даст подробную инфу о ней. page <строки> — скроллить историю сообщения на канале. Положительные значения двигают вверх, отрицательные — вниз.На клавиатуре можно просто тыкать [PgUp]/[PgDn]. Продвинутое использование Модули Если вас не устраивает стандартная поставка чата, можно дописать свои модули. Просто создайте файл с разрешением .module в директории /usr/lib/chat-modules и творите магию. Как образец можно использоваться стандартные модули. Окружение (доступные функции) storage — таблица, временная память для всякого. Может быть использована для общения между модулями. apcall(func, args...) — advanced pcall — вырезает всякую ненужную фигню типа номера строчки и пр., оставляя только причину. Использована для показа ошибки пользователям (так как там ошибки для простоты assert'ом гонятся). createChannel — внутренняя функция. addUser(user) — создать пользователя с данным именем. join — рекомендую не использовать функцию. joinN(chan, user) — затаскивает пользователя на канал. Отсылает всякие оповещения, делает события и создаёт канал, если не существует. part — внутрення функция. partN(chan, user[, partMsg]) — заставляет пользователя выйти с канала с опциональной причиной. quitN(user[, quitMsg]) — заставляет его же покинуть вообще все каналы. sendMsgChan(chan, user, msg[, recipients]) — отослать сообщение на канал от имени пользователя. Можно дать таблицу тех, кому будет видно сообщение. sendMsgChanN(chan, user, msg) — то же самое, в принципе, но сделать дополнительные проверки (модерируемый ли канал там, достаточно ли прав). Не всегда полезно может быть — потому используйте функцию выше, если никаких проверок правовых не надо. addObject(surface, objName, funcKey, args...) — рекомендуемый способ для рисования объектов на поверхности (surface). Первым нужно дать таблицу из surfaces, потом задать имя объекту, указать название функции (строкой!) и дать аргументы функции. Нужно, чтобы можно было обратиться к объекту позже. Кроме того, хранит в userdata объекта его имя — если захочется использовать поддержку мыши без напряга. getActiveChannel(user) — вернуть "активный" канал. Т. е. у пользователя открыт возвращаемый канал (вкладка). bridge — прокси моста. surfaces — таблица, содержащая поверхности пользователей. surfaces[user] = { surface = {...}, -- Сама поверхность objects = {...} -- объекты на поверхности, созданные функцией `addObject` } users — список пользователей, созданных функцией addUser. commands — список зарегистрированных команд. isin(tbl, value) — маленькая, но очень полезная функция, которая кочует из одной моей проги в другую. Проходится по таблице и ищет указанное значение. Возвращает true, первый найденный ключ таблицы при успехе и false при неудаче. cfg — таблица с конфигурацией. В неё можно записывать — конфиг сохраняется каждую минуту и при выходе. setMode(chan, user, mode[, arg]) — выставить mode. mode — это параметр типа ±<буква mode>, например, +o, -h. Почти как в IRC. modes — таблица всех доступных modes. getLevel(chan, user) — возвращает маску уровня доступа пользователя. checkLevel(chan, user, levels, any) — проверяет, достаточно ли прав у пользователя. levels — таблица, содержащая уровни ({OP, ADMIN, SERVER}). Если any == true, то пользователя достаточно иметь один из перечисленных уровней для успеха. Иначе, все. reqcom(componentName, required[, msg]) — возвращает прокси компонента. Если его нет, а required ~= true, то вернуть пустой компонент (при его индексации возвращает всегда function() end), если же required == true, то создаст ошибку. Напишет ещё сообщение msg, если дано, а компонента нет. copy(tbl) — тоже очень полезная небольшая рекурсивная функция. Копирует таблицу. Напомню, что в Луа при передачи таблицы в функцию, та не копируется, а даётся той же самой (ну как & в Си-языках), что иногда чрезвычайно полезно, не иногда совсем не нужно. _FILE — строка с именем файла модуля. _MODULE — строка с названием модуля (ну то есть то же имя файла его, но без разрешения) NORMAL, VOICE, HALFOP, OP, ADMIN, SERVER — уровни доступа. PREFIXES — таблица уровень-префикс для вывода на очки. всякие там @, %. addListener(eventName, name, func) — добавить слушатель с данным именем, работающий как event.listen, но игнорирующийся при завершении программы. delListener(eventName, name) — удалить слушатель. command {args} — создать новую команду. Лично я опускаю скобки, так как не люблю их. args = { name = "название команды, которую надо писать через /", level = NORMAL, -- кому позволено писать команду help = "Краткое описание команды в списке /help", doc = [[Длинная документация для команды, можно на несколько строк делать]], func = function(eventName, chan, user, raw, cmd, args...) -- eventName — название события -- chan — канал, откуда отправлено событие -- user — пользователь, запустивший команду -- raw — необработанная команда без / в начале -- cmd — название команды -- args... — аргументы, разделённые пробелом (пробелами) end } Сетевой интерфейс (network.module) Этот модуль позволяет вам создавать своих чат-ботов через сеть. Поддерживает оба типа модемов. Однако, советую знать о Spoofing Card из Computronics — она позволяет указывать адрес отправителя (не только проводная сеть, но и беспроводная). Конфигурация В конфиг-файле (/etc/chat.json) есть секция "net". Пример: "net": { "enabled": true, "modemStrength": 400, "ports": { "6667": true, "6666": ["519187"] } } "enabled" задаёт, загружать ли модуль вообще. Если модем беспроводной, его сила будет установлена в значение параметра "modemStrength". "ports" — список портов, которые программа будет слушать. Левая часть ("6667"), очевидно, порт. Правая часть можно быть или true — тогда программа не будет фильтровать порт, или белый список адресов (или их частей). В моём примере, программа будет принимать соединения на порту 6667 только от адресов, которые начинаются на "519187". Команды <имя пользователя>, "auth", <пароль> — подключиться к серверу. true, "keep", "auth", <сессия> — <сессия> — это временный пароль, требуемый для других команд. <имя пользователя>, "msg", <сессия>, <сообщение> — отправить сообщение или команду на сервер. true, "keep", "ok" — сообщение успешно отправлено. <имя пользователя>, "quit", <сессия>[, причина] — закрыть соединение. true, "close" — успешно закрыто. <имя пользователя>, "chaninfo", <сессия>, <канал> — получить инфу о канале. false, "keep", "you are not on channel" — не на канале. true, "keep", <data> — <data> — это сериализованная таблица со всей информацией. <имя пользователя>, "userinfo", <сессия>, <пользователь> — получить инфу о пользователе. false, "keep", "no such user" — запрошена инфа о несуществующем пользователе. true, "keep", <data> — <data> — это вериализованная таблица, соедржащая инфу о пользователе. Ошибки false, "error", "there is already an open connection for this address" — соединение для данного адреса уже установлено. false, "error", "nickname is already in use" — данное имя пользователя уже используется. false, "error", "no password given" — не дан пароль. false, "error", "could not auth: <причина>" — не смог авторизоваться, неизвестная причина. false, "error", "wrong auth" — нет соединения для авдреса, не тот пользователь или неверная сессия. false, "error", "no message given" — не дано сообщение (3 аргумент). События "event", "chat", <канал>, <пользователь>, <сообщение>, <все>, <получатели> — это собтие создаётся, когда пользователь пишет сообщение на канале. Здесь и ниже, <all> — это булева переменная, которая равна true[/i], когда отдельных получателей не задано (всем на канале отослано), и [il]false в противном случае. Если <all> == true, то <recipients> — сериализованная таблица получателей, иначе — сериализованная строка "all". "event", "notice", <канал>, <типУведомления>, <строкаУведомления>, <получатели> — событие создаётся при уведомлениях. "event", "pm", <пользователь>, <получатель>, <сообщение> — событие создаётся при отправке ЛС. "event", "join", <канал>, <пользователь> — пользователь вошёл на канал. "event", "part", <канал>, <пользователь>, <причина> — пользователь покинул канал. "event", "quit", <пользователь>, <причина> — пользователь вышел с сервера. false, "close", "server is stopping" — сервер завершает работу, соединение закрыто. Пароли Как вы могли заметить, нужен пароль для подключения. Где его взять? Если для пользователя нет пароля (или это имя не было использовано), следует отправлять "" в качестве пароля. Если же он есть, его и нужно отправлять в аргументе. Для установки пароля используйте команду /pass [пароль]. Если аргумент опустить, он будет снят с имени. Пароли хранятся в виде MD5-хешей. Для небольшой программки сойдёт, думаю, и этого. Сессии После небольшого раздумья ко мне пришло решение проблемы со Spoofing card из Computronics. Было решено усложнить жизнь ботам и клиентам, добавив сессию — временный пароль длиной в 16 символов, который даётся при авторизации. Он требуется для большинства других команд. Фуух. А теперь о том, как скачивать. Всё очень просто: устанавливаем OPPM (OpenPrograms Package Manager) и пишем oppm install opg-chat. Вуаля. Кроме того, программа требует OpenOS 1.6 и Lua 5.3. Исходники доступны тут: https://github.com/OpenPrograms/Fingercomp-Programs/tree/master/opg-chat Ах, да, собственно, пикчи этого безобразия:
- 4 ответа
-
- 10
-
- IRC
- OpenPeripheral
- (и ещё 5 )
-
Привет игроки форумчане! Сегодня я дописал свой биос для OC. Он позволяет выбирать конкретную файловую систему для загрузки и показывает основные параметры этих систем. Я хотел засунуть больше функционала в виде фейкового init'a но место на eeprom'ке очень мало. Код и так весит 4094 байта из 4096 доступных. Не рекомендуется использовать этот биос в OC 1.5 из-за кривого шрифта. Вот так он выглядит в эмуляторе OC 1.6 команда для загрузки: pastebin run gG0ppTD7 Вот смотрю я на наш форум и вижу одни темы по типу "Есть ли правила на этом форуме?". Это же форум от lua прогеров для lua прогеров. Так давайте проги писать, а не разбираться куда делись правила.
- 12 ответов
-
- 13
-
- bios
- opencomputers
-
(и ещё 1 )
Теги:
-
Посетила меня идея,а не создать сеть под OC,реализовано 2/3 от того что я задумал,скоро будет закрытый тест. Реализовано на mac-адресах Сетевых плат,но в системе все компьютеры имею ip адрес,для удобства что бы запомнить можно было,и короче был. Вот поле ,на нём 2 роутера ,и 4 клиента. ip адрес состоит из первого и второго числа,первое адрес роутера,второе число компьютера,а всё вместе адрес компьютера. Компьютер ip=1.2 передает сообщение компьютеру 2.6 Роутер ловит сообщение Второй роутер принимает пакет от первого Конечная цель ,компьютер с адресом ip=2.6 принимает пакет от 1.2 Не реализовано еще дин.маршрутизация.
-
Ходя по интернету, я не встречал более удобную программу для редактирования воксельных моделей чем MagicaVoxel. Я уже использовал ее для крутых черепах, и теперь она пригодится нам всем и для принтов. Я сделал конвертер для переноса бинарного формата .vox в текстовый. Использование: 1 https://ephtracy.github.io/ Скачайте и установите MagicaVoxel. Сделайте модель своей мечты. Не забудьте следить за размерами в правом верхнем углу - размер одного печатного блока 16х16х16. Можно превысить размеры - конвертер просто сделает список больше чем из одного блока. 2 http://codepen.io/Krutoy242/full/xGOgJG/ Сохраните и откройте модель в моем модном конвертере. Настройки такие же как в принте - название, подсказка, пару флагов и свечение. Так же, после загрузки модели можно будет выбрать текстурки и цвета каждого типа блоков. Флажек "Split to states" разделит вашу модель пополам по оси X что бы из второй части сделать изменение модели при нажатии\подаче редстоун сигнала. Например, для калитки вам нужно в MagicaVoxel задать размер 32 16 16, в одном квадратике нарисовать закрытую калитку, а во втором - открытую. Вот и всё! Полученный текст можно вставить в файлик и отпечатать по гайду Тоторо. Позже добавлю программу, позволяющую печатать по очереди сразу несколько моделей. Конвертер написан на JavaScript. Он читает бинарный файл и объединяет воксели в группы. Программа в какой то степени оптимизирована. Например эти стержни конвертировались автоматически со 100% эффективностью. Но в некоторых случаях, конечно, при создании модели человеком можно будет сэкономить 2-3 шейпа из 23х максимальных. Пишите свои отзывы и пожелания по улучшению конвертера.
- 65 ответов
-
- 10
-
Как создать файл в OC? Как работать с EEPROM? Как научить его разговаривать с require()
-
Часто необходимо писать программы для серверов. Это могут быть сервера для чатов, или файловые облака или что то еще, но всегда приходится писать велосипеды. Подумав об этом я решил написать программу для сервера. Программа работает просто. Подгружает модули из папки проекта, а потом начинает слушать все event'ы и обрабатывать. Представляю вам саму программу: Servercore v0.2.1 Исходный код: http://pastebin.com/NASX9sX0 Использование: Создаем папку проекта Создаем в этой папке файл .servercore Запускаем servercore указывая первым аргументом папку которую мы создали. Если не указывать аргумент то servercore запустится в рабочей директории. Наслаждаемся рабочим сервером, который пока ничего не делает. Любые файлы (кроме .servercore) которые находятся в папке проекта будут загружены как модули. Если модуль содержит ошибку наш сервер не полетит, а просто выведет тест ошибки на экран. При создании модулей можно использовать специальные функции, которые находятся в _G.sc. Описание этих функций: sc.info(info_type:string, message:string) - выводит информацию со временем и раскрашивает как на скринах. Принимает тип информации и само сообщение. Типов информации всего 4: ok,err,warn и info. sc.getTime() - возвращает время в формате unix timestamp. sc.on(event_name:string,handler:function) - добавляет слушателя на сигнал. Циклом слушаются все сигналы а потом запускают функцию обработчик для того сигнала который пришел. Пример простейшего модуля: sc.on("touch",function (e) sc.info("info","you touched!")end) Изменения в версии: Патч 1: убрана обязательная поддержка модемов. Старые версии: Произведение «Servercore» созданное автором по имени LeshaInc, публикуется на условиях лицензии Creative Commons «Attribution-NonCommercial-NoDerivatives» («Атрибуция — Некоммерческое использование — Без производных произведений») 4.0 Всемирная. PS: Название проги звучит как поджанр метала)))
-
Так как GET запросы, например, к http://www.timeapi.org/utc/now , требуют на выполнение определенного времени, до нескольких секунд, наличия интернет карты и кучи телодвижений, есть еще один вариант получения астрономического времени. Точное оно настолько, насколько точно его настроил админ на хосте. Стандартные функции date +%s в консоли и в интерпретаторе os.date() выдают пока черти что, 1970 год и время с потолка. Всякие счетчики работы Луа машины и ПК нам тоже не подходят, типа os.clock() и прочих. Но есть один способ. В ОС можно получить дату модификации файла методом lastModified('filename') из библиотеки filesystem в формате UNIX Ним и воспользуемся. Модифицируем вспомагательный файл и получим время модификации тут же. Вот функция получения времени: -- ======машинное время (время хоста)======= -- раскомментируйте библиотеку, если она не подключена в вашем коде --local fs = require("filesystem") --(установить для своего часового пояса, -12 : +13, например: -2 или 6) local TIME_ZONE = 2 --(не изменять!) local t_correction = TIME_ZONE * 3600 local function getTimeHost() local file = io.open('/tmp/unix.tmp', 'w') file:write('') file:close() local lastmod = tonumber(string.sub(fs.lastModified('UNIX.tmp'), 1, -4)) + t_correction --print(lastmod) -- Вариант 1 --local data = os.date('%x', lastmod) --local time = os.date('%X', lastmod) --return data, time -- Вариант 2, eсли нужно все по отдельности --local year = os.date('%Y', lastmod) --local month = os.date('%m', lastmod) --local day = os.date('%d', lastmod) --local weekday = os.date('%A', lastmod) --local hour = os.date('%H', lastmod) --local minute = os.date('%M', lastmod) --local sec = os.date('%S', lastmod) --return year, month, day, weekday, hour, minute, sec -- Вариант 3, но есть нюанс, если число минут(часов) 5, то и будет выдано 5, а не 05! --local dt = os.date('*t', lastmod) --return dt.year, dt.month, dt.day, dt.hour, dt.min, dt.sec -- Вариант 4, все в куче, как мы привыкли, в правильном формате local dt = os.date('%Y.%m.%d %H:%M:%S', lastmod) return dt end print(getTimeHost()) Вот выдержка из Советской Энциклопедии о UNIX времени. Часовой пояс установите, как Вам угодно (например, сейчас 2 на ИТ - это время Киев, 3 - МСК). Формат, который возвращает функция, тоже выберите, какой Вам удобно. Лишние закомментированные строки (--) удалите. Теперь легко можно в лог записать любое событие и приписать ему время. Так же можно легко узнать дату и день недели через 234 часов, 36 мин, 40 сек, например, предварительно переведя временной интервал в секунды и потом вернуть астрономическое время. Например вы хотите узнать, через сколько на ИТ вы скрафтите 100К ведер жидкой материи. Это например, 2256 год, 1 апреля, 12:50:12, если не останавливать "генмат" не на секунду Вот ретурн функции: Вариант 1: string, string 04/22/15 09:05:56 Вариант 2: number, number, number, string, number, number, number 2015 04 22 Wednesday 09 05 56 Вариант 3: number, number, number, number, number, number 2015 04 22 9 5 56 Вариант 4: string 2015.04.22 09:05:56 и т.п. По сути вся функция, это 7 строчек. Не нужно никаких гетзапросов выполнять, библ всяких и интернет карт. Подробнее о форматах os.date() здесь.
-
Автокрафт на роботе. Программа не имет GUI. Всё управление осуществляется через командную строку. Для работы вам потребуется робот и сундук. Сундук должен стоять перед роботом. Робот должен иметь следующие улучшения: Улучшение «Контроллер инвентаря» Улучшение «Инвентарь» Улучшение «Создание» Улучшение «База данных (1-ый уровень)» Процессор уровня 2 и выше. Необходимый объём памяти и жёсткого диска зависит от количества предметов в сундуке и сложности рецепта. При тестировании использовался робот со следующими характеристиками: см. скриншот. Базу данных программа сохраняет в текущем каталоге. Поэтому для работы программы нужно создать отдельный каталог. Недостатки. Предварительный подсчёт достаточности ресурсов для выполнения сложного крафта не выполняется. Планируется исправить в будущих версиях. Инструкция с картинками. Man Скачать Версия 0.10.8 Старая версия
- 23 ответа
-
- 9
-
- OpenComputers
- Автокрафт
-
(и ещё 2 )
Теги:
-
Охайо! Полгода назад мы проводили второй этап Unreal Tournament (топик). Это был трейнврек, но весёлый, — этап звался Deathmatch, к слову. Роботы пытались друг друга перестрелять (могли ещё взорвать, но никто так и не заюзал бомбы). Но четверо участников пришло, был треш, угар и много стрельбы. :P Пришло время открывать обсуждение третьего этапа Unreal Tournament: Resurrection — и он будет последним в трилогии. Этап 3: Dominance Feat. drones! Проводить будем зимой (февраль?). На подготовку тогда имеем 5 месяцев. Участники третьего этапа: @Totoro, @FluttyProger. Зареквестить участие можно: в ЛС @Fingercomp или @Totoro; в этой теме; сообщением в IRC (#cc.ru или в ЛС fingercomp или Totoro). Команда UT#3: @Totoro — дизайнер, специалист по связям с правительством, пиарщик и просто очень хороший человек. @Fingercomp — кодер, горе-строитель, админ серва, прожект-менеджер. @Fiender — хостер, админ серва. @LeshaInc — кодер. Правила Правила третьего этапа нереально просты. В общих чертах TL;DR: Захват и удержание карты дронами. Арена для этого этапа представляет собой просторную закрытую карту. Карта поделена на условные секторы. В каждом секторе стоит контрольная точка, представляющая собою микроконтроллер, в котором установлена беспроводная сетевая карта с небольшой силой сигнала. В раунде участвуют четыре игрока. Каждый игрок управляет командой из четырёх дронов. За командой закреплен какой-то цвет. Дроны имеют возможность захватывать контроль над секторами карты. Для этого им необходимо завладеть контрольной точкой сектора. После захвата точки она окрашивается в цвет команды, также как и весь сектор. Победные места распределяются по количеству захваченных точек. То есть по проценту территории, которую команда удерживает за собой на карте. За порядком на арене и игровым процессом, как всегда, следит игровой Сервер. Координаты всех важных объектов на карте обозначаются вейпоинтами. Захват точки Для захвата точки дрон должен подлететь к ней на достаточно близкое расстояние и послать сообщение Серверу. Процесс захвата разбивается на несколько пакетов. На который сервер будет отвечать с некоторым делеем. Это даст шанс другим дронам помешать захвату. Например, если у точки висят два дрона и шлют пакеты с одинаковой скоростью, то захват замирает. Дроны взаимно уничтожают прогресс друг друга. Теперь дело можно сдвинуть с мёртвой точки только подогнав ещё одного дрона на помощь. Зарядка В качестве дополнительной геймплейной фишки, можно добавить станции зарядки — места, где дроны должны будут восполнить запас энергии. Иначе дроны сдохнут, и команда проиграет. Визуализация рейтинга Для того чтобы наблюдать за процессом было интереснее, можно повесить на видном месте динамическую карту локации. На ней отрисовать схему арены. Отобразить контрольные точки и сектора, окрашенные в цвета команд, которые их в данный момент удерживают. Точки, которые подвергаются захвату, отобразить мерцающими. Опционально добавить к этому топ команд по количеству секторов и проценты захвата. Условия конца игры Будет три раунда. Раунд завершается при любом из этих событий: Прошло 15 минут и командами захвачены все точки. Три из четырёх команд успешно сдохли. Прошло 30 минут с начала раунда (это на случай пьяных дронов). Технические детали На сервере ждите из модоверсий: Ядрёные моды MC 1.12.2 SpongeForge 7.what.ever Регулярные моды OpenComputers 1.7.0 OpenGlasses 3.3.3 Computronics 1.6.5 Chisel 0.0.13.23 Плагины Antimony LuckPerms Арена будет доступна заранее, контрольные точки будут находиться в фиксированных позициях. С поиском пути в этот раз париться не нужно: дроны двигаются по прямой. Дроны будут иметь одинаковую конфигурацию. Прошивка на дронах будет скачивать саму программу с сервера, куда, в свою очередь, код будет заливаться с компьютеров участников в их кабинках. To Do Как обычно, перед ивентом нужно основательно поработать над его подготовкой. ✅ Доработать правила. Помогайте, оставляя свои мысли в постах в этом топике. ❎ Собрать игровой сервер. Это означает договориться с хостом, закончить пляски со сборкой и выложить её. ❎ Построить арену. ❎ Написать софтверную часть. ❎ Набрать участников. ❎ Провести игру. Проблемные вопросы Остаются ещё несколько проблемных вопросов, которые нужно будет решить по мере разработки проекта. 1. Какая прошивка будет на дронах? Она не должна ограничиваться тупо скачкой проги с сервера. Нужно написать какие-нибудь дебаг-инструменты (например, рестарт). 2. Какая комплектация у дронов? Нужно основательно продумать её, потому что дроны довольно лимитированы по компонентам. 3. Какие настройки энергии установить? Дроны не должны мочь без подзарядки летать весь раунд, иначе не будет толка в зарядниках, но и вырубаться после минуты полёта — это крайность. Нужно отрегулировать скорость зарядки, чтобы не висеть там всю игру. Все программы должны в среднем есть схожее количество энергии. Q&A В топике задают очень важные вопросы, которые поясняют концепт, но ответ на них бывает трудно встроить в текст так, чтобы было заметно. Поэтому ниже будем писать их вместе с ответами. Могут ли участники самостоятельно контролировать дронов во время игры? Нет. После старта дроны становятся полностью автономными. Мы не собираемся менять это — автономность является ключевой фишкой UT:R. Не исключено, однако, что дронами можно будет управлять в других ивентах и сериях ивентов, которые мы, может быть, будем проводить. Будет ли возможен перезахват сектора? Да, конечно же. В этом и весь интерес и интрига. Команда может дружно спать, а за минуту до финала внезапно вылететь и перезахватить все контрольные точки на карте. Разные чудеса случаются, да. Можно ли захватывать одну точку всей командой? Да, можно. Так процесс пойдёт куда шустрее. Как определять цвет дронов и их наличие для статистики на главном мониторе? Цвет дронов определяем перекличкой в начале игры. Сервер запоминает соответствие цвета к модему, с которого прилетело сообщение. Наличие определяется периодическим пингом дронов. Как будут захватываться секторы арены, конкретно? Мы берём концепцию @eu_tomat. Каждая точка имеет уровень захвата. Если он равен нулю (а при старте игры именно так и будет), точка считается нейтральной. У точки небольшой радиус модема, поэтому дроны должны быть очень близко к ней. Для начала захвата дрон должен поймать сообщение от точки (оно регулярно броадкастится) с кодом и отправить его назад, указав свою команду. За каждое сообщение от команды-захватчика уровень захвата точки увеличивается на единицу, но если точка поймает сообщение от другой команды, то уровень захвата уменьшается на единицу до тех пор, пока она не станет снова нейтральной. Для каждого дрона есть кулдаун. Например, дрон отправил сообщение — новое точка примет только через несколько секунд. Однако дрон может вызвать подкрепление: если несколько дронов одной команды будут отсылать коды, то точка может быть захвачена быстрее. После достижения некоторого уровня захвата точка становится собственностью команды. Дрон может продолжить отправлять коды, чтобы увеличивать уровни сопротивления — прежде чем другая команда сможет разблокировать уровни захвата и перезахватить точку, она должна сначала довести уровни сопротивления до нуля. Как дроны узнают, что другая команда начала захват их точки? Если какой-то дрон разблокирует уровни захвата, сообщение об этом отправится всем дронам команды, у которой точка была в собственности. Однако до того сообщения не посылаются. Чтобы заранее узнать, что вражеский дрон начинает разрушать уровни сопротивления, нужно патрулировать территорию. Как будет защищаться территория арены от вмешательства игроков и дронов? Используем мод Conventional: оборачиваем арену в область, где нельзя кликать, и радуемся. Арену сделаем из дрононепробиваемых блоков — тех, что рукой разбить нельзя. Откуда дронам узнавать информацию о состоянии точки? Сообщение о характеристиках будет периодически (раз в 5 секунд, например) броадкаститься точкой на небольшой радиус. Таким образом, поймать его смогут только те дроны, что будут поблизости. Оно будет содержать: текущую принадлежность точки; код захвата уровни захвата и сопротивления. Обновления Так как бампать один и тот же пост на данном форуме — очень невесёлое занятие (да и никто толком не заметит изменение), в топике мы будем писать дополнения. Ниже нарисован список ссылок на обновления. Если вы собираетесь участвовать, обязательно прочитайте их в хронологическом порядке. 2017-10-23: Финализация правил. 2017-11-21: У нас всё медленно и печально. 2017-12-02: Движение началось. Посражаемся?
-
За основу был взят код : "Miner 3x3" http://pastebin.com/hzJZtAWA (Спасибо Programist135 за любезно предоставленную программу). При "ковырянии" были замечены закономерности, которые превратились в функцию Dig(). (Позже увидел, что не один я использую такой приём). Далее ... ну не устроило меня, движение робота со многими разворотами - решил выбрать движение "змейкой" или "зигзагом". И понял ... что интуиция меня - не подвела. Количество ходов уменьшилось на 2 (а с учётом выбрасывания комманды Around, можно сказать, что почти на 3) за каждые вскопанные 9 блоков. Код : Версия 2-я :http://pastebin.com/M9zBTNyy (сырая старая версия.) Версия 5-я : https://pastebin.com/L8kKTPzp (доработанная с учётом сыпучих блоков, мобов и лагов сервера) Скрины : https://yadi.sk/d/XwlHrvnchMXpS Программа писалась, конкретно - под работу с алмазным буром(или иным "универсальным инструментом, копающим всё.) Минимальная комплектация робота : P.S. Данный "продукт", выложен с целью ознакомления, с вариантом решения конкретной проблемы. Автор кода(т.е. ваш покорный слуга) - не несёт ответственности, за любой ущерб в игре, от использования данного кода в работе ваших роботов , а также негативно относится : к создания фанклубов или религиозных течений "моего имени".
- 7 ответов
-
- 4
-
- оптимизация
- Майнинг робот
-
(и ещё 2 )
Теги:
-
Перенос статьи Эта тема была перенесена из блока "Статьи". Автор оригинала: ShuraGamer. Сначала выскажу огромное спасибо @Totoro, @Alex, @Fingercomp, @LeshaInc за их программы, благодаря которым более-менее смог разобраться в очках. Небольшая предыстория(кому неинтересно, основной текст ниже): Началось все с дверного замка Тоторо, в котором использовались неведомые мне до этого очки для вывода информации под названием Terminal Glasses. Мне захотелось побольше узнать о них, но увы-ни в каких, даже англоязычных источниках подробного гайда я не нашел. Спросил на форуме, может кто знает? Кибер предложил написать гайд самому, на халяву вайт получить. Тут-то , немного покопавшись в документации,я и осознал весь размер подложенной мне свинки... Я, наивная душа, подумал, а, фигня, тут же только вывод данных! OpenPeripheral оказался отдельным модом, и писать гайд только по одной его части не имеет особого смысла. Так что придется разбираться полностью. А пока что-держите первую часть гайда по моду OpenPeripheral - Terminal Glasses! Приятного ознакомления! Итак, начнем мы с физической части нашей парочки - Terminal Glasses и Terminal Glasses Bridge. В дальнейшем я буду называть их "очки" и "мост" для простоты. Методы API одинаковы как в ОС, так и в СС Начнем с принципа работы очков. Он достачно прост: информация передается с компьютера на мост, а с моста уже на очки(прим. Можно подключить несколько очков). Если честно, я хз, как данные передаются на очки, видимо тут квантовая зависимость поиграла... Итак, мы ставим мост рядом с компьютером. Далее мы подключаем очки к мосту, просто райткликнув ими по блоку. Готово! Все подготовления завершены, можем начинать программировать! Сначала подключаем мост к компу: OC -- com = require('component') bridge = com.openperipheral_bridge CC -- bridge = peripheral.wrap(сторона подключения к компьютеру) Или bridge=peripheral.wrap("bridge") Теперь мы разбираемся с API: brige.addBox([X-координата], [Y-координата] , [Размер по вертикали] , [Размер по горизонтали], [Хексадецимальный код*], [Прозрачность**]) -- добавляет прямоугольник по заданным параметрам. *Хексадецимальный код - цветовой код, подробнее - гугл. Малая таблица цветов: Черный #000000 Белый #FFFFFF Красный #FF0000 Зеленый #00FF00 Синий #0000FF Желтый #FFFF00 Морская волна #00FFFF Розовый #00FF00 Подробная таблица цветовых кодов:Тык! Цвета подаются в программу в виде 0xКОД, например 0x000000 **Прозрачность: 1 - полностью видимый; 0 - еле заметный(Дробные числа работают) bridge.addText([X-координата], [Y-координата] , [Строка] , [Хексадецимальный код]) - выводит строку в нужных координатах. bridge.clear() - сбрасывает все данные в мосте. Итак, вы все еще помните принцип передачи данных? Так вот, сами собой данные в очках не появятся, мы должны вручную "отправлять" картинку с моста на очки(При отправлении данных с моста на очки вся предыдущая информация сбрасывается) В этом нам поможет bridge.sync(). Для ясности мы напишем небольшую программку, которая показывала бы нам точное время(Напишем ее на OC): --TIMEONGLASSES-- com = require('component') bridge = com.openperipheral_bridge function addbox() bridge.addBox(1,1,80,10,0xFFFFFF,0.2) end function addtime() datetime = os.date("!*t",os.time()) time ="TIME"..datetime.hour..":"..datetime.min bridge.addText(5,2,time,0xFF0000) end --MAIN-- while true do bridge.clear() addbox() addtime() bridge.sync() os.sleep(0.1) end Итак, господа, разберем по полочкам вышенаписанную программу Функция addbox() создает почти прозрачный прямоугольник слева сверху на экране Функция addtime() выводит текущее время, кому интересна строчка: datetime = os.date("!*t",os.time()), прошу по ссылке: Тык! Далее мы смотрим на главный цикл. Разберем его построчно while true do и end - бесконечный цикл bridge.clear() - очищаем мост для новой информации addbox(),addtime() - добавляем табличку со временем bridge.sync() - отсылаем табличку на очки os.sleep(0.1) - ждем десятую секунды Всем спасибо за внимание, надеюсь, помидоры будут не сильно тухлыми :/ P.S. BB-зло!
-
краткое введение в курс наномашин : После моего ужасного эксперимента надо мной, меня пришлось спасать админам. Я решил что хватит это тепеть! и написал прогу которая выдаёт все доступные для ваших нанороботов эффекты. Просто пьём наномашины,запускаем эту прогу и ждём. Во время сканирования желательно стоять на месте и выпить зелье регенерации. После завершения сканирования программа выдаст вам список эффектов и их индексов. Далее можете включать и выключать понравившиеся вам эффекты используя эту программу. видео ВНИМАНИЕ! есть эффект мгновенного урона. он может убить вас при сканировании.
-
Я вот тут задумался, а как быть с интернационализацией (и локализацией) программ? Когда программа становится достаточно большой и популярной, возникает мысль выложить её на каком-нибудь иностранном ресурсе. Ну или просто какой-нибудь чувак приходит и говорит: "I like your program very much, but I don't understand russian at all". Свой голографический редактор, например, я поддерживаю в двух версиях одновременно - русской и английской. По сути два отдельных клона программы. Это не очень удобно. Отсюда вопрос - как запилить удобную систему локализации программ? 1) Клоны программы на разных языках Самый дубовый способ. То как я делал до недавнего времени. Выпускаете программу, делаете несколько копий, каждую переводите на разные языки. Не очень удобно для вас - потому что надо клонировать и переводить каждую новую версию. Не очень удобно для тех, кто хотел бы вам помочь с переводом - они не разбираются в вашем коде, и искать в нём, что надо перевести им будет не удобно. Эту задачу можно облегчить, если вынести все фразы в табличку в начале программы: local text = { greetings = "Приветствую!", ... } Тогда можно будет не копаться в поисках отдельных строк по всему коду, а только перевести эту табличку. 2) Файлы локализации Делаем отдельный файлик, наподобие конфига. В него записываем такие же пары значений, например: greetings = Приветствую! И потом считываем его из программы при старте. Можно сделать дефолтные значения, которые прописаны прямо в коде, и будут использоваться, если программа не нашла файлы локализации. Сами файлики могут лежать рядом с программой, или в папке /etc/my-project/..., или ещё где-то. Если заливать программу в репозиторий, тоже возникают варианты. Мы может создать несколько пакетов, например: holo-ru, holo-en. Это как-то немного нелогично. Установка программы будет выглядеть так: hpm install holo-en Другой способ - это дублировать версии пакета, и дописывать им языковой суффикс: 0.1.0-en, 0.1.0-fr. Вроде получше. Установка будет выглядеть так: hpm install holo@0.7.1-ru Недостаток - нам всегда придётся указывать версию полностью. То есть нельзя будет как раньше - просто указать название пакета, а репозиторий сам выдаст самую свежую версию. Ещё один способ - это держать файлы локализации отдельными пакетами от основного проекта: проект holo и локализационный пакет holo-lang-en например. Тогда саму программу можно будет установить как раньше. Но если мы захотим сменить дефолтный язык, придётся указывать дополнительный пакет: hpm install holo, holo-lang-en Тоже не совсем юзерфрендли. Предлагаю обсудить эту тему, и придти к какому-нибудь удобному стандарту. Какие варианты решения проблемы приходят вам на ум?
-
Прога для тех, кто прочитал мой прошлый гайд по звуковой карте в моём блоге и теперь хочет творить звуки. Потому что вслепую набирать код очень скучно. Synth - это, наконец-то, внятная гуишка для звуковой карты. Она не умеет сохранять полученную конфигурацию в файл и считывать её оттуда, например. Зато можно с лёгкостью создать что-то монстрообразное и потом перенести настройки себе в код. Довольно прелюдий. Это прога является огромным монстром, поэтому ниже я расскажу, как ею пользоваться. 1. Установка Установить прогу можно с помощью oppm или, что лучше (ибо быстрее), hpm. $ hpm oppm:cache update $ hpm oppm:install synth Прога весит 40 кБ, но с ней идут 160 кБ либ, поэтому установка займёт энное время. 2. Запуск Запускать командой synth. Появится красивенькая юишка. 3. Использование Первоначально на поле (а эта синь как раз является полем) ничего нет. Исправить это недоразумение можно с помощью тыка правкой кнопкой по полю. Внизу кнопа для закрытия меню, сверху комбобокс, в котором можно выбрать желаемую карточку. Начнём, пожалуй, с канала ("Channel"). После нажатия по нужному пункту появится карточка в месте, где тыкнули пкм. Таким же образом я создаю карточки "Wave", "Volume", "Frequency". Сами карточки белые, но у них есть цветные штуки. Эти цветные штуки называются пинами. Те пины, которые находятся снаружи карточки, - выходы (на них обычно ">" или "v" написано); которые внутри карточки, - входы. Разноцветные они не просто потому, что мне захотелось, а для помощи. Каждый выход можно подключить ко входу только с таким же цветом. А как подключать-то? Изи: сначала тыкнуть по выходному пину и затем по любому подсвеченному входу. Таким же образом можно отцепить два пина, если они уже подключены друг к другу. Соединения видны глазом даже без какого-либо вооружения. Настройки, которые мы скормили каналу, не особо впечатляют, прямо скажем. Синусоида, 99.99% громкости, 440 Гц частота. Пф. И это недоразумение тоже фиксится правым кликом! Только теперь по карточке. Например, по карточке "Wave". Внизу кнопки удаления объекта (т.е. карточки) и закрытия меню. На большинстве карт этим всё не ограничивается и можно настроить настройки, покрутить крутилки. Вот, например, на скрине выше для карточки "Wave" можно задать тип волны, тыкнув по комбобоксу. После этого можно выйти из меню и наблюдать изменения. Так-так-так, что-то скучновато просто цеплять и отцеплять картонки. Во-первых, их можно таскать по полю: зажать по белой части и потом двигать в тёплые страны. Во-вторых, можно таскать поле: зажать по его свободной части и подвигать. В-третьих, мы можем создать карточку "Sound card". Как ни странно, эта карточка смотрит, что вы к ней подключили, и на основе увиденного ужаса генерирует звук. Для этого её заспавним где-нибудь, а затем к любому из пинов (не столь важно, к какому именно, это ни на что не влияет) подключить канал. Слева у этой карты есть пин громкости - выставит для всех подключенных каналов сразу такую. Но её можно и не ставить. Сразу после этого вы услышите свой звук. Можно таким же образом поставить и второй канал. Если долго эту какофонию слушать, могут отпасть уши, поэтому вместо звуковой карты - её безжалостно удаляем - саммоним график. Особо тут расписывать нечего, вообще. Так же без разницы, куда подключены каналы; через пкм можно настроить зум. Попробуем теперь поиграться с модуляцией. Сначала амплитудная: она попроще. Подключаем канал, который будет модулировать (например, первый), к пину "AM" другого канала. Красота. Даже на график не влезает. Хотя особой проблемы тут нет: как видно, рисуется график не очень красиво (я потом надеюсь это как-нибудь поправить), но представление о виде волны есть. Неплохо, на первый взгляд. Ровно до того, как вы подключите оба канала к звуковой карте. Теперь давайте устроим тотальную частотную модуляцию. Саммоним частотный модулятор, к вернему пину подключаем модулирующий канал, а выхлоп ведём к пину "FM" на другом канале. Звучать оно сразу стало иначе. Можно поменять интенсивность модуляции и частоты на каналах. Последняя карточка в программе - это ADSR. Особого толка в ней, вообще, нет, потому что при подключении её услышите какую-то дичь, но зато на ней есть миленький график изменения амплитуды со временем (вся шкала - это 6 секунд). Так можно наглядно подобрать желаемые значения для этой огибающей. Собственно, это и все карточки, которые есть в этой программе. Ставьте, играйтесь и радуйтесь. А как наиграетесь со звуковой картой, можно выйти из программы (через Ctrl-C) и заняться серьёзными вещами. P. S. Сырцы лежат на OpenPrograms (где б им ещё быть?): https://github.com/OpenPrograms/Fingercomp-Programs/tree/master/synth
- 10 ответов
-
- 16
-
Перенос статьи Эта тема была перенесена из блока "Статьи". Автор оригинала: Semoro. В этом видео я и Сябро рассказываем про настройку файловой системы диска для работы
-
Перенос статьи Эта тема была перенесена из блока "Статьи". Автор оригинала: Semoro. В этом видео я и Сябро рассказываем о компонентах мода Open Computers
-
Перенос статьи Эта тема была перенесена из блока "Статьи". Автор оригинала: fenixrus. Здравствуйте с вами Fenixrus и я начинаю серию гайдов по API мода OpenComputers. Начнем мы с Component API. Вообщем смотрим, изучаем, пробуем, комментируем! https://www.youtube.com/watch?v=hStnB3hCpFs
-
Перенос статьи Эта тема была перенесена из блока "Статьи". Автор оригинала: cloud. Нужно: Комп. Датчик движения (лучше несколько). Сирена из Nuclear Control (можно и что-нибудь другое). Котэ При обнаружении движения злоумышленника, программа выводит его имя на экран и смотрит в вайтлист, если такая фамилия там не числится - включается сирена. Тут код.