mirror of
https://github.com/IgorTimofeev/MineOS.git
synced 2025-12-20 19:19:21 +01:00
161 lines
4.4 KiB
Lua
Executable File
161 lines
4.4 KiB
Lua
Executable File
|
||
-- 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
|