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

Лидеры


Популярный контент

Показан контент с высокой репутацией 16.10.2018 во всех областях

  1. 5 баллов
    Еще мой дед говаривал, что каждый кодер на ОС просто обязан начать писать собственный эмуль для самоутверждения. Не желая изменять семейным ценностям, я тоже окунулся с головой в эту клоаку. Вообще в существующих эмуляторах лично меня люто бесит возня с ручной компиляцией, докачиванием всяческих либ по типу openssl, а также отсутствие возможности запуска нескольких виртуальных компиков в едином пространстве с масштабированием экранов, не говоря уже про пересылку данных между ними посредством не менее виртуальных модемов. Поэтому почесав репу, собрав JavaFX + LuaJ, накатав несколько компонентов, на данный момент я заимел следующие зачатки проекта: Библиотеки computer, component, unicode Компоненты computer, eeprom, filesystem, gpu, modem, screen, keyboard Имитация системных сигналов по типу touch/drag/drop/key_down/key_up/scroll/modem_message с поддержкой pullSignal/pushSignal Пересылка сетевых пакетов между имеющимися машинами в рабочем пространстве через modem.send/broadcast BSOD для "unrecoverable error" Звуковая система а-ля "комп в мире кубача", имитирующая звуки доступа к диску, и прикольно шумящая на фоне для антуража Создание/сохранение/загрузка виртуальных машин с сериализацией данных имеющихся компонентов. Ну, всяких там адресов, разрешений видях, размеров, координат и т.п. Кнопочка включения (!) Разумеется, компоненты имеют далеко не все методы, их написание - дело долгосрочное. Но поскольку этот раздел называется блогом, то, кажется, никто не мешает мне писать о запланированном. В идеале хочу замутить компоненты internet, tunnel и data, позволить юзерам выбирать пути к прошивке виртуального EEPROM и содержимому жесткого диска. Также остается открытым вопрос о лимитировании памяти: я понятия не имею, как это реализовать на LuaJ и ублюдочной Яве без обожаемого sizeof(). Городить костыли в виде JavaAgent + Instrumentation.getObjectSize не хочется, но, видимо, придется. Ну, и если у кого-то имеются занятные предложения по функционалу софтины - буду рад. Сырцы: https://github.com/IgorTimofeev/OpenComputersVM Скриншотик:
  2. 1 балл
    Жаль не могу принять участие, но если нужна идея - что-то наклевалось. Раньше были популярны различные стрелялки аркадной тематики, но сейчас как-то забыли про них... Так вот, одна идея ко мне прицепилась, и не хочет отстать) (картинка делалась пара минут, так что качество соответствующее) Классический, можно сказать, аркадный спейс-шутер...? Небольшая история для объяснения ситуации: На корабле одного космического путешественника вышла из строя система контроля двигателя обратной гравитации (надо вовремя софт обновлять, что уж тут). В результате этого, корабль стал постоянно двигаться вперед, и остановить его невозможно. К счастью, коррекционными двигателями ещё возможно управлять, что позволит обходить некоторые препятствия. Но к сожалению, двигатель обратной гравитации является мощным источником гравитационных сил, в результате чего космические объекты притягиваются к кораблю, и намереваются облепить его со всех сторон. В борьбе с ними должны помочь бортовые плазменные установки , которые разрушают весь космический мусор в пыль, и он уже не сможет с такой яростью преследовать корабль. "Когда-нибудь энергия для подпитки реактора закончится (или нет ), и корабль остановится, но до того момента остается надеяться на свою сноровку." - цитата персонажа. Помимо космического мусора к кораблю могут притягиваться бедные инопланетяне, многие из них будут разгневаны подобными обстоятельствами, и намерены уничтожить корабль. Ну а нам что? Тоже надо как-то выживать. Ну и соответственно некоторые механики которые тут могут быть реализованы: - Движение объектов с постоянной скоростью к кораблю. - Гравитационная сила, действующая на объекты, в зависимости от их "массы"(чем меньше объект - тем сильнее притяжение). - Маневры корабля влево-вправо. - Также, для фана можно добавить удары слева/справа по абстрактному "автомату", в результате чего кораблю резко сдвинется с места. - Стрельба и разрушение объектов, чем больше объект - тем больше выстрелов необходимо на уничтожение. - Коллизия с космическими объектами. При столкновении с большими объектами - уничтожение корабля. Маленькие объекты могут блокировать двигатель маневрирования или плазмомет на некоторое время, а также нанесение некоторого урона кораблю. - Марс атакует! Оружие инопланетных злых соседей. - Ну и соответственно всякие плюшки, типа "круговая оборона"(щит, разрушающий мелкие объекты), или больше плазменных пушек, и т.п. Фух, ну теперь я спокоен)
  3. 1 балл
    Ну это та самая онлайновая штука, на которую тебе Механик вроде ссылку кидал. Ocelot. Где сейчас коллаборатив и коммунизм. 😃 Сорцы пока закрыты, я нигде не постил инфу, но если ты добавишься к нам в группу на GitLab, то сможешь их полистать. Написано оно на Scala, с максимальным переиспользованием кода из самого OpenComputers. Поэтому там нет проблем с лимитированием ресурсов и прочим - используется либа Сангара Eris через пропатченный Сангаром JNLua. Как в самом моде. Теоретически ты бы мог взять ядро Оцелота (проект ocelot-brain) и подключить в свой проект как библиотеку, и тогда у тебя был бы готовый эмулятор, и осталось бы только обернуть в симпатичный интерфейс. Эта штука - это по сути OpenComputers из которого выдран весь Майнкрафт и добавлен библиотечный API. Но самому конечно интереснее запилить. )
  4. 1 балл
  5. 1 балл
    Аватарки, медальки, чатики, панельки, отступы и цветовая гамма – всё это мелочи, которые можно будет скорректировать со временем. Сейчас главная проблема форума в его функциональности. Во-первых, желательно как можно скорее дать пользователям возможность редактировать собственные посты. Это, я думаю, будет настроено. Хуже другое. WYSIWYG-редактор превращает редактирование хоть сколь-нибудь сложного поста в очень муторное и наполненное бессмысленной рутиной занятие. BBCode позволял редактировать посты заметно быстрее. Примеры: 1) Я добавляю в пост несколько цитат и пишу ответы на них. В какой-то момент я решаю переместить одну из цитат с ответом в другое место поста. При редактировании в BBCode я стрелками на клавиатуре помечал цитаты вместе с ответами, вырезал помеченное в буфер обмена и затем вставлял в нужное место. Сейчас с клавиатуры цитата не помечается. Её, видите ли, нужно выделять мышкой, внимательно вглядываясь в экран, чтобы не промахнуться. Клавиатура же позволяет выполнять это действие почти не глядя на экран. 2) Раньше я запросто забирал текст в BBCode из формы и редактировал его в любом удобном для меня редакторе и снова возвращал его в форму отправки. Сейчас это стало лишь частично возможным. При переносе в простой текстовый редактор все абзацы склеиваются в один. А после переноса в Writer и обратно цитата перестаёт оформляться цитатой. 3) Иногда на форуме появляются посты сеошников с малозначащей инфой вида "о, прикольная программа" и десятком скрытых ссылок на свой сайты. Раньше, увидев подозрительный пост, я просто включал редактирование в BBCode, и содержимое поста полностью раскрывалось. А теперь, если автор пишет невидимыми символами скрытые ссылки, то как я смогу их увидеть в WYSIWYG? 4) Предположим, я написал какой-то гайд. Раньше я сразу писал его в BB-кодах, где-то у себя в файлике сохранял, после чего публиковал на форуме. При обнаружении небольших опечаток исправлял прямо на форуме. Ну, или кто-то из администраторов и модераторов тоже могли что-то изменить. Предположим, я решил этот гайд заметным образом переработать. Раньше я заходил в форму редактирования поста, забирал из неё BB-код, сохранял его в новый файл, выполнял diff, и при необходимости синхронизировал исходник. Далее редактировал текст как обычно и обновлял пост. Но как теперь обновлять статьи с контролем выполненных изменений, мне не ясно. Как выполнять diff над текстом в WYSIWYG? Итог: без BBCode редактирование постов стало менее удобным. Обновление движка всё ещё символизирует развитие и прогресс? Дуров, верни стену! Админы, верните BBCode!
  6. 1 балл
    Лучше бы вместо того, чтобы язвить - помог бы, а не задротил в свою рыбалку..
  7. 1 балл
    Ну, ведь пикчу-то можно было вставить по-нормальному, а не ссылкой избитой? Здесь... кто-то явно на лиспе покодился, что уж тут скажешь. ...Тоисть чтоуш тут скажеш. Но если серьёзно: что это? что оно делает (или хотя б должно делать)? Здесь раздел «Инфраструктура»: если хочется кинуть прогу в помойку, где не надо разбираться, дописана ли она, и мучаться с оформлением темы, лучше было в «Программы новичков» запостить тогда, тем более, что: А так... с каждой такой темой в мире страдает один фингер — страдает! Вот, глаз заболел даже левый. Прошу посему пощады.
  8. 1 балл
    О святой код спаси нас!
  9. 1 балл
    Дроны - как керосин. Они есть везде. Еще года два назад это было просто еще одно интересное видео на Ютубе. Год назад они вдруг оказались в интернет магазинах. Затем просочились в рекламу на ТВ, и вот теперь - они есть и в OpenComputers! Пришла пора с ними разобраться. 1. Матчасть Дрон, в данном случае - квадрокоптер, это беспилотный летающий аппарат, приводимый в движение двумя парами горизонтальных винтов. Приостановливая вращение винтов с одного боку, дрон двигается в сторону (стрейф). Эти винты вращаются в разном направлении (два - по часовой срелке и два - против), за счет чего дрон не нуждается в стабилизирующем хвостовом пропеллере (как вертолет). За счет этого же он и разворачивается в воздухе, замедлив вращение однонаправленной пары винтов. Дрон обладает небольшой массой, для экономии энергии, которой у него не много (на 10-30 минут полета в среднем). (с) Википедия 2. Дроны и OpenComputers Приблизительное изображение дрона в OpenComputers =): В мире Майнкрафта дрон представляет из себя "сущность" (Entity). Это значит, что он обладает возможностями мобов Майнкрафта. (В то время как робот - это блок.) Его можно сдвинуть с места толкая. Он умеет пролетать сквозь двери и калитки (в отличии от робота). Он движется не последовательно, из блока в блок, а из точки в точку. Причем маршрут может лежать по диагонали. Конечно, движется он по кратчайшей линии, и если на пути окажется стена - дрон столкнется с нею. Программирование дрона как две капли воды похоже на программирование микроконтроллера. Вы точно так же записываете программу на EEPROM, и при необходимости меняете ее на верстаке. Только в отличии от контроллера, вам становится доступен новый компонент: drone. Подробнее об командах дрона можно узнать здесь: OpenComputers/Дрон. (Или здесь: ocdoc.wiki (англ.)) 3. План Нужна какая-нибудь несложная задача, для целей эксперимента. Используем программку send из предыдущего поста, для удаленного управления. Зальем ее на планшет. А дрон пусть... носит свиней. Будем оригинальными и непоследовательными. 1. Команда 'add X Y Z Name From'. Добавляем точку Name к маршруту, цепляя ее к точке From. Зададим дрону последовательность точек, которые образуют граф - безопасные маршруты. 2. Команда 'catch' - дрон ловит свинью. 3. Команда 'drop' - дрон выпускает свинью. 4. Команда 'to X' - дрон летит в точку Х. Для начала не будем особо заморачиваться с графом маршрутов. Это будет простое неориентированное дерево. Примерно такое: 4. Строим полигон Построим что-нибудь подходящее для тестов. Отметим ключевые точки будущего графа красными блоками. А синий блок - будет стартовой площадкой дрона. Поскольку я играю без модов на энергию, мой планшет и дрон будут работать вечно. И я не заморачиваюсь станцией подзарядки. Иначе, к схеме выше было бы необходимо добавить станцию, где дрон мог бы зарядить аккумулятор. 5. Пишем программу Скрипт для удаленного управления скопипастим из прошлого поста, подправим, чтобы умела отправлять несколько переменных и зальем на планшетик, для удобства. (Для этого, соберите планшет - не забудьте клавиатуру и видеокарту! - положите его в зарядник и запустите с подключенного компа команду install. Укажите адрес винчестера планшета - и все, что было у вас на компе автоматически загрузится в планшет, включая даже ваши собственные программы.) local com = require('component') local modem = com.modem local args = {...} modem.broadcast(27, table.unpack(args)) io.write("Message: ") print(table.unpack(args)) Далее - более сложная часть. Программа дрона. Программа предназначена для EEPROM. Значит соблюдаем те же правила: используем computer, component и API имеющихся у дрона компонентов. Включая его родной компонент drone. В нашем случае, дрон вооружен апргейдом-лассо (leash) и беспроводной сетевой картой (modem) для связи. Стоит отметить, что процесс отладки программы (по крайней мере в текущем билде мода) достаточно неудобен. В случае ошибки дрон отказывается включиться, издав тонкий писк, и не выводя никакой информации. Получить отчет об ошибке при помощи анализатора не выйдет - ведь Shift+ПКМ просто снимает дрона. Автор обещал в скором времени это исправить. Ну а пока - помучаемся. Отредактировать чип в стороннем редакторе, не вынимая его из дрона тоже не выйдет. В отличии от файловых систем, которые имеют удобную папку вида /saves/World/opencomputers/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/, чипы EEPROM хранят свой код в NBT тегах предмета. Этим же обусловлено и ограничение размера кода в 4 килобайта. 5.1. Основная часть Это цикл который ждет указаний, а затем запускает соответствующую функцию. drone = component.proxy(component.list("drone")()) modem = component.proxy(component.list("modem")()) leash = component.proxy(component.list("leash")()) modem.open(27) route = {} path = {} current = "" while true do name, _, sender, _, _, message, x, y, z, point, from = computer.pullSignal(1) if name == "modem_message" then if message == 'add' then add(tonumber(x), tonumber(y), tonumber(z), point, from) if current == "" then current = point end elseif message == 'to' then to(x) elseif message == 'catch' then catch() elseif message == 'drop' then drop() end end if #path > 0 and drone.getOffset() < 1 then drone.move(route[path[#path]].x-route[current].x, route[path[#path]].y-route[current].y, route[path[#path]].z-route[current].z) current = path[#path] path[#path] = nil end end modem.close() Чтобы облегчить себе жизнь (и тестирование bios), вы можете сделать так: напишите заглушку для компонента drone (и других, если надо), вроде этой: http://pastebin.com/EVYzN5Bj Просто скопируйте в папку на компьютере, где вы пишете программу для дрона. Затем измените первые строки программы следующим образом: component = require('component') computer = require('computer') drone = require('drone') modem = component.modem -- leash = component.proxy(component.list("leash")()) Затем добавьте в цикл условие выхода по нажатию кнопки: if name == 'key_down' then break end И вы можете просто запустить вашу программу для дрона на компьютере. Разумеется полноценной эмуляцией дрона тут и не пахнет, зато очень удобно отслеживать глупые синтаксические и логические ошибки. Как устроен код основного цикла? Переменная route - хранит таблицу "вейпоинтов" (waypoints). Это вершины графа и информация о связях между ними. Переменная path - хранит путь от текущей вершины до цели. Переменная current - отмечает текущее местоположение дрона в графе. В цикле мы читаем получаемые сообщения и вызываем соответствующие функции. Первая переданная вершина считается дроном текущей. Во второй части цикла происходит проверка. Если путь до цели - не пуст (это значит, что дрону надо куда-то лететь) и дрон уже долетел до текущей вершины (getOffset()), то программа берет следующую вершину из path, отправляет дрона к ней и объявляет ее текущей. 5.2. Функции-команды Теперь последовательно добавим функции для каждой команды. function add(x, y, z, name, from) route[name] = {x=x, y=y, z=z, link = {}} if from ~= nil then if route[name] == nil or route[from] == nil then drone.setStatusText("Error!") else table.insert(route[name].link, from) table.insert(route[from].link, name) end end end Тут все просто. Пишем вершину в список. Если он связана с другой вершиной (from ~= nil), то в специальную табличку link заносим две связи: из name в from, и из from в name. function search(target, point, prev) for key, name in pairs(route[point].link) do if name == target then table.insert(path, point) return true end end for key, name in pairs(route[point].link) do if name ~= prev then if search(target, name, point) then table.insert(path, point) return true end end end return false end function to(name) path = {} table.insert(path, name) search(name, current) end Функция to обнуляет старый путь (на всякий случай), затем вставляет в него цель пути (name) и запускает функцию search, которая рекурсивно ищет и записывает остальные промежуточные вершины на маршруте от name до current (текущей локации). Функция search сделана достаточно примитивно (возможно вы предложите более эффективный способ?). Поскольку мы договорились, в целях упрощения использовать граф-дерево (не содержаший петель), от любой точки к другой существует один и только один маршрут, который функция и находит перебором связанных вершин. function catch() for c = 2, 5 do if leash.leash(c) then return true end end return false end function drop() leash.unleash() end Тут все элементарно. 6. Подготовка Пишем программу на дрона, заряжаем планшет и выдвигаемся в зону действий. Дрона ставим на синий куб (стартовая площадка) и включаем. После уточнения на местности, составляем карту вейпоинтов и строим на бумажке будущий граф: Для каждого загона добавлены две точки - name и name_up. Основные "трассы" дрона лежат на высоте в 6 блоков. А в каждом загоне спускаются к земле. (Чтобы заарканить животное, выстреливая лассо вбок, дрону желательно находиться на одном уровне с жертвой). С планшета вносим координаты в память дрона. Примерно так: Главное - не ошибиться. Т.к. в код не была добавлена защита "от дурака" =) Алгоритм позволяет добавлять вершину "на лету". В любой момент вы можете добавить еще одну ветку к схеме. Теперь все готово к тесту. 7. Запуск Все готово. Проверим, как он двигается. Введем send to sheeps в консоль планшета. Дрон уверенно поднимается в воздух и опускается в загоне в овцами. Теперь введем send to pigs. Функция search снова вычислит путь и робот переместится в указанную вершину: Функции catch и drop тоже работают штатно =) Хотя и не лишены некоторых глюков (ведь физика веревки не просчитывается): 8. Итоги а) Дрон - любопытная штуковина. б) Полный код прошивки. использованный в этом посте - здесь: http://pastebin.com/Cy1UR6vy в) Навигация по вейпоинтам - интересный и очень распространенный способ организации сложного движения. Схему можно усложнить - опционально добавлять только одну связь в таблицу link - тогда получатся ребра с односторонним движением. Добавить петли, оптимизировать поиск кратчайшего пути. Еще можно облегчить правление дроном - хранить все команды для конкретной задачи в виде файла-скрипта, который запускать одной командой и т.д. Enjoy!
Эта таблица лидеров рассчитана в Москва/GMT+03:00
×
×
  • Создать...