Minecraft Wiki
м (Отмена правки 293785, сделанной участником 83.167.106.206 (обс.) Ненужные слипы в программе.)
мНет описания правки
Строка 1: Строка 1:
Итак, [[OpenComputers/Робот|роботы]] [[OpenComputers/Шахта-тоннель|копают руду]], [[OpenComputers/Туториал: Автоматическая ферма|сеют пшеницу]] и [[OpenComputers/Робот-дровосек|рубят лес]]... Чего не хватает? Построим танцпол!
+
Итак, [[OpenComputers/Робот|роботы]] [[OpenComputers/Шахта-тоннель|копают руду]], [[OpenComputers/Туториал: Автоматическая ферма|сеют пшеницу]] и [[OpenComputers/Робот-дровосек|рубят лес]] Чего не хватает? Построим танцпол!
   
   
Строка 6: Строка 6:
   
 
== Что потребуется? ==
 
== Что потребуется? ==
* [[OpenComputers/Корпус компьютера|Компьютер]]. Не имеет значения, какого уровня. Программа будет работать на любом. Но желательно, чтобы [[OpenComputers/Видеокарта|видеокарта]] была второго уровня или выше. Тогда танцпол будет цветным. Компьютер должен быть обеспечен энергией, и [[OpenComputers/Жесткий диск|жестким диском]].
+
* [[OpenComputers/Корпус компьютера|Компьютер]]. Не имеет значения, какого уровня. Программа будет работать на любом. Но желательно, чтобы [[OpenComputers/Видеокарта|видеокарта]] была второго уровня или выше. Тогда танцпол будет цветным. Компьютер должен быть обеспечен энергией, и [[OpenComputers/Жёсткий диск|жёстким диском]].
 
* [[OpenComputers/Монитор|48 мониторов]]. Второго или третьего уровня. Да, это 214 [[Золотой слиток|слитков золота]]. Но мониторы первого уровня не посылают сигнал <code>walk</code>.
 
* [[OpenComputers/Монитор|48 мониторов]]. Второго или третьего уровня. Да, это 214 [[Золотой слиток|слитков золота]]. Но мониторы первого уровня не посылают сигнал <code>walk</code>.
 
* Другие материалы. Зависит от того, как вы захотите оформить танцпол.
 
* Другие материалы. Зависит от того, как вы захотите оформить танцпол.
Строка 12: Строка 12:
   
 
== Устройство ==
 
== Устройство ==
Выберем место для танцпола. Прямоугольное отверстие в полу размерами 8×6 блоков замостим мониторами. Обратите внимание на полупрозрачную белую стрелку, которая показывает "верх" будущего мультиблочного экрана, когда вы держите в руках монитор. Если вы все сделаете правильно, мониторы объединятся в один.
+
Выберем место для танцпола. Прямоугольное отверстие в полу размерами 8×6 блоков замостим мониторами. Обратите внимание на полупрозрачную белую стрелку, которая показывает «верх» будущего мультиблочного экрана, когда вы держите в руках монитор. Если вы все сделаете правильно, мониторы объединятся в один.
   
   
Строка 29: Строка 29:
 
Она означает, что компьютер не может найти операционную систему.
 
Она означает, что компьютер не может найти операционную систему.
   
Вставьте в компьютер (или [[OpenComputers/Дисковод|дисковод]]) [[OpenComputers/Дискета|дискету]] с операционной системой OpenOS. Введите команду <code>install</code>. Затем укажите жесткий диск компьютера в списке (скорее всего, он там будет один) и дождитесь окончания установки (на слабом компьютере — чуть дольше, на мощном — быстрее). Согласитесь на перезагрузку компьютера и выньте дискету.
+
Вставьте в компьютер (или [[OpenComputers/Дисковод|дисковод]]) [[OpenComputers/Дискета|дискету]] с операционной системой OpenOS. Введите команду <code>install</code>. Затем укажите жёсткий диск компьютера в списке (скорее всего, он там будет один) и дождитесь окончания установки (на слабом компьютере — чуть дольше, на мощном — быстрее). Согласитесь на перезагрузку компьютера и выньте дискету.
   
   
Строка 40: Строка 40:
   
   
Теперь введите команду <code>edit dancefloor.lua</code>. В корневом каталоге жесткого диска будет создан новый скрипт Lua <code>dancefloor.lua</code>.
+
Теперь введите команду <code>edit dancefloor.lua</code>. В корневом каталоге жёсткого диска будет создан новый скрипт Lua <code>dancefloor.lua</code>.
   
   
Строка 143: Строка 143:
 
В первой части программы расположены функции, которые вызывает главный цикл.
 
В первой части программы расположены функции, которые вызывает главный цикл.
   
Функция <code>draw()</code> отвечает за рисование "кадра" на полу. Она перебирает список всех созданных колец, и рисует те их части, которые не выходят за пределы экрана. Затем радиус каждого кольца увеличивается, а самые большие удаляются из списка.
+
Функция <code>draw()</code> отвечает за рисование «кадра» на полу. Она перебирает список всех созданных колец, и рисует те их части, которые не выходят за пределы экрана. Затем радиус каждого кольца увеличивается, а самые большие удаляются из списка.
   
   
Небольшая функция <code>rgb2hex(r, g, b)</code> отвечает за преобразование трех переменных RGB цвета (red, green и blue) в константу для функции <code>setBackground</code>. Эта функция требует задавать цвет в шестнадцатеричном формате <code>0xRRGGBB</code>. Однако, мы можем передать ей соответствующее десятичное значение. Это значение легко получить по формуле <code>r*65536+g*256+b</code>.
+
Небольшая функция <code>rgb2hex(r, g, b)</code> отвечает за преобразование трех переменных RGB цвета (red, green и blue) в константу для функции <code>setBackground</code>. Эта функция требует задавать цвет в шестнадцатеричном формате <code>0xRRGGBB</code>. Однако, мы можем передать ей соответствующее десятичное значение. Это значение легко получить по формуле <code>r*65536+g*256+b</code>.
   
 
''Примечание'': интерфейс [[OpenComputers/Colors API|Colors API]] не содержит необходимых функций и хранит цвета в другом формате. Он больше подходит для работы с разноцветными проводами из других модификаций.
 
''Примечание'': интерфейс [[OpenComputers/Colors API|Colors API]] не содержит необходимых функций и хранит цвета в другом формате. Он больше подходит для работы с разноцветными проводами из других модификаций.
Строка 154: Строка 154:
   
   
В начале программы мы устанавливаем разрешение экрана (ШИРИНА*2, ВЫСОТА). Т.к. мы будем рисовать на полу крупные клетки, большое разрешение не требуется. Для ускорения работы программы, и уменьшения энергопотребления будет достаточно разрешения равного количеству блоков мониторов.
+
В начале программы мы устанавливаем разрешение экрана (ШИРИНА*2, ВЫСОТА). Так как мы будем рисовать на полу крупные клетки, большое разрешение не требуется. Для ускорения работы программы, и уменьшения энергопотребления будет достаточно разрешения равного количеству блоков мониторов.
   
Однако символьные "пиксели" монитора вытянуты по вертикали (приблизительно 1 к 2-м). Поэтому разрешение по ширине будет равно ШИРИНА*2.
+
Однако символьные «пиксели» монитора вытянуты по вертикали (приблизительно 1 к 2-м). Поэтому разрешение по ширине будет равно ШИРИНА*2.
   
   
Строка 166: Строка 166:
   
 
== Итоги ==
 
== Итоги ==
 
 
[[Файл:Dancefloor 4 (OpenComputers).png|800px]]
 
[[Файл:Dancefloor 4 (OpenComputers).png|800px]]
   
Строка 174: Строка 173:
   
 
== Материалы ==
 
== Материалы ==
* [[OpenComputers/Component API|Component API — работа с компонентами]] (см. также [[OpenComputers/Сигналы|Сигналы]])
+
* [[OpenComputers/Component API|Component API — работа с компонентами]] (см. также [[OpenComputers/Сигналы|Сигналы]])
* [[OpenComputers/Event API|Event API — обработка событий и сигналов]]
+
* [[OpenComputers/Event API|Event API — обработка событий и сигналов]]
* [[OpenComputers/GPU API|GPU API — работа с видеокартой]]
+
* [[OpenComputers/GPU API|GPU API — работа с видеокартой]]
   
[[Категория:OpenComputers/Туториалы‎]]
+
[[Категория:OpenComputers/Туториалы]]
   
 
{{OpenComputers}}
 
{{OpenComputers}}

Версия от 20:29, 14 мая 2018

Итак, роботы копают руду, сеют пшеницу и рубят лес… Чего не хватает? Построим танцпол!


Танцпол будет состоять из цветных плиток и реагировать на касание. Он будет иметь размеры 8×6 блоков (максимальный размер мультиблочного экрана по умолчанию). Но его легко увеличить, если изменить ограничения в файле конфигурации.


Что потребуется?

  • Компьютер. Не имеет значения, какого уровня. Программа будет работать на любом. Но желательно, чтобы видеокарта была второго уровня или выше. Тогда танцпол будет цветным. Компьютер должен быть обеспечен энергией, и жёстким диском.
  • 48 мониторов. Второго или третьего уровня. Да, это 214 слитков золота. Но мониторы первого уровня не посылают сигнал walk.
  • Другие материалы. Зависит от того, как вы захотите оформить танцпол.


Устройство

Выберем место для танцпола. Прямоугольное отверстие в полу размерами 8×6 блоков замостим мониторами. Обратите внимание на полупрозрачную белую стрелку, которая показывает «верх» будущего мультиблочного экрана, когда вы держите в руках монитор. Если вы все сделаете правильно, мониторы объединятся в один.


Теперь подведите к монитору кабель, соединяющий его с компьютером. Компьютер удобно расположить этажом ниже, под танцполом. Прикрепите к нижней плоскости экрана клавиатуру.


Dancefloor 0 (OpenComputers)


Теперь запустите компьютер. Если вы запускаете его в первый раз, вы получите такое сообщение:


Dancefloor 1 (OpenComputers)


Она означает, что компьютер не может найти операционную систему.

Вставьте в компьютер (или дисковод) дискету с операционной системой OpenOS. Введите команду install. Затем укажите жёсткий диск компьютера в списке (скорее всего, он там будет один) и дождитесь окончания установки (на слабом компьютере — чуть дольше, на мощном — быстрее). Согласитесь на перезагрузку компьютера и выньте дискету.


Теперь компьютер выдает стандартное приглашение системы.

Вы можете переименовать свой винчестер для удобства.


Dancefloor 2 (OpenComputers)


Теперь введите команду edit dancefloor.lua. В корневом каталоге жёсткого диска будет создан новый скрипт Lua dancefloor.lua.


Программирование

Вы можете перепечатать этот код вручную и сохранить, либо скопировать его и вставить (⇧ Shift+Insert в игровом редакторе).

И наконец, вы можете открыть (свернув игру на время, выключив компьютер и поместив винчестер в инвентарь) папку \.minecraft\saves\<Название вашего мира>\opencomputers\<Адрес винчестера>\. Там находится только что созданный файл dancefloor.lua. Вы можете открыть его любым редактором и вставить текст программы.


-- загружаем библиотеки и получаем прокси видеокарты
local component = require("component")
local event = require("event")
local gpu = component.gpu

-- константы — размер экрана
WIDTH = 8
HEIGHT = 6

--============================  Ф У Н К Ц И И  ==============================--
-- отрисовка кругов
function draw()
    -- очищаем экран
    gpu.setBackground(0x000000)
    gpu.fill(1, 1, WIDTH*2, HEIGHT, " ")
    
    -- рисуем все круги
    for i=#circles, 1, -1 do
        local x = circles[i][1]+1
        local y = circles[i][2]-circles[i][4]+2
        gpu.setBackground(circles[i][3])
        
        for c=1, (circles[i][4]-1)*4 do
            -- рисуется один "пиксель" круга
            if x>0 and x<=(WIDTH*2) then
                if y>0 and y<=HEIGHT then
                    gpu.set((x-1)*2+1, y, "  ")
                end
            end
            -- следующий "пиксель" круга
            if x>circles[i][1] then
                if y<circles[i][2] then
                    x = x+1
                else
                    x = x-1
                end
                y = y+1
            else
                if y>circles[i][2] then
                    x = x-1
                else
                    x = x+1
                end
                y = y-1
            end
        end
        -- обновление (круги увеличиваются в диаметре, если диаметр 
        -- становится больше 8, круг удаляется)
        circles[i][4] = circles[i][4] + 1
        if circles[i][4] > WIDTH then table.remove(circles, i) end
    end
end

-- функция, которая конвертирует цвет в формате RGB в соответствующее 
-- ему шестнадцатеричное значение 
function rgb2hex(r, g, b)
    return r*65536+g*256+b
end
--===========================================================================--

-- устанавливаем разрешение "танцпола"
gpu.setResolution(WIDTH*2, HEIGHT)
gpu.fill(1, 1, 16, 6, " ")

-- таблица в которой будут храниться круги
circles = {}

-- главный цикл
while true do
    -- обработка сигналов
    _, _, code, _, _ = event.pull(0.01, "key_down")
    _, _, x, y = event.pull(0.03, "walk")
    
    -- если получен сигнал walk создаем новый круг
    if x ~= nil then
        table.insert(circles, {x, y, rgb2hex(math.random(255), math.random(255), math.random(255)), 1})
    end
    
    -- отрисовываем кадр
    draw()
    
    -- выход из программы, если была нажата кнопка Q
    if code == 113 then break end
end

-- возвращаем монитор к нормальному состоянию =)
gpu.setBackground(0x000000)
gpu.fill(1, 1, WIDTH*2, HEIGHT, " ")
gpu.setResolution(gpu.maxResolution())


Разбор программы

В первой части программы расположены функции, которые вызывает главный цикл.

Функция draw() отвечает за рисование «кадра» на полу. Она перебирает список всех созданных колец, и рисует те их части, которые не выходят за пределы экрана. Затем радиус каждого кольца увеличивается, а самые большие удаляются из списка.


Небольшая функция rgb2hex(r, g, b) отвечает за преобразование трех переменных RGB цвета (red, green и blue) в константу для функции setBackground. Эта функция требует задавать цвет в шестнадцатеричном формате 0xRRGGBB. Однако, мы можем передать ей соответствующее десятичное значение. Это значение легко получить по формуле r*65536+g*256+b.

Примечание: интерфейс Colors API не содержит необходимых функций и хранит цвета в другом формате. Он больше подходит для работы с разноцветными проводами из других модификаций.


Dancefloor 3 (OpenComputers)


В начале программы мы устанавливаем разрешение экрана (ШИРИНА*2, ВЫСОТА). Так как мы будем рисовать на полу крупные клетки, большое разрешение не требуется. Для ускорения работы программы, и уменьшения энергопотребления будет достаточно разрешения равного количеству блоков мониторов.

Однако символьные «пиксели» монитора вытянуты по вертикали (приблизительно 1 к 2-м). Поэтому разрешение по ширине будет равно ШИРИНА*2.


Сохраните программу и закройте редактор.

Все готово к запуску.

Введите команду dancefloor и поднимайтесь наверх.

Итоги

Dancefloor 4 (OpenComputers)


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


Материалы