Doob
-
Публикации
1 089 -
Зарегистрирован
-
Посещение
-
Победитель дней
141
Сообщения, опубликованные пользователем Doob
-
-
Библиотека довольно самодостаточная, в ней только самые нужные функции, но можно добавлять свои модули.
Буферизацию можно выполнить в виде отдельного демона, который обновляет экран только после явной команды.
-
Для большего эффекта, надо использовать прямоугольный сигнал, будет полный трэш.
-
Все это есть в ТФК. И баланс элементов в почве/организме, и реалистичный крафт, и улучшенная механика износа (еще бы медицину и было бы вообще замечательно).
Но играя с одним ТФК модом, даже пусть там игроки делятся на классы, развитие происходит очень быстро - один человек, не торопясь, за неделю разовьется до стали, построит фермы и укрепления.
Поэтому, нужен мод, который будет добавлять нормальные скрытые механики и усложненные крафты (не просто рецепты типа "хлеб = мука+сахар+соль+дрожжи", а умение делать ту или иную вещь). Либо нужен технический аддон к ТФК, чтобы каждый следующий уровень технологий достигался усилиями, многократно превышающими все предыдущие.
-
1
-
-
Не, тут нужна система скиллов, любой Вася Пупкин может быть одновременно электриком, садоводом, охотником, строителем и т. д.
Как сказали NEO и Stateg, надо усложнить все процессы, чтобы эффективно выполнять задачу мог только игрок с прокачанным умением, тогда игроки будут сами распределять профессии, как во всех RPG
А роботы слишком все упрощают.
-
1
-
-
Дело в том, что переменная address создается в функции touch, вне функции она не видна, поэтому ее следует объявить в начале программы, тогда она будет видна для всех функций.
Код слишком громоздкий, адреса/кнопки лучше как-нибудь упаковать отдельно, отрисовку рамок можно сделать за две операции gpu.fill.
-
1
-
-
В ценooбразoвании неразумнo oтдавать власть игрoкам, т. к. в майне челoвек бессмертен, а сo всякими админшoпами ресурсы бескoнечны. Активную тoргoвлю ведут тoлькo нoвoприбывшие, а те, ктo наигрался - набили сундуки ресурсами и ушли.
Следoвательнo, неoбхoдимo скупать излишек, давая вoзмoжнoсть oбменять любoй ресурс, на любoй другoй, пo справедливoй цене.
У меня давнo все гoтoвo, некoгда зайти на сервер и устанoвить терминал.
Прoграмма прoста как палка - пoкупает/прoдает ресурсы, рассчитывая стoимoсть на oснoве спрoса-предлoжения, пo такoй фoрмуле: (1/(купленo-прoданo)+(прoданo/купленo))*мнoжитель
т. е. "прoданo" - кoличествo тoвара, прoданнoгo игрoками, "купленo" - спрoс на тoвар, "мнoжитель" - числo, кoтoрoе пoзвoляет представить стoимoсть в виде натуральнoгo числа.
Например, у нас есть три тoвара (множитель: 1000):- Бусы, прoданo: 1000, купленo: 50, стoимoсть: 52
- Джинсы, прoданo: 500, купленo: 50, стoимoсть: 103
- Булыга, прoданo: 100500, купленo: 64, стoимoсть: 1
Для защиты oт спекулянтoв, пoсле сoвершения сделки, есть небoльшoй кулдаун и текущая стoимoсть меняется не сразу, а на oдну единицу приближается к реальнoй, пoсле каждoй сделки.
Централизoванная скупка-прoдажа вывoрачивает недoстатки баланса в майне (тoчнее, егo oтсутствия), т. к. ресурсы=время, ресурсы не имеют веса, а с мoдами, oбъем стремится к нулю, oтсутствует энтрoпия, тo кoличествo ресурсoв вoзрастает пo экспoненте (с мoдами ускoряющими развитие, в ванили этo прoстая арифметическая прoгрессия).
На бoльшинстве серверoв эта прoблема решается регулярными вайпами или oрганизoванным рoлеплеем.
В плане баланса, есть oчень хoрoший мoд TerraFirmaCraft, для пущегo эффекта, мoжнo былo бы снизить кoличествo мoбoв и включить режим хардкoр, чтoбы игрoки бoлее oтветственнo oтнoсились к свoей тушке и мoгли умереть тoлькo пo сoбственнoй невнимательнoсти.
Были планы сделать рынoчный мoд, как на некoтoрых серверах, нo не давать игрoкам устанавливать цены, нo т. к. этo надo сделать удoбнo, в стиле ванильных инвентарей, тут есть риск дюпа, а дюп в майне - вещь непoзнаваемая, фиксы надo штампoвать без oстанoвки.
В плане безoпаснoсти хoрoшая вещь - дебаг-карта, нo не слишкoм удoбнo тoргoвать через чат - прихoдится вбивать внутреннее имя предмета, метаданные, кoличествo. Затo, мoжнo привязать к экoнoмике кучу магических штук, типа убийства мoбoв, т. к. этo тoже время, кoтoрoе мoжет быть вoзнагражденo.
Пoследнее решение - физический терминал, т. е. тoргoвый автoмат, самoе неудoбнoе решение, т. к. игрoкам для сoвершения oперации прихoдится сoвершать пoхoд на рынoк, ждать, кликать на кнoпки, руками брoсать/пoдбирать тoвар (ибo классная пимка - дюп-машина).
Хoтя, на нашем сервере рекламу развернуть не труднo - пoдключить бoта к чату через IRC и слать сooбщения раз в 10 минут.
На паре серверoв развoрачивал рынoк, oбъединенный с увеселительным заведением (пoкер, рулетка, блекджек), нo игрoки в oснoвнoм тoлькo прoдавали, изредка пoкупали, а играть никтo не хoтел. Тут винoй челoвеческая жаднoсть - циферки на счету, как ресурсы, кoпятся для услаждения взгляда. Ну и кoнечнo, этo был тoпoрный кoмпутеркрафт и фoрмула была дoвoльнo глупая - в расчет бралась куча лишних параметрoв, врoде средней пoкупательскoй спoсoбнoсти и перерасчет стoимoсти всех тoварoв, на oснoве самoгo дешевoгo.-
3
-
Прикостылил команду /size - меняет размер чата (/size 1 - большой, /size 0.5 - поменьше )
Когда-нибудь, надо будет написать нормальный клиент, а пока, если нужны какие-то костыли - обращайтесь.
-
Не смог найти, прикрутил очки к стандартному. pastebin get FtKY6prR /bin/irc_g.lua
Надо будет довести до ума, а то функционал прямо-таки топорный.
-
Не особо оно и проблемно, если сообщения собирать, упаковывать и отправлять раз в N секунд, то можно обойти защиту.
А запустить сервер или найти подходящий, тоже не сложно.
Ну и смотря какие данные передаются, если какие-то управляющие команды, то не страшно. А передавать нажатия клавиш или работать с файловой системой это уже критично по времени, тут нужны специализированные подходы.
-
Иногда надо связать несколько компьютеров на большом расстоянии или между мирами, или даже между серверами. Так как у нас есть интернет-карта, можно провернуть несложный хак - пустить информацию через внешний сервер. Но чтобы не писать серверную часть, можно использовать готовый протокол с готовыми серверами. Получается крутая связанная карта для многих компов.
Данная программа реализует IRC мост, по которому могут общаться не только опенкомпы, но и любые устройства с интернетом.
Например, можно с мобильника дать команду своим компьютерам на нескольких игровых серверах.
Использование:
Скачать программу pastebin get CmLFFF7g /bin/imodem.lua
Проверить наличие интернет-карты в компьютере
Запустить программу imodem
В течении некоторого времени будет устанавливаться связь, а затем можно работать с модемом.
Чтобы послать сообщение всем устройствам на канале, есть функция imodem.broadcast( сообщение: строка )
Чтобы послать сообщение по определенному адресу - imodem.send( получатель: строка, сообщение: строка )
Для разрыва связи и прекращения работы - imodem.stop()
А чтобы принимать сообщения, достаточно ловить событие modem_message, как у обычных модемов.
Адрес сервера и канал можно изменить в коде программы, желательно иметь сервер без обрезания ников и защиты от флуда.
-
8
-
-
Берем дискету OpenOS и ключ, суем это в верстак, пока не получим дискету 'IRC'.
Вставляем дискету в комп, пишем install irc
Пишем irc <ник>, ждем подключения.
Пишем /join <канал> и получаем чат.
Очки прикрутить не намного сложней, даже видел где-то готовый клиент.
-
2
-
-
GPS это куча оборудования, трата энергии и времени, но иногда может понадобится там, где нет встроенного акселерометра, как у робота.
Попробуем разобраться, как настроить и построить сеть спутников, по которым можно вычислить свои координаты.
Где-то была готовая программа, но я ее не нашел, поэтому восстановил основной функционал, по примеру КомпутерКрафта.
Для начала нужен компьютер с установленной OpenOS.
Скачиваем для него программатор хостов: pastebin get ZD8GysNP /bin/fgps.lua
Эта программа позволяет устанавливать прошивку для спутников-микроконтроллеров, которые будут рассылать свои координаты по запросу.
Далее, соберем несколько микроконтроллеров с беспроводными картами, при необходимости обеспечим их энергией.Теперь надо установить прошивку для первой партии:
- узнаем координаты, где будет стоять очередной хост
- вставляем EEPROM в компьютер
- запускаем программатор, с указанием координат через пробел (например: fgps 1652 64 -152)


Прошитые карточки вставляем в микроконтроллеры (в сетке крафта) и расставляем в соответствии с координатами, указанными при прошивке.

Самое главное - не перепутать координаты. Если навести курсор на микроконтроллер и зажать LSHIFT, то будет виден лейбл биоса, который является подсказкой для его позиции.Когда первая партия размещена и активированна, остальные хосты можно прошивать без указания координат - они определят позицию сразу при включении (если они будут в радиусе действия четырех рабочих хостов)
Но лучше, конечно, чтобы каждый хост знал свои точные координаты. Ибо в случае небольшой ошибки в начале постройки, по мере расширения сети, погрешность будет увеличиваться, т. к. поправка будет производится по неверно вычисленным координатам хостов.Теперь проверим работу системы в деле.
Возьмем, например, планшет с беспроводным модемом.
Скачаем библиотеку GPS: pastebin get Dja9ZceV /lib/gps.lua
Запустим консоль Lua.
Загрузим библиотеку: local gps = require('gps')И попробуем получить координаты: gps.locate(true) (параметр DEBUG передаваемый в функцию работает как и в ComputerCraft - выводит все вспомогательные сообщения)


Каждый хост, при старте устанавливает wake-up сообщение и включается только чтобы ответить на запрос координат. Такой подход экономит огромное количество энергии и позволяет добиться полной автономности хостов - встроенной солнечной панели вполне хватает для работы.
Для стабильной работы надо будет добавить data-карту и реализовать протокол управления спутниками по прошитому открытому ключу, чтобы удобно было прошивать новые координаты при перемещении хоста на новое место.-
8
-
1
-
Тут видео надо, писать видео не могу, ибо негде писать звук.
-
Можно даже не изобретать велосипеды.
https://github.com/Nex4rius/Nex4rius-Programme/blob/master/Stargate-Programm/README.md#russian
-
1
-
-
Кнопки, это самый распространенный элемент интерфейса, и не потому, что их полно в каждой графической программе. Функционал кнопки наследует большинство средство ввода, например: ссылки, переключатели, ползунки, менюшки и т. д. Сейчас, огромные возможности для создания других, более подходящих ситуации способов ввода, но традиционно используются кнопки, которые появились в первых электронных устройствах, т. к. они просты и интуитивно понятны.
Внешний вид.
Обычная кнопка имеет прямоугольный вид, это позволяет не заморачиваться с алгоритмом взаимодействия, удобно отображать на ней текст/изображения, но если необходимо, ее можно сделать какой угодно формы.
Самое главное в кнопке это ее интерактивность, т. е. она должна не только выполнять функцию, для которой назначена, но и сигнализировать свой статус (иметь обратную связь).
Например, при нажатии на кнопку, она меняет цвет/визуально проваливается/издает звук, все это вместе или по-отдельности дает пользователю знать, что она активирована, а цветом или звуком можно даже передать состояние выполнения задачи, выполняемой этой кнопкой. А вот если пользователь нажимает на кнопку и ничего не происходит, то он может клацнуть по ней еще много раз, пока кнопка будет выполнять задачу. В большинстве случаев это довольно опасно - накликают беду, а винят программиста. Поэтому, если в текущей ситуации кнопка неактивна, надо это подчеркнуть, например, обесцветив ее или частично слив с фоном, можно дополнить специальным звуком.
Все это очевидно, поэтому не стоит об этом забывать.
Внутреннее устройство.
В графическом интерфейсе, кнопка это определенно обозначенное место на экране, в которое нужно тыкнуть, чтобы получить определенный результат, обозначенный на кнопке в виде текста/изображения или понимаемый из контекста.
Как это реализовать в OpenComputers?
Нам доступен вывод информации на монитор, посредством компонента GPU. Пока рассмотрим функции назначения цветов и вывода символов.
Работа с видеокартой.
Список методов видеокарты можно посмотреть на вики.
Для назначения цвета текста используется метод setForeground.
А чтобы задать цвет фона, есть метод setBackground. Чтобы проверить, как это работает обратимся к компьютеру с установленной OpenOS.
Запустим компьютер. Вводим команду edit gpu_test.lua, так мы запускаем текстовый редактор OpenOS, указывая, что нужно редактировать файл gpu_test.lua. Пока этого файла нет, но когда в редакторе нажмем Ctrl+S он сохранится.
Чтобы мы могли обратится к компоненту gpu, нам надо загрузить обертку для компонентов, предоставляемую OpenOS, она немного облегчает работу.Для этого, в самом начале программы пишем local component = require('component'), так, что это за письмена? Эта строка создает локальную переменную (указываем словом local перед именем переменной), далее указываем имя переменной.
Знак равенства указывает, что в переменной теперь будет хранится то, что дает функция require, в данном случае мы задали этой функции передать переменной component возможности обертки, которая тоже называется component. Так будет удобней понимать, к чему мы обращаемся.
На следующей строке пишем local gpu = component.gpu Это мы назначили переменной gpu все методы видеокарты, т. е. теперь можем обращаться к ней через эту переменную.При загрузке, OpenOS сделала несколько скрытых операций: определила основную видеокарту, подключила ее к монитору и добавила их к остальным компонентам, чтобы можно было обратиться по имени компонента и получить готовый интерфейс.
Итак, видеокарта готова к работе, теперь опишем, что она должна сделать.
Создаем переменные, содержащие информацию о цветах и тексте, с которыми мы будем работать.
local color1, color2, text = 0xff00ff, 0x0000ff, 'Hello, OpenComputers!'
При помощи параллельного присваивания мы задали две переменные с числовыми значениями цветов и переменную с текстом.
Теперь создадим простой цикл, в котором выведем текст на экран, назначая цвет текста и цвет фона.for i = 1, 10 do gpu.setForeground(color1) gpu.setBackground(color2) gpu.set(10, 5, text) color1, color2 = color2, color1 os.sleep(0.5) end
Сам код назначает тексту цвет, указанный в color1, а фону color2, затем выводит текст, содержащийся в переменной text на монитор, указывая координаты первого символа (от левого верхнего угла 10 символов в право, 5 символов вниз). Далее, параллельным присваиванием, меняем значения переменных местами, чтобы при следующем выполнении кода, цвета фона и текста поменялись. В конце цикла ставим задержку в пол-секунды, используя системную функцию sleep.
Цикл готов, теперь, в конце программы стоит добавить восстановление цветов текста и фона, т. к. по завершению ее работы, цвета останутся такими, которые были назначены в последний раз.
Готовый алгоритм будет примерно такой:local component = require('component') local gpu = component.gpu local color1, color2, text = 0xff00ff, 0x0000ff, 'Hello, OpenComputers!' for i = 1, 10 do gpu.setForeground(color1) gpu.setBackground(color2) gpu.set(10, 5, text) color1, color2 = color2, color1 os.sleep(0.5) end gpu.setForeground(0xffffff) gpu.setBackground(0)
Нажимаем Ctrl+S, чтобы сохранить файл, затем Ctrl+W, чтобы закрыть редактор. Теперь мы снова попали в шелл. Вызываем только-что созданную программу по имени: gpu_test, и наблюдаем ее выполнение. Так как координаты вывода жестко заданы, мы видим, что текст как-бы мигает. Чтобы увидеть эволюцию работы цикла, можно к координатам вывода добавить значения шага цикла. Для этого откроем файл edit gpu_test.lua, в функции gpu.set к каждому числу прибавим переменную-итератор. Теперь вызов функции gpu.set выглядит вот так: gpu.set(10+i, 5+i, text), сохраним изменения (Ctrl+S), закроем (Ctrl+W), и опять запустим тестовую программу gpu_test
Работа с вводом.
Со способом вывода информации более-менее разобрались, теперь разберемся с вводом, т. к. мы хотим создать графический интерфейс, хоть и 'псевдо', мы будем использовать возможность сенсорного ввода, клавиатуру поставим для других задач.
Монитор I уровня это только средство вывода, а мониторы второго и третьего уровня могут работать и как средство ввода.
Когда игрок прикасается к экрану, генерируется сигнал touch, содержащий в себе адрес монитора, координаты касания, код кнопки мыши и ник игрока. Нам остается отследить это событие и соответсвующим образом на него отреагировать.
Для демонстрации работы напишем небольшую тестовую программу, которая будет ловить события касания экрана, отображать место и числовые координаты.
Создаем файл edit click_test.lua
Первым делом подключаем управление видеокартой
local gpu = require('component').gpu
Затем, подключим мониторинг событий, который предоставляет OpenOS.
local pull_e = require('event').pull
Общая документация тут, мы воспользуемся только одной функцией.
Теперь позаботимся о пользователе, чтобы при завершении программы цвет фона остался такими же, как и перед запуском, мы его сохраним в переменную:
local b_color = gpu.getBackground() Эта функция сообщает цвет фона, который сейчас используется, для цвета текста есть getForeground, но в данном тесте мы будем управлять только цветом фона.
Так как у мыши две кнопки, в событии touch указывается код кнопки: ЛКМ = 1, ПКМ = 0
Чтобы визуально различать касания, создадим таблицу с цветами для каждой кнопки. В качестве индекса будет использоваться код кнопки.
local color = {[0] = 0x00ff00, 0x0000ff} т. е. ЛКМ будет обозначаться синим, ПКМ - зеленым.
Теперь создадим цикл, в котором будем ловить и обрабатывать события.
while true do
Как следует из описания функции event.pull, можно фильтровать ненужное, передав в функцию название интересующего нас события. Так как возвращается довольно много переменных, будем создавать из них таблицу, для большего удобства.
local tEvent = {pull_e('touch')}
Теперь все события типа touch будут пересоздавать таблицу tEvent, в которой будет заключена информация об этом событии. Обратиться к интересующей информации можно, указав номер, в той же последовательности, как это описано в документации по сигналам
Для начала добавим условие выхода из программы, т. к. цикл бесконечный и прервать его можно только грубо нарушив выполнение программы.
if tEvent[3] == 1 and tEvent[4] == 1 then
Если клик произошел по координатам (1, 1), выполнить следующий код:
gpu.setBackground(b_color) - вернем фону его первоначальное значение, полученное при запуске программы.
os.exit() - вызовем системную функцию выхода из программы.
Закроем условие:
end
А теперь опишем сам процесс отклика на касание.
Присваиваем фону цвет, исходя из полученного кода кнопки мыщи:
gpu.setBackground(color[tEvent[5]])
Устанавливаем по полученным координатам символ пробела, чтобы подсветить фон:
gpu.set(tEvent[3], tEvent[4], ' ')
Затем, по координатм (1, 1) показываем информацию о событии:
gpu.set(1, 1, 'x: '..tEvent[3]..' y: '..tEvent[4]..'\t\t')
В конце добавляется пустое место, чтобы не заморачиваться с затиранием предыдущих значений.
Закрываем цикл
end
В итоге получается такой код:local gpu = require('component').gpu local pull_e = require('event').pull local b_color = gpu.getBackground() local color = {[0] = 0x00ff00, 0x0000ff} while true do local tEvent = {pull_e('touch')} if tEvent[3] == 1 and tEvent[4] == 1 then gpu.setBackground(b_color) os.exit() end gpu.setBackground(color[tEvent[5]]) gpu.set(tEvent[3], tEvent[4], ' ') gpu.set(1, 1, 'x: '..tEvent[3]..' y: '..tEvent[4]..' ') end
Сохраним и запустим программу. Кликая мышкой по монитору мы видим, как она оставляет следы и обновляется информация в левом верхнем углу.
Кликнув в левый верхний угол мы завершаем работу программы. Значит, мы между делом создали кнопку, хоть и невидимую.
Принцип работы очень прост - пользователь кликнул по экрану, а программа сравнила координаты клика с координатами кнопки, если они совпали, то выполняется код, назначенный для этой кнопки.
Теперь создадим нормальные кнопки, с более удобной конфигурацией.
Все кнопки будут находиться в таблице, при каждом клике будем в цикле обходить таблицу, проверяя координаты.
Дополнительно напишем пару функций - одна будет подсвечивать нажатую кнопку, другая переключать видимость.
Каждая кнопка будет содержать следующие параметры: статус отображения (т. е. активна кнопка или нет), координаты, размер, цвет фона кнопки, цвет текста, текст и исполняемую функцию.{ visible = boolean, X = number, Y = number, W = number, H = number, color = number, textColor = number, text = string, action = function }Загрузим видеокарту и захват событий.
local gpu = require('component').gpu
local pull_e = require('event').pull
Для того, чтобы очистить экран при запуске и поставить кнопку выхода в угол, нам понадобится узнать и сохранить текущее разрешение.
local W, H = gpu.getResolution()
Сохраняем цвета фона и текста, чтобы вернуть их при завершении программы.
local b_color, f_color = gpu.getBackground(), gpu.getForeground()
Создаем таблицу tButtons, в ней мы будем хранить все кнопки.
Добавляем кнопку выхода из программы:
Изначальное состояние кнопки: visible = false,
Устанавливаем кнопку в правый верхний угол, задаем размер в один символ: X = W, Y = 1, W = 1, H = 1,
Устанавливаем цвета: color = 0xff0000, textColor = 0xffffff,
Задаем символ: text = 'X',
Функция завершения программы немного изменилась - устанавливаются первоначальные цвета, очищается экран и вызывается функция выхода.action = function() gpu.setBackground(b_color) gpu.setForeground(f_color) gpu.fill(1, 1, W, H, ' ') os.exit() end
Опишем функцию рисования кнопки, в которую будет передаваться индекс кнопки.
local function drawButton(n)
задаем цвет кнопки
gpu.setBackground(tButtons[n].color)
задаем цвет текста
gpu.setForeground(tButtons[n].textColor)
заливаем прямоугольник, который занимает кнопка (в данном случае, берем координаты и размер кнопки из ее таблицы)
gpu.fill(tButtons[n].X, tButtons[n].Y, tButtons[n].W, tButtons[n].H, ' ')
для большей красоты отцентрируем текст по границам кнопки, для этого вычислим половину высоты и половину ширины кнопки, прибавим их к координатам кнопки, а у ширины еще отберем половину длинны текста
gpu.set(tButtons[n].X+(tButtons[n].W/2)-(#tButtons[n].text/2), tButtons[n].Y+(tButtons[n].H/2), tButtons[n].text)
закрываем функцию
endДобавим переключение видимости кнопки.
local function toggleVisible(n)
if tButtons[n].visible then
если кнопка видима, то изменим статус tButtons[n].visible = false
установим цвет фона на тот, который был при запуске gpu.setBackground(b_color)
зальем прямоугольник фоновым цветом gpu.fill(tButtons[n].X, tButtons[n].Y, tButtons[n].W, tButtons[n].H, ' ')
else иначе:
изменим статус tButtons[n].visible = trueвызовем отрисовку этой кнопки drawButton(n)
закроем условие и функцию end end
Чтобы кнопка подмигивала при активации, создадим функцию меняющую цвет фона и текста, как в первом примере.
Для получения и назначения цветов обратимся к параметрам кнопки по индексу, как и в прошлых функциях.
меняем цвета tButtons[n].color, tButtons[n].textColor = tButtons[n].textColor, tButtons[n].color
рисуем кнопку drawButton(n)
делаем задержку os.sleep(0.09)
возвращаем цвета tButtons[n].color, tButtons[n].textColor = tButtons[n].textColor, tButtons[n].color
заново рисуем кнопку, с номальными цветами drawButton(n)
Функции описаны, теперь напишем саму программу.
При запуске очистим экран gpu.fill(1, 1, W, H, ' ')
Можно вынести ее в отдельную функцию, но в данном примере очистка вызвается только два раза - при запуске и при выходе.
Теперь активируем все нужные кнопки. В данном примере можно запустить все кнопки, поэтому пройдем в цикле по таблице с кнопками и для каждой вызовем переключатель видимости.for i = 1, #tButtons do toggleVisible(i) end
И опишем главный цикл.
while true do
ловим событие в таблицу tEvent local tEvent = {pull_e('touch')}
перебираем все кнопки for i = 1, #tButtons do
если кнопка видима if tButtons.visible then
сравниваем координаты клика с прямоугольником кнопки
if tEvent[3] >= tButtons.X and tEvent[3] <= tButtons.X+tButtons.W and tEvent[4] >= tButtons.Y and tEvent[4] <= tButtons.Y+tButtons.H then
если клик попал по этой кнопке, заставляем ее мигнуть blink(i)
выполняем функцию, которая назначена для нее tButtons.action()
прерываем цикл проверки кнопок break
закрываем циклы и условия end end end end
На этом все, программа готова, в готовом примере я добавил три кнопки - 'set' выводит строку, а 'del' стирает и бибикает спикером, 'reboot' перезагружает компьютер.local gpu = require('component').gpu local computer = require('computer') local pull_e = require('event').pull local W, H = gpu.getResolution() local b_color, f_color = gpu.getBackground(), gpu.getForeground() local tButtons = { { visible = false, X = W, Y = 1, W = 1, H = 1, color = 0xff0000, textColor = 0xffffff, text = 'X', action = function() gpu.setBackground(b_color) gpu.setForeground(f_color) gpu.fill(1, 1, W, H, ' ') os.exit() end }, { visible = false, X = 1, Y = 3, W = 7, H = 1, color = 0x008800, textColor = 0xffff00, text = 'set', action = function() gpu.setForeground(0xffffff) gpu.set(1, 1, 'Hello!') end }, { visible = false, X = 1, Y = 5, W = 7, H = 1, color = 0xAA0000, textColor = 0xffffff, text = 'del', action = function() computer.beep(1000, 0.1) gpu.setBackground(0) gpu.fill(1, 1, 6, 1, ' ') end }, { visible = false, X = 1, Y = 7, W = 7, H = 1, color = 0xffffff, textColor = 0, text = 'reboot', action = function() computer.shutdown(true) end } } local function drawButton(n) -- функция рисования кнопки gpu.setBackground(tButtons[n].color) -- задаем цвет кнопки gpu.setForeground(tButtons[n].textColor) -- задаем цвет текста gpu.fill(tButtons[n].X, tButtons[n].Y, tButtons[n].W, tButtons[n].H, ' ') -- заливаем область gpu.set(tButtons[n].X+(tButtons[n].W/2)-(#tButtons[n].text/2), tButtons[n].Y+(tButtons[n].H/2), tButtons[n].text) -- пишем текст по центру end local function toggleVisible(n) -- переключение видимости кнопки if tButtons[n].visible then -- если кнопка видима tButtons[n].visible = false -- отключаем gpu.setBackground(b_color) -- берем цвет фона, полученный при старте программы gpu.fill(tButtons[n].X, tButtons[n].Y, tButtons[n].W, tButtons[n].H, ' ') -- стираем кнопку else -- если кнопка не активна tButtons[n].visible = true -- активируем drawButton(n) -- запускаем отрисовку end end local function blink(n) -- мигание кнопки tButtons[n].color, tButtons[n].textColor = tButtons[n].textColor, tButtons[n].color -- меняем местами цвета фона и текста drawButton(n) -- отрисовываем кнопку os.sleep(0.09) -- делаем задержку tButtons[n].color, tButtons[n].textColor = tButtons[n].textColor, tButtons[n].color -- меняем цвета обратно drawButton(n) -- перерисовываем кнопку end gpu.fill(1, 1, W, H, ' ') -- очищаем экран for i = 1, #tButtons do toggleVisible(i) -- активируем каждую кнопку end while true do local tEvent = {pull_e('touch')} -- ждем клика for i = 1, #tButtons do -- перебираем все кнопки if tButtons[i].visible then -- если кнопка активна if tEvent[3] >= tButtons[i].X and tEvent[3] <= tButtons[i].X+tButtons[i].W and tEvent[4] >= tButtons[i].Y and tEvent[4] <= tButtons[i].Y+tButtons[i].H then -- если клик произведен в пределах кнопки blink(i) -- мигнуть кнопкой tButtons[i].action() -- выполнить назначенный код break end end end end
-
10
-
-
Я хотел предложить 1D арену, намного меньше возни, а возможности те же, что и на текущей.
-
1
-
-
Еще обязательно наличие аддона OpenPeripheral, без него блоки из модов имеют только функционал сундука.
-
У меня давно есть готовый каркас, ни одну нормальную стратегию не придумал, кроме как прятаться на спавне. Предлагал игрокам поучаствовать, но никто не заинтересован.
Видимо, сама идея не подходящая, у конкурсов должен быть самый низкий порог вхождения, с постепенным повышением, чтобы захватить как можно большую аудиторию. Но организаторы как всегда, делают не для людей, а для своего развлечения.
-
2
-
-
Бомбы появились почти перед самым запуском, это радует. Но как видно, арена маленькая и укрытия не слишком надежные, пушки потребляют довольно мало.
Теперь ясно, что требуется от роботов и вообще, есть общее представление. Сам вряд-ли буду участвовать, но отдам код любому желающему.
-
1
-
-
Если бы все было нормально подготовлено и запланировано, то в целом, очень неплохо. А 3-12 FPS отбивают желание двигаться с места, к тому-же чизель... Новый майн и чизель. Как-будто нет дебаги и ванильных блоков.
Можно с большим успехом воскресить мой лабиринт, благо, компьютерных квестов накопилось достаточно, проблема только с задержкой при телепортации в 1-2 тика, которая портит ощущение присутствия.
На дезматч попасть не смогу, но даже если б смог, не пошел бы. Слишком лагучая сборка, да и участников нет.
Стоит развить тему компьютерных квестов, придет больше народу не только смотреть, но и участвовать. Конечно, надо все нормально проработать, как то: не гонять всех в принудительном порядке одним табором, отрубить чат, сделать больше интерактивности и скрытых возможностей.
-
1
-
-
Цырк! Участников нет! Дохлые тигры! Иллюзионисты-перевертыши!
Предлагаю переоформить концепцию - создавать программы в реальном времени, в течении, например, трех дней. А по завершении указанного срока запускать соревнование. Тогда это будет похоже на настоящий конкурс и у участников будет хоть какой-то стимул закончить начатое.
-
1
-
-
Ха, только что хотел сделать такой же велосипед.
Только это не шрифт Брайля, а псевдографические символы предназначенные для вывода монохромных изображений, a путем нехитрой манипуляции можно сделать их цветными (дикое смешивание цветов, хуже чем jpeg, но для рекламных панелей сойдет).
-
1
-
-
Если загружать мир и необходимые параметры, разбивать кадр на несколько частей и рендерить на нескольких компах, тогда не так сильно будет влиять ограничение процессоров и разрешение можно сделать больше, хотя бордюры у мониторов будут все портить.
Но как по-мне, эффективней рендерить на реальном сервере, подавая готовую картинку опенкомпам через интернет карту. Таким образом, опенкомп будет освобожден от уймы вычислений и занят только отрисовкой. Чтобы повысить интерактивность можно снизить пинг - производить вычисления на той же машине, на которой работает MC сервер.
-
При вызове функции сканирования надобно указывать дальность, тогда все нормально. Таблица вполне очевидная, в ней лежат таблицы с информацией о найденых игроках.
Документация довольно бедная, но потыкав любой блок через OpenOS можно во всем разобраться.
https://github.com/PC-Logix/OpenSecurity/wiki
И да, сканирование сущностей не работает, никто не знает почему, даже сам автор. После трех сканов, блок перестает выдавать инфу.

init.lua, boot.lua
в Разные (отсортировать)
Опубликовано:
http://minecraft-ru.gamepedia.com/OpenComputers/Component_API