MineOS/Applications/ChristmasTree/ChristmasTree.lua
Igor Timofeev eda1560577 aefaef
2015-12-25 16:32:37 +03:00

148 lines
4.7 KiB
Lua
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.

local component = require("component")
local ecs = require("ECSAPI")
local hologram
local c = 23
-----------------------------------------------------------
if not component.isAvailable("hologram") then
ecs.error("Этой программе необходим голографический проектор 2 уровня.")
return
else
hologram = component.hologram
end
-----------------------------------------------------------
local data = ecs.universalWindow("auto", "auto", 36, 0x262626, true,
{"EmptyLine"},
{"CenterText", ecs.colors.orange, "Настройки анимации"},
{"EmptyLine"},
{"Selector", 0xFFFFFF, ecs.colors.orange, "Снегопад", "Легкий снежок", "Что-то сыпется", "Без осадков"},
{"Selector", 0xFFFFFF, ecs.colors.orange, "Легкое вращение", "Быстрое вращение", "Турбина", "Дюраселл", "Без вращения"},
{"EmptyLine"},
{"CenterText", ecs.colors.orange, "Размер елочки"},
{"EmptyLine"},
{"Slider", ecs.colors.white, ecs.colors.orange, 1, 100, 50, "", ""},
{"EmptyLine"},
{"CenterText", ecs.colors.white, "Программа закрывается через"},
{"CenterText", ecs.colors.white, "CTRL + ALT + C"},
{"EmptyLine"},
{"Button", {ecs.colors.orange, 0xffffff, "OK"}, {0x999999, 0xffffff, "Отмена"}}
)
local snowMode, rotationMode, scale, buttonPress = data[1], data[2], data[3], data[4]
scale = scale * 4 / 100
if snowMode == "Снегопад" then
snowMode = 0
elseif snowMode == "Легкий снежок" then
snowMode = 0.2
elseif snowMode == "Что-то сыпется" then
snowMode = 0.5
end
if rotationMode == "Легкое вращение" then
rotationMode = 5
elseif rotationMode == "Быстрое вращение" then
rotationMode = 15
elseif rotationMode == "Турбина" then
rotationMode = 25
elseif rotationMode == "Дюраселл" then
rotationMode = 35
elseif rotationMode == "Без вращения" then
rotationMode = 0
end
if buttonPress == "Отмена" then return end
-----------------------------------------------------------
-- создаем модель елки
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 = {}
-- создаем палитру цветов
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
local function spruce() -- рисуем ель
for i = 1, 5 do
cricle(c, i, c, tSpruce[i], 2) -- отрисовываем основание ствола
cricle(c, i, c, tSpruce[i]-1, 2)
end
for j = 5, #tSpruce do
cricle(c, j, c, tSpruce[j]-1, 3) -- отрисовываем хвою
cricle(c, j, c, tSpruce[j]-2, 3)
end
end
local function gen_snow() -- генерируем снежинку
local x, y, z = math.random(1, 46), 32, math.random(1, 46)
table.insert(tSnow,{x=x,y=y,z=z})
hologram.set(x, y, z, 1)
end
local function falling_snow() -- сдвигаем снежинки вниз
local i=1
while i<=#tSnow do
if tSnow[i].y>1 then
local 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 end
if x>46 then x=46 end
if z<1 then z=1 end
if z>46 then z=46 end
c=hologram.get(x, y, z)
if c==0 or c==1 then
hologram.set(tSnow[i].x, tSnow[i].y, tSnow[i].z, 0)
tSnow[i].x, tSnow[i].y, tSnow[i].z=x,y,z
hologram.set(x, y, z, 1)
i=i+1
else
table.remove(tSnow,i)
end
else
table.remove(tSnow,i)
end
os.sleep(snowMode)
end
end
ecs.info("auto", "auto", "", "Счастливого нового года!")
hologram.clear()
hologram.setScale(scale)
hologram.setRotationSpeed(rotationMode, 0, 23, 0)
spruce()
while 1 do
gen_snow()
falling_snow()
end