2019-01-19 11:31:04 +03:00

161 lines
4.4 KiB
Lua
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- Copyright (c) Totoro, ComputerCraft.ru
local system = require("System")
local GUI = require("GUI")
local filesystem = require("Filesystem")
local image = require("Image")
---------------------------------------------------------------------------------------------------------
local hologram
-- создаем модель елки
local tSpruce = {3, 2, 2, 2, 2, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 4, 6, 8, 7, 6, 5, 4, 3, 6, 5, 4, 3, 2, 3, 2, 1}
-- создаем таблицу с падающими снежинками
local tSnow = {}
if not component.isAvailable("hologram") then
GUI.alert("This program requires Tier 2 holographic projector")
return
else
hologram = component.get("hologram")
end
-----------------------------------------------------------
local workspace, window = system.addWindow(GUI.filledWindow(1, 1, 36, 18, 0x2D2D2D))
local layout = window:addChild(GUI.layout(1, 1, window.width, window.height, 1, 1))
local picture = layout:addChild(GUI.image(1, 1, image.load(filesystem.path(system.getCurrentScript()) .. "Icon.pic")))
picture.height = picture.height + 1
local function addSlider(min, max, value, ...)
return layout:addChild(GUI.slider(1, 1, layout.width - 10, 0x66DB80, 0x0, 0xE1E1E1, 0x969696, min, max, value, false, ...))
end
local speedSlider = addSlider(0.1, 1, 0.8, "Speed: ", "")
local rotationSlider = addSlider(0, 100, 0, "Rotation: ", "")
local translationSlider = addSlider(0, 1, select(2, hologram.getTranslation()), "Translation: ", "")
local scaleSlider = addSlider(0.33, 3, hologram.getScale(), "Scale: ", "")
scaleSlider.height = 2
scaleSlider.onValueChanged = function()
hologram.setScale(scaleSlider.value)
end
rotationSlider.onValueChanged = function()
hologram.setRotationSpeed(rotationSlider.value, 0, 23, 0)
end
translationSlider.onValueChanged = function()
hologram.setTranslation(0, translationSlider.value, 0)
end
window.onResize = function(width, height)
window.backgroundPanel.width = width
window.backgroundPanel.height = height
layout.width = width
layout.height = height
end
-- Главный йоба-цикл
local deadline = 0
layout.eventHandler = function(workspace, panel, e1)
if computer.uptime() > deadline then
-- генерируем снежинку
local x, y, z, pixel = math.random(1, 46), 32, math.random(1, 46)
table.insert(tSnow, {x = x, y = y, z = z})
hologram.set(x, y, z, 1)
-- сдвигаем снежинки вниз
local i = 1
while i <= #tSnow do
if tSnow[i].y > 1 then
x, y, z = tSnow[i].x + math.random(-1, 1), tSnow[i].y - 1, tSnow[i].z + math.random(-1, 1)
if x < 1 then
x = 1
elseif x > 46 then
x = 46
end
if z < 1 then
z = 1
elseif z > 46 then
z = 46
end
pixel = hologram.get(x, y, z)
if pixel == 0 or pixel == 1 then
hologram.set(tSnow[i].x, tSnow[i].y, tSnow[i].z, 0)
hologram.set(x, y, z, 1)
tSnow[i].x, tSnow[i].y, tSnow[i].z = x, y, z
i = i + 1
else
table.remove(tSnow,i)
end
else
table.remove(tSnow,i)
end
end
deadline = computer.uptime() + 1 - speedSlider.value
end
end
-----------------------------------------------------------
-- Сначала интерфейс
workspace:draw()
-- очищаем прожектор
hologram.clear()
scaleSlider.onValueChanged()
rotationSlider.onValueChanged()
-- создаем палитру цветов
hologram.setPaletteColor(1, 0xFFFFFF) -- снег
hologram.setPaletteColor(2, 0x221100) -- ствол
hologram.setPaletteColor(3, 0x005522) -- хвоя
-- задействуем алгоритм Брезенхэма для рисования кругов
local function cricle(x0, y, z0, R, i)
local x = R
local z = 0
local err = -R
while z <= x do
hologram.set(x + x0, y, z + z0, i)
hologram.set(z + x0, y, x + z0, i)
hologram.set(-x + x0, y, z + z0, i)
hologram.set(-z + x0, y, x + z0, i)
hologram.set(-x + x0, y, -z + z0, i)
hologram.set(-z + x0, y, -x + z0, i)
hologram.set(x + x0, y, -z + z0, i)
hologram.set(z + x0, y, -x + z0, i)
z = z + 1
if err <= 0 then
err = err + (2 * z + 1)
else
x = x - 1
err = err + (2 * (z - x) + 1)
end
end
end
-- отрисовываем основание ствола
for i = 1, 5 do
cricle(23, i, 23, tSpruce[i], 2)
cricle(23, i, 23, tSpruce[i]-1, 2)
end
-- отрисовываем хвою
for j = 5, #tSpruce do
cricle(23, j, 23, tSpruce[j]-1, 3)
cricle(23, j, 23, tSpruce[j]-2, 3)
end