Используя возможности библиотеки curses, реализуем обратный отсчет от 9 до 0 в виде электронного циферблата.
Для нашей затеи потребуется одноимённый модуль-обёртка для Perl - Curses.
Для начала установим переключатель в модуле, позволяющий нам использовать некоторые
"старые" функции, такие как mvhline, wclear и т.д (см. ниже).
Инициируем основной терминал для "рисования".
Получаем ширину и высоту терминала.
Создаем новое "окно", расположенное в основном терминале по центру экрана.
В нём мы будем отрисовывать наши электронные цифры.
Составляем правила для отрисовки соответствующей линии в цифровом табло.
Сами линии пронумерованы следующим образом.
Указываем, какие линии необходимо отрисовать для заданной цифры.
Инициируем функционал для работы с цветом и устанавливаем пару вида:
цвет фона и основной цвет, которую затем можно использовать далее
в коде по её номеру.
Используя ранее созданную цветовую "пару", указываем диапазон действия цветовых
настроек.
Непосредственно, отрисовка цифр в обратном порядке.
Удаляем окно, использованное в качестве циферблата.
Устанавливаем красный фон в конце работы счетчика.
Ну и всё вместе.
Для нашей затеи потребуется одноимённый модуль-обёртка для Perl - Curses.
Шаг 1.
Для начала установим переключатель в модуле, позволяющий нам использовать некоторые
"старые" функции, такие как mvhline, wclear и т.д (см. ниже).
BEGIN { $Curses::OldCurses = 1; }
use Curses;
Шаг 2.
Инициируем основной терминал для "рисования".
BEGIN { $Curses::OldCurses = 1; }
use Curses;
# Непосредственно инициализация терминала.
initscr;
# Место под Шаг 3.
# Место под Шаг 4.
# Место под Шаг 5.
# Место под Шаг 6.
# Место под Шаг 7.
# Место под Шаг 8.
# Место под Шаг 10.
# Место под Шаг 11.
# Ожидаем нажатия клавишы, чтобы программа сразу не завершалась.
getch;
# Освобождаем память, выделенную под терминал.
endwin;
Шаг 3.
Получаем ширину и высоту терминала.
my ($max_x, $max_y); getmaxyx($max_y, $max_x); # Да, вначале указывается Y, а затем X. # Это одна из особенностей данной библиотеки.
Шаг 4.
Создаем новое "окно", расположенное в основном терминале по центру экрана.
В нём мы будем отрисовывать наши электронные цифры.
my $width = 13; my $height = 11; my $win = newwin($height, $width, ($max_y-$height)/2, ($max_x-$width)/2);
Шаг 5.
Составляем правила для отрисовки соответствующей линии в цифровом табло.
Сами линии пронумерованы следующим образом.
---1--- | | 4 6 | | ---2--- | | 5 7 | | ---3---
my $sym = 'M'; # Из данного символа будет состоять каждая линия.
my $line = {
1 => sub { mvwhline($win, 0, 1, $sym, 11) },
2 => sub { mvwhline($win, 5, 1, $sym, 11) },
3 => sub { mvwhline($win, 10, 1, $sym, 11) },
4 => sub { mvwvline($win, 1, 0, $sym, 4) },
5 => sub { mvwvline($win, 6, 0, $sym, 4) },
6 => sub { mvwvline($win, 1, 12, $sym, 4) },
7 => sub { mvwvline($win, 6, 12, $sym, 4) }
};
Шаг 6.
Указываем, какие линии необходимо отрисовать для заданной цифры.
my $number = {
0 => sub { $line->{$_}->() for 1,3,4,5,6,7; },
1 => sub { $line->{$_}->() for 6,7; },
2 => sub { $line->{$_}->() for 1,2,3,5,6; },
3 => sub { $line->{$_}->() for 1,2,3,6,7; },
4 => sub { $line->{$_}->() for 2,4,6,7; },
5 => sub { $line->{$_}->() for 1,2,3,4,7; },
6 => sub { $line->{$_}->() for 1,2,3,4,5,7; },
7 => sub { $line->{$_}->() for 1,6,7; },
8 => sub { $line->{$_}->() for 1..7; },
9 => sub { $line->{$_}->() for 1,2,3,4,6,7; },
};
Шаг 7.
Инициируем функционал для работы с цветом и устанавливаем пару вида:
цвет фона и основной цвет, которую затем можно использовать далее
в коде по её номеру.
start_color; # Создаем цветовую "пару" init_pair(2, COLOR_RED, COLOR_RED);
Шаг 8.
Используя ранее созданную цветовую "пару", указываем диапазон действия цветовых
настроек.
wattron($win, COLOR_PAIR(2)); # Место для Шага 9 wattroff($win, COLOR_PAIR(2));
Шаг 9.
Непосредственно, отрисовка цифр в обратном порядке.
my $i=9;
while ($i>=0) {
$number->{$i}->();
# Необходим для непосредственного вывода изображения на терминал.
refresh($win);
sleep 1;
# Очищаем окно от предыдущей цифры.
wclear($win);
$i--;
}
Шаг 10.
Удаляем окно, использованное в качестве циферблата.
delwin($win);
Шаг 11.
Устанавливаем красный фон в конце работы счетчика.
init_pair(8, COLOR_WHITE, COLOR_RED); bkgd(COLOR_PAIR(8));
Ну и всё вместе.
#!/usr/bin/perl
use strict;
use warnings;
BEGIN { $Curses::OldCurses = 1; }
use Curses;
initscr;
my ($max_x, $max_y);
getmaxyx($max_y, $max_x);
my $width = 13;
my $height = 11;
my $win = newwin($height, $width, ($max_y-$height)/2, ($max_x-$width)/2);
my $sym = 'M';
my $line = {
1 => sub { mvwhline($win, 0, 1, $sym, 11) },
2 => sub { mvwhline($win, 5, 1, $sym, 11) },
3 => sub { mvwhline($win, 10, 1, $sym, 11) },
4 => sub { mvwvline($win, 1, 0, $sym, 4) },
5 => sub { mvwvline($win, 6, 0, $sym, 4) },
6 => sub { mvwvline($win, 1, 12, $sym, 4) },
7 => sub { mvwvline($win, 6, 12, $sym, 4) }
};
my $number = {
0 => sub { $line->{$_}->() for 1,3,4,5,6,7; },
1 => sub { $line->{$_}->() for 6,7; },
2 => sub { $line->{$_}->() for 1,2,3,5,6; },
3 => sub { $line->{$_}->() for 1,2,3,6,7; },
4 => sub { $line->{$_}->() for 2,4,6,7; },
5 => sub { $line->{$_}->() for 1,2,3,4,7; },
6 => sub { $line->{$_}->() for 1,2,3,4,5,7; },
7 => sub { $line->{$_}->() for 1,6,7; },
8 => sub { $line->{$_}->() for 1..7; },
9 => sub { $line->{$_}->() for 1,2,3,4,6,7; },
};
start_color;
init_pair(2, COLOR_RED, COLOR_RED);
wattron($win, COLOR_PAIR(2));
my $i=9;
while ($i>=0) {
$number->{$i}->();
refresh($win);
sleep 1;
wclear($win);
$i--;
}
wattroff($win, COLOR_PAIR(2));
delwin($win);
init_pair(8, COLOR_WHITE, COLOR_RED);
bkgd(COLOR_PAIR(8));
getch;
endwin;

Комментариев нет:
Отправить комментарий