-- Зависимости -
---------------------------------------
-- curl - загрузка ёлочек -
-- scrot - снимок рабочего стола -
-- love2d - запуск снежка и ёлочек -
---------------------------------------
-- Создать каталог `новый_год` -
-- Создать в каталоге файл `main.lua` -
-- Скопировать в файл этот код. -
-- Используя терминал запутсить из -
-- созданного каталога программу -
-- -
-- Вот так запустить `love .` -
---------------------------------------
-- Управление -
---------------------------------------
-- Нажать 1 - установит фон рабочего -
-- стола в программе, как -
-- будто на нём идёт снег -
---------------------------------------
-- Нажать 2 - убрать сугробы, но снег -
-- то падает и они вырастут-
-- снова, но другие уже :) -
---------------------------------------
-- Нажать 3 - Загрузить и отобразить -
-- просту ёлочку -
---------------------------------------
-- Нажать 4 - Загрузить и установить -
-- нарядную новогоднюю ёлку-
---------------------------------------
-- Нажать 5 - Вернуть чёрный фон -
---------------------------------------
-- Нажать esc или q для выхода -
---------------------------------------
-- Программа проверяет время и если -
---------------------------------------
-- Время 23:45 - Загружается и отобра -
-- жается простая ёлочка-
---------------------------------------
-- Время 00:00 - Загружается и отобра -
-- жается нарядная ёлка -
---------------------------------------
-- Эти действия по времени происходят -
-- автоматически предупреждая о под- -
-- ходе и наступлении нового года гы -
---------------------------------------
-- Устанавливать ли фон автоматически -
---------------------------------------
local autobackround = false; --вкл/выкл
---------------------------------------
local sugrob = {}
local snow = {};
local snow_opacity = 0;
local screen_width = 0;
local screen_height= 0;
local tree_image = nil;
local background = nil;
local tree_opacity = 0;
local tree_url =
{
[1] = 'https://i.ibb.co/f24xCMp/1.png';
[2] = 'https://i.ibb.co/KLpSKdZ/2.png';
};
local once_call_tree_1 = true;
local once_call_tree_2 = true;
----------------------------------------
function get_app_path()
return love.filesystem.getSaveDirectory()..'/';
end
function load_tree(id)
if love.system.getOS() == 'Android' then
if id == 1 then
tree_image = love.graphics.newImage('tree_1.png');
end
if id == 2 then
tree_image = love.graphics.newImage('tree_2.png');
end
tree_opacity = 0;
return;
end
local path = get_app_path();
os.execute('curl '..tree_url[id]..' --output '..path..'tree.png');
if love.filesystem.getInfo('tree.png') then
tree_image = love.graphics.newImage('tree.png');
tree_opacity = 0;
end
end
function draw_tree()
if tree_image then
local w = love.graphics.getWidth()
local h = love.graphics.getHeight()
local sx,sy = w/tree_image:getWidth(),h/tree_image:getHeight();
love.graphics.setColor(1,1,1,tree_opacity);
love.graphics.draw(tree_image,0,0,0,sx,sy);
end
end
function update_tree(dt)
if tree_opacity < 1 then
tree_opacity = tree_opacity + 0.1 * dt;
end
end
function create_sugrob()
if love.system.getOS() == 'Android' then
return;
end
local x = love.graphics.getWidth()
local y = love.graphics.getHeight()
local s = x/y;
for i=1,50 do
local xp = love.math.random(0,x);
local cs = love.math.random(s*25,s*75);
table.insert(sugrob,{'fill',xp,y,cs,150})
end
end
function draw_sugrob()
if love.system.getOS() == 'Android' then
return;
end
love.graphics.setColor(0.95,0.95,1,1);
for i=1,#sugrob do
love.graphics.circle(sugrob[i][1],sugrob[i][2],sugrob[i][3]+sugrob[i][5],sugrob[i][4]);
end
end
function update_sugrob(dt)
local x,y = love.window.getMode();
for i=1,#sugrob do
if sugrob[i][5] > 0 then
sugrob[i][5] = sugrob[i][5] - love.math.random(0.0,i*0.05)
end
end
end
function create_snow()
local x = love.graphics.getWidth()
local y = love.graphics.getHeight()
local s = x/y;
for i=1,60 do
local xp = love.math.random(0,x);
local xy = love.math.random(0,y);
local cs = love.math.random(s*1,s*10);
table.insert(snow,{'fill',xp,xy,cs,0})
end
end
function draw_snow()
for i=1,#snow do
love.graphics.setColor(0.95,0.95,1,snow_opacity);
love.graphics.circle(snow[i][1],snow[i][2],snow[i][3],snow[i][4]+snow_opacity);
end
end
function lerp(from, to, t)
return t < 0.5 and from + (to-from)*t or to + (from-to)*(1-t)
end
function update_snow(dt)
local x,y = love.window.getMode();
if snow_opacity < 0.7 then
snow_opacity = snow_opacity + 0.1 * dt;
end
for i=1,#snow do
snow[i][3] = snow[i][3] + i * 0.5;
if snow[i][5] == 1 then
snow[i][2] = snow[i][2] + i * 0.25 + i * 0.5 + love.math.random(0,3);
elseif snow[i][5] == 0 then
snow[i][2] = snow[i][2] - i * 0.25 + i * 0.5 + love.math.random(0,3);
end
if(snow[i][3] > y + snow[i][4]) then
snow[i][3] = -snow[i][4];
snow[i][2] = love.math.random(0,x);
snow[i][5] = love.math.random(-1,1);
end
end
end
local button_colors =
{
{0.5,0.0,0.0,1},
{0.0,0.5,1.0,1},
{0.0,0.0,1.0,1},
{0.5,0.5,1.0,1},
{0.0,0.5,1.0,1},
}
local button_circles = {}
local show_controls = false;
function create_controls()
local x = love.graphics.getWidth()
local y = love.graphics.getHeight()
local pose_y = (y * 0.5);
local radius = (x * 0.01) * 5;
for i=1,5 do
local pose_x = radius*i * 3.5;
table.insert(button_circles,{'fill',pose_x,pose_y,radius,button_colors[i]})
end
end
function draw_controls()
if show_controls then
local b = button_circles;
for i=1,#button_circles do
love.graphics.setColor(unpack(b[i][5]));
love.graphics.circle(b[i][1],b[i][2],b[i][3],b[i][4]);
end
end
end
function update_controls(px,py)
if show_controls then
local b = button_circles;
for i=1,#button_circles do
local cx,cy,cr = b[i][2],b[i][3],b[i][4];
if((px - cx)^2 + (py - cy)^2 < cr^2) then
if i == 1 then set_background(); end
if i == 2 then sugrob = {}; create_sugrob(); end
if i == 3 then load_tree(1); end
if i == 4 then load_tree(2); end
if i == 5 then background=nil; end
end
end
end
end
function love.displayrotated(index, orientation)
sugrob = {};
create_sugrob();
snow = {};
create_snow();
snow_opacity = 0;
tree_opacity = 0;
button_circles = {};
create_controls();
end
function love.mousepressed(x,y)
if love.system.getOS() ~= 'Android' then
update_controls(x,y)
show_controls = not show_controls;
end
end
function love.touchpressed(b,x,y)
update_controls(x,y)
show_controls = not show_controls;
end
function love.load()
love.filesystem.write('init','x',1);
if love.filesystem.getInfo('icon.png') then
love.window.setIcon(love.image.newImageData('icon.png'));
end
love.window.setTitle("Маааленькой ёёёлочке холодно зимооой.")
if love.system.getOS() == 'Android' then
love.window.setMode(1280,720,{fullscreen=true,resizable=true,vsync=true});
screen_width = love.graphics.getWidth()
screen_height = love.graphics.getHeight()
else
love.window.setMode(0,0,{resizable=true,borderless=true})
love.window.setFullscreen(true,'desktop');
screen_width = love.graphics.getWidth()
screen_height = love.graphics.getHeight()
love.window.setMode(0,0,{resizable=true,borderless=true})
love.window.maximize()
end
create_sugrob()
create_snow()
create_controls()
end
function set_background()
if love.system.getOS() == 'Android' then
return;
end
local x,y = love.window.getMode();
love.window.minimize()
love.timer.sleep(1)
local path = get_app_path()
local status = os.execute('scrot -a '..screen_width-x..','..screen_height-y..','..x..','..y..' -o '..path..'screen.png');
love.window.restore()
love.window.maximize()
if love.filesystem.getInfo('screen.png') then
background = love.graphics.newImage('screen.png');
end
end
if autobackround then
set_background()
end
function love.keypressed(key)
if key == 'q' or key == 'escape' then
love.event.quit()
end
if key == '1' then set_background(); end
if key == '2' then sugrob = {}; create_sugrob(); end
if key == '3' then load_tree(1); end
if key == '4' then load_tree(2); end
if key == '5' then background=nil; end
end
function love.update(dt)
if os.date('%H%M') == '2345' then
if once_call_tree_1 then
load_tree(1);
once_call_tree_1 = false;
end
end
if os.date('%H%M') == '0000' then
if once_call_tree_2 then
load_tree(2);
once_call_tree_2 = false;
end
end
update_snow(dt)
update_tree(dt)
update_sugrob(dt)
end
function love.draw()
if background then
love.graphics.setColor(1,1,1,1);
love.graphics.draw(background)
end
draw_tree();
draw_sugrob();
draw_snow();
draw_controls();
end
Добавил кнопки появляются и исчезают по нажатию на экране.
Как альтернатива нажатия 1
,2
,3
,4
,5
.
На Андроиде
часть не работает.
В истории правок этого сообщения есть прошлая версия, если с этой пробелмы, но прошлая только для ПК.