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

Totoro

Гуру
  • Публикации

    1 950
  • Зарегистрирован

  • Посещение

  • Победитель дней

    289

Сообщения, опубликованные пользователем Totoro


  1.  

    Интересные ссылки:
    Colors API
    Paintutils API

    Исходник простенькой кнопочки:

    --Кнопку лучше всего использовать при помощи АПИ parallel
    
    local function draw(x, y, text, color)
    paintutils.drawLine(x, y, (string.len(text)+x+1), y, color)
    term.setCursorPos(x+1, y)
    write(text)
    end
    
    function button(x, y, text, nColor, pColor)
    draw(x, y, text, nColor)
    while true do
    local event, p1, p2, p3 = os.pullEvent("mouse_click")
    if ((p2 >= x and p2 <= (x+string.len(text)+1) and (p3 == y))) then
    draw(x, y, text, pColor)
    sleep(0.1)
    end
    end
    end
    


  2.  

    Из-за включения фрапса начала подлагивать игра, так что не удивляйтесь, что вместо нужной цифры иногда выходила какая то другая.  Без фрапса все работает нормально

    Использовал 1 компьютер. Саму программу написал за 15 минут. Размер проги всего 14 строк   :D

    num1 = {119, 68, 61, 109, 78, 107, 123, 69, 127, 111}
    num2 = {15232, 8704, 7808, 13952, 9984, 13696, 15744, 8832, 16256, 14208}
    while true do
    time = textutils.formatTime(os.time(), true)
    len = string.len(time)
    if len == 4 then h1 = 0
    else h1 = string.sub(time, 1, 1) end
    h2 = string.sub(time, len-3, len-3)
    m1 = string.sub(time, len-1, len-1)
    m2 = string.sub(time, len, len)
    rs.setBundledOutput("back", num1[h1+1]+num2[h2+1])
    rs.setBundledOutput("bottom", num1[m1+1]+num2[m2+1])
    sleep(0.1)
    end
    

  3.  

    Компьютер:

    rednet.open("top")
    while true do
    event, key = os.pullEvent()
    print("key = ", key)
    rednet.send(2, tostring(key))
    end
    

    Черепашка:

    rednet.open("right")
    while true do
    sender, command = rednet.receive()
    if command == "17" then turtle.forward()
    elseif command == "31" then turtle.back()
    elseif command == "30" then turtle.turnLeft()
    elseif command == "32" then turtle.turnRight()
    elseif command == "42" then turtle.down()
    elseif command == "57" then turtle.up()
    elseif command == "18" then turtle.dig()
    elseif command == "16" then turtle.place() end
    end
    
    

  4. pword = "123"
    
    core = "9"
    
    
    
    local function clear()
    
    term.clear()
    
    term.setCursorPos(1, 1)
    
    end
    
    
    
    local function pulse(side, freeze)
    
    rs.setOutput(side, true)
    
    sleep(freeze)
    
    rs.setOutput(side, false)
    
    end
    
    
    
    function os.pullEvent()
    
    local event, p1, p2, p3, p4, p5 = os.pullEventRaw()
    
    if event == "terminate" then write("Nice try :D") end
    
    return event, p1, p2, p3, p4, p5
    
    end
    
    
    
    while true do
    
    clear()
    
    write("Lock system\nPassword: ")
    
    input = read("*")
    
    if input == pword then pulse("left", 3)
    
    elseif input == core then break end
    
    end
    

  5. Material Design как раз используется в полимере

     

    Удобная вещь. Есть готовый набор компонентов на все случаи жизни, и более менее выглядит нормально.

    Чем-то на Bootstrap похоже.

     

    Хотя я вот сейчас другой проект делаю, и думаю попробовать с нуля собрать дизайн. В своём стиле.

    Посмотрим, получится или нет.


  6.  

    Компьютер-пешка:

    side = {"top", "right", "bottom", "left"}
    
    host = 1
    
    rednet.open("back")
    
    
    
    local function bin(s)
    
    if rs.getInput(s) then return 1 end
    
    return 0
    
    end
    
    
    
    while true do
    
    sender, msg = rednet.receive()
    
    if sender == host then
    
    concat = ""
    
    for i = 1, #side do
    
    concat = concat .. bin(side[i])
    
    end
    
    rednet.send(sender, concat)
    
    end
    
    end
    

    Сервер-опросчик:

    id = {0, 3, 4}
    
    rednet.open("back")
    
    
    
    local function bin(element)
    
    if element == "1" then return "true" end
    
    return "false"
    
    end
    
    
    
    local function format(str)
    
    local form = ""
    
    for i = 1, string.len(str) do
    
    form = form .. "#" .. i .. " - " .. bin(string.sub(str, i, i)) .. "\n"
    
    end
    
    return form
    
    end
    
    
    
    while true do
    
    sender, msg = rednet.receive()
    
    if msg == "batstat" then
    
    concat = ""
    
    for i = 1, #id do
    
    rednet.send(id[i], "")
    
    thisId, thisIdAnswer = rednet.receive(5)
    
    concat = concat .. thisIdAnswer
    
    end
    
    rednet.send(sender, format(concat))
    
    end
    
    end
    

  7.  

    Lib

    function write2file(path, array)
    
    f = fs.open(path, "w")
    
    for i = 1, #array do
    
    f.writeLine(array[i])
    
    end
    
    f.close()
    
    end
    
    
    
    function readFromFile(path)
    
    f = fs.open(path, "r")
    
    local array = {}
    
    local i = 1
    
    local temp
    
    while true do
    
    temp = f.readLine()
    
    if not temp then break end
    
    array[i] = temp
    
    i = i + 1
    
    end
    
    f.close()
    
    return array
    
    end
    
    
    
    function array2String(array, d)
    
    string = ""
    
    for i = 1, #array do
    
    string = string .. array[i] .. d
    
    end
    
    return string
    
    end
    

    Send

    local args = {...}
    
    os.loadAPI("lib")
    
    
    
    array = lib.readFromFile(args[1])
    
    string = lib.array2String(array, "\n")
    
    rednet.open("top")
    
    rednet.send(tonumber(args[2]), string)
    

    Receive

    os.loadAPI("lib")
    
    rednet.open("top")
    
    id, msg = rednet.receive()
    
    print(msg)
    
    array = {}
    
    array[1] = msg
    
    lib.write2file("test", array)
    

  8. tArgs = {...}
    local FFormat = ".arch"
    local nFile, nDir, size = 0, 0
    if #tArgs < 3 then
    print("Usage:"
    .."\nTo zip folder and its files and subfolders use"
    .."\narchive zip... "
    .."\nIn you able to set folders that will be skipped, for example \"rom\" "
    .."\n\nTo unzip zipped archive to selected folder use"
    .."\narchive unzip"
    .."\n\nThis app is useful with pastebin.\nProgrammed by 1Ridav")
    end
    
    local function fopen(path, mode)
    local f = fs.open(path, mode)
    if not f then
    print("ERROR: Could not open "..path.." with mode \""..mode.."\"")
    exit()
    end
    return f
    end
    
    local function skip(df)
    for i = 3, #tArgs do
    if tArgs[i] == fs.getName(df) then
    return true
    end
    end
    return false
    end
    
    local function zip(file)
    print("zipping: ".. file)
    local f = fopen(file, "r")
    local z = textutils.serialize(f.readAll())
    f.close()
    return z
    end
    
    local function ZIP(path)
    local list = fs.list(path)
    local array = {}
    local t, name, d = 0, "", 0
    
    for i = 2, #list * 2, 2 do
    t = i/2
    local tpath = path.."/"..list[t]
    if fs.isDir(tpath) then
    if not skip(tpath) then
    name = "D:"..list[t]
    array[i] = ZIP(tpath)
    nDir = nDir + 1
    end
    else
    name = "F:"..list[t]
    array[i] = zip(tpath)
    nFile = nFile + 1
    end
    array[i - 1] = name
    end
    
    return textutils.serialize(array)
    end
    
    local function unzip(text, path)
    print("unzipping: "..path)
    local f = fopen(path, "w")
    f.write(textutils.unserialize(text))
    f.close()
    end
    
    local function UNZIP(text, path)
    local array = textutils.unserialize(text)
    local unz, dp
    local d = 0
    for i = 2, #array, 2 do
    if string.sub(array[i-1], 1, 1) == "D" then
    dp = string.sub(array[i-1], 3, #array[i-1])
    fs.makeDir(path.."/"..dp)
    UNZIP(array[i], path.."/"..dp)
    nDir = nDir + 1
    elseif string.sub(array[i-1], 1, 1) == "F" then
    local p = string.sub(array[i-1], 3, #array[i-1])
    unzip(array[i], path.."/"..p)
    nFile = nFile + 1
    end
    end
    end
    
    local function result()
    print("\nDone"
    ,"\n   size: "
    ,size, " B   "
    ,math.floor(size/1024), " KB"
    ,"\n   Files:   ", nFile
    ,"\n   Folders: ", nDir
    )
    end
    
    if tArgs[1] == "zip" then
    if fs.exists(tArgs[2]) and fs.isDir(tArgs[2]) then
    local zipped = ZIP(shell.resolve(tArgs[2]))
    local f = fs.open(tArgs[3]..FFormat, "w")
    f.write(zipped)
    f.close()
    zipped = nil
    size = fs.getSize(tArgs[3]..FFormat)
    result()
    end
    
    elseif tArgs[1] == "unzip" then
    local f = fopen(tArgs[2], "r")
    if not fs.exists(tArgs[3]) then
    fs.makeDir(tArgs[3])
    end
    UNZIP(f.readAll(), tArgs[3])
    size = fs.getSize(tArgs[2])
    result()
    end
    

  9. Перенос статьи

    Эта тема была перенесена из блока "Статьи". Автор оригинала: SDV.

    Что Мы знаем о сервисах для хранения фрагментов кода? Наверное ничего.
    А какое количество данных сервисов? Наверное их можно по пальцам пересчитать.
     
    На данном форуме большой популярностью пользуется сервис Pastebin, но есть еще несколько интересных сервисов о которых я сейчас хочу рассказать.
    Многие наверняка о них слышали, а возможно и использовали.
     

    FU9VzBg.png


    Pastebin


    yZGUGFX.png

     

     

    Pastebin — веб-приложение, появившееся в 2002 году, которое позволяет загружать отрывки текста, обычно фрагменты исходного кода, для возможности просмотра окружающими.
    Используется многими программистами для публикации кода всем желающим.
    На данный момент поддерживает большой список синтаксиса кода. Язык Lua не исключение.

    Плюсы:

    1. Удобная форма публикации, как с сайта, так и с opencomputers-устройств
    2. Система конфиденциальности файлов (наличие приватного и публичного доступа к файлу)
    3. Удобная система передачи файлов благодаря QR-коду (нет необходимости вводить id файла)
    4. Функция публикации фрагмента кода на своем сайте (через frame или JS-виджет)

    Минусы:

    1. Отсутствие русского языка в интерфейсе сайта. Не критично (все интуитивно понятно)









     

    GitHub Gist


    uxuum5T.png

     

     

    GitHub Gist — дополнение к сервису GitHub, которое позволяет загружать, публиковать и делиться фрагментами кода между участниками GitHub и не только.
    В наличии имеет форму для выбора предварительного синтаксиса кода, а также кнопки выбора конфиденциальности кода.

    Плюсы:

    1. Все фрагменты кода автоматически прикрепляются к аккаунту GitHub
    2. Система комментирования и функция форка (ответвление)
    3. Система контроля версиями (изменениями) в коде
    4. Система работы как с Git (через Git, SSH, Subversion)
    5. Функция публикации фрагмента кода на своем сайте (через JS-виджет)

    Минусы:

    1. Отсутствие русского языка в интерфейсе сайта
    2. Отсутствие lua-программы в opencomputers, позволяющая скачивать код
    3. Слишком длинные сгенерированные хеш-URL для кода









     

    ideone.com


    SqNr509.png

     

     

    ideone.com — сервис для публикации фрагментов исходного кода.
    Главное отличии от всех существующих сервисов для хранения фрагментов кода - функция компилирования (интерпретирования) введенного кода в форму.

    Плюсы:

    1. Наличие функции компилирования (интерпретирования) кода (можно прям на сайте увидеть результат выполнения программы)
    2. Частичная русификация интерфейса сайта
    3. Выбор времени компиляции (5 или 15 секунд)
    4. Наличие формы ввода данных (stdin)
    5. Функция публикации фрагмента кода на своем сайте (через JS-виджет)
    6. Функция форка (ответвление)
    7. Кнопка создание собственного шаблона (паттерна) для использования его как заготовки для дальнейших фрагментов кода программ

    Минусы:

    1. Отсутствие lua-программы в opencomputers, позволяющая скачивать код
    2. Отсутствие системы передачи файлов через QR-код
    3. Отсутствие возможности указания собственных названий для опубликованных фрагментов кода









     

    hastebin


    LUzYBbe.png

     

     

    hastebin — веб-приложение с базовым функционалом pastebin, но в хакерском стиле. Просто вставьте текст и нажмите «Сохранить».
    Необязательно даже запускать браузер, потому что из Linux или OS X можно отправить текст на сервер командой из консоли (URL скопируется в буфер обмена).

    Плюсы:

    1. Минималистичный дизайн приложения
    2. Интуитивно понятный интефейс
    3. Хранение кода в течении 30 дней с момента последнего просмотра
    4. Наличие RAW-режима

    Минусы:

    1. Отсутствие lua-программы в opencomputers, позволяющая скачивать код
    2. Отсутствие системы передачи файлов через QR-код
    3. Отсутствие возможности указания собственных названий для опубликованных фрагментов кода
    4. Отсутствие возможности самостоятельного удаления фрагмента кода из базы (только автоматически через 30 дней с момента последнего просмотра)



    Итак, Мы рассмотрели 4 самых популярных сервиса для хранения фрагментов кода.
    Выбирать Вам, что именно использовать, но помните - иногда лучшее не то что популярно  :)





     

    На этом я закончу обзор.
    С уважением к Вам, TuxShot

     

    • Нравится 1

  10. Перенос статьи

    Эта тема была перенесена из блока "Статьи". Автор оригинала: Krutoy.

    6DxDx3P.png
    Как известно, чем лучше инструмент, тем выше скорость работы.
    Я программирую на Lua больше года, и перепробовал множество инструментов.
    В этой статье я покажу, какие есть инструменты для успешного программирования на Lua для двух модов Minecraft'а: ComputerCraft и OpenComputers.


    1. Внутриигровой редактор

    AKhf1fDm.pngb6CWlfhm.pngKeOwSvfm.png

    Умеет уйму недостатков и неудобен в работе, за то всегда под рукой.
    Для ComputerCraft есть программа "LuaIDE", которая входит в состав операционки OneOS (второй скрин)
    Для OpenComputers пока редакторов кроме стандартного нет.
    Пара советов для редактора OC:

    • Для быстрого поиска существующего файла в консоли введите первые символы и жмите TAB, например edit i [TAB] --> edit /init.lua
    • Для удаления всей строки нажмите CTRL+DELETE

    2. Текстовые редакторы

    8d7312xm.pngu9VGa7Tm.pngCCbMnm.png

    Их несколько:

    • Notepad++
      Стандарт скриптовика. Прост и легок в обращении. Плюсы - малый размер, куча плагинов и расширений. Лучшее средство для начинающего программиста Lua.
    • Sublime Text
      Более продвинутый инструмент. Плюсы - расширенный интерфейс, выбор из разнообразных тем, поддержка плагинов, включая подсветку ошибок при написании кода.
      Сам пользуюсь этим редактором на компе, расширив плагинами Corona EditorLua LoveSublime Linter - lua
    • SciTEAtom
      Для хипстеров. По функционалу такие же как выше.

    Для удобной работы с компьютерными модами есть несколько приемов:

    - Через папку сохранения в одиночной игре:
    В Windows это папка, примерно C:\Users\UserName\AppData\Roaming\.MC\ServerName\saves\Computers\opencomputers\address-address-add-addrs
    Сохраненные файлы в папке жесткого диска игрового компьютера будут тут же там обновляться.
    Не забудьте изменить в конфиге \config\OpenComputers.cfg значение bufferChanges на false

    - Через Pastebin:

    • Пишете код в редакторе
    • Вставляете его на Pastebin
    • Вписываете код для запуска в игре (заменив XXXXXX на код пасты):
    • pastebin get XXXXXX name

    - Через облачное хранилище с прямыми ссылками:

    • Сохраняйте и работайте с файлами прямо в папке облачного хранилища, с возможностью доступа по прямым ссылкам.
      Например, в дропбоксе это папка Public (в новых аккаунтах ее нет)
    • Загружайте обновленные файлы на ОС компьютер через интернет-плату программой wget, получив прямую ссылку на файл, например:
      wget -f https://dl.dropboxusercontent.com/u/12345678/file.lua
    • Для удобства вы можете написать короткую программу, которая при нажатии клавиши, например F5, будет выполнять такую загрузку автоматически

    3. IDE

    yWb7wdcm.png TqQHadwm.png szuWwI3m.png

    IDE - Интегрированная среда разработки. Это мощное средство редактирования и отладки кода. Сильно упрощает работу с большими проектами, но более сложен в освоении.
    Основное преимущество IDE - отладка кода посредством точек останова и отображения значений переменных при работе программы.

    Рассмотрим по отдельности:

    • ZeroBrane Studio 
      Суперлегкая (у меня занимает 17мб оперативки) и быстрая кроссплатформенная IDE. Визуальные темы, мониторинг переменных, выделение локальных и глобальных переменных, проверка на неиспользуемые переменные и прочие ништяки.
    • Lua Development Tools
      Преимуществ от ZeroBrane практически нет, скорее минусы в роде отсутствие темной темы и требовательности к оперативке.
    • Cloud 9
      Облачное браузерное IDE.
      По стандарту отсутствует отладка. Ее нужно устанавливать в проект самостоятельно.
      Плюс - вам не нужно ничего устанавливать на компьютер. Но самое приятное, что к каждому файлу в этой IDE можно обратиться по постоянной прямой ссылке, что крайне упрощает заливку файла в игру. Так же, вы можете раздавать ссылку на проект другим и совместно редактировать код.

    Сам я использую Sublime для быстрого редактирования файлов, LDT для больших проектов на стадии написания кода, Cloud9 для совместных проектов с другими программистами, и для отладки текущих проектов в игре.
    О ZeroBrane Studio узнал совсем недавно, поэтому планирую перейти на нее в ближайшее время, что и другим советую.


  11. Перенос статьи

    Эта тема была перенесена из блока "Статьи". Автор оригинала: fenixrus.

    Здравствуйте с вами Fenixrus и я начинаю серию гайдов по API мода OpenComputers.

    Начнем мы с Component API.

    Вообщем смотрим, изучаем, пробуем, комментируем!

    https://www.youtube.com/watch?v=hStnB3hCpFs


  12. Перенос статьи

    Эта тема была перенесена из блока "Статьи". Автор оригинала: 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-зло!

    • Нравится 1
×
×
  • Создать...