Урок 2.1. Основы работы в Processing
Базовый курс "Программирование микроконтроллеров"
Модуль 2. Создание интерактивных интерфейсов в среде Processing
Что такое Processing?
Можно подумать, что IT-специалисты – люди точных наук, и для них чуждо искусство, но картина, которую Вы видите была нарисована не художником на холсте, а программистом в программном окне!😉
Processing — открытый язык программирования, основанный на Java с простым и понятным си-подобным синтаксисом. Представляет собой лёгкий и быстрый инструментарий для создания изображений, анимации и разработки интерфейсов. Используется Processing студентами, художниками, дизайнерами и исследователями для изучения, прототипирования и производства. Он создан для изучения основ компьютерного программирования в визуальном контексте.
Вот еще несколько примеров программ написанных на Processing.
Игры:
Сложные программы для анализа изображений:
Разнообразные проекты:
Интерфейс программы
Сначала установим Processing на наш компьютер. Для этого перейдите по ссылке:
Нажмите кнопку “Download” и скачайте актуальную версию для Вашей операционной системы.
Обратите внимание: скачиваемый файл это архив. Вам необходимо:
1. Распаковать папку их архива в любое удобное место, лучше всего в корень Вашего диска;
2. Внутри папки находится файл processing.exe, именно он запускает IDE, для удобства ярлык этого файла можно создать на рабочем столе;
3. Запустить processing.exe.
Структура самого когда очень похожа на код Arduino IDE. Окно редактора можно условно разделить на 5 блоков:
- Блок №1
- Блок №2
- Блок №3
- Блок №4
- Блок №5
Первый блок — это меню программы. Через меню можно получить доступ ко всем функциям Processing.
Через меню Файл можно создать, открыть или сохранить скетч, поменять параметры интерфейса программы и найти примеры программ.
В меню Правка хранятся функции для редактирования текущего кода.
В меню Набросок доступны функции запуска анимации, подменю подключения библиотек и добавления файлов.
Меню Отладка предлагает функции для покадровой проверки кода.
Меню Инструменты содержит инструменты для работы с цветом, шрифтами. генерацией видео и доступ к библиотеке доступных для установки инструментов.
В меню Помощь можно найти указатели на справочные ресурсы и формы техподдержки.
Второй блок — панель иконок, на которой размещены часто используемые функции.
В нашем случае это иконки “play” и “stop” – запуск и остановка анимации.
Третий блок — файлы проекта. Каждая вкладка означает один из файлов проекта. Самые простые программы могут состоять только из одного файла.
Четвертый блок — поле текстового редактора. В простых скетчах поле текстового редактора делится на три части:
Область строк до блока void setup( ){ }
В этой области обычно объявляются переменные, константы, библиотеки, объекты.
Область блока void setup( ){ }
Область настройки – код из этого блока внутри { } запускается один раз в начале программы.
Область блока void draw( ){ }
Главная часть программы – код внутри { } повторяется циклически.
Пятый блок — консоль, поле для отображения вызываемых программой, а также служебных сообщений, например, информации об ошибках в программе.
Работа с примитивами в Processing
Напишем простую программу: создадим окно и научимся задавать цвет фона этого окна.
Функция setup() имеет функционал, аналогичный одноименной функции в Arduino IDE, она однократно выполняется при запуске программы, и как правило содержит первоначальные настройки приложения.
Функция background() задаёт цвет фона окна.
Если функция принимает один аргумент, то цвета устанавливаются в градациях серого.
Если в функции установить три аргумента, цвет фона будет цветным в системе RGB.
void setup()
{
size(800,800); //создаем окно с шириной и высотой в 800 пикселей
background(255,255,0);
}
Для удобства подбора цвета, в Рrocessing встроен специальный инструмент:
В Processing можно рисовать большое количество примитивов, более подробно с ними можно ознакомиться в справке, для простоты мы выберем круг.
float x = 100; //координата x круга
float y = 100; //координата y круга
float R = 50; //радиус круга
void setup()
{
size(800, 800); //создаем окно с шириной и высотой в 800 пикселей
background(0,255,0);
}
void draw()
{
circle(x, y, R); // рисуем круг с координатами x и y радиуса R (в пикселях)
}
Вызываемая непосредственно после setup(), функция draw() непрерывно выполняет строки кода, содержащиеся внутри ее блока, до тех пор, пока программа не будет остановлена. Эта функция аналогична функции loop() в Arduino IDE.
Функция circle() рисует круг на экране. По умолчанию первые два параметра задают расположение центра, а третий задает ширину и высоту фигуры.
Следующим шагом сделаем нашу анимацию более живой, заставим наш шарик двигаться и покрасим его:
float x = 100; //координата x круга
float y = 100; //координата y круга
float R = 50; //радиус круга
// значения скорости смещения нашей окружности по осям вертикали и горизонтали
// эти числа влияют на то, как быстро наш круг будет перемещаться по каждой оси от кадра к кадру
// числовое значение определяет количество пикселей на которое будет смещен наш круг по каждой оси
float Vx=1;
float Vy=2;
void setup()
{
size(800, 800); //создаем окно с шириной и высотой в 800 пикселей
background(0, 255, 0);
}
void draw()
{
fill(255, 0, 100); // применяем заливку к последующим прописанным элементам в системе RGB
circle(x, y, R); // рисуем круг с координатами x и y радиуса R (в пикселях)
x=x+Vx; // увеличиваем координату X на величину Vx
y=y+Vy; // увеличиваем координату Y на величину Vy
}
Обратите внимание, наш круг скрывается за пределами окна, но программа продолжает работать и рисует наш круг уже за его пределами. Исправим эту ситуацию и сделаем так, что бы наш круг достигнув края окна появился снова.
float x = 100; //координата x круга
float y = 100; //координата y круга
float R = 50; //радиус круга
// значения скорости смещения нашей окружности по осям вертикали и горизонтали
// эти числа влияют на то, как быстро наш круг будет перемещаться по каждой оси от кадра к кадру
// числовое значение определяет количество пикселей на которое будет смещен наш круг по каждой оси
float Vx=1;
float Vy=2;
void setup()
{
size(800, 800); //создаем окно с шириной и высотой в 800 пикселей
background(0, 255, 0);
}
void draw()
{
fill(255, 0, 100); // применяем заливку к последующим прописанным элементам в системе RGB
circle(x, y, R); // рисуем круг с координатами x и y радиуса R (в пикселях)
x=x+Vx; // увеличиваем координату X на величину Vx
y=y+Vy; // увеличиваем координату Y на величину Vy
if (x >= width) // если центр круга больше ширины экрана то обнуляем координату X
x=0;
else if (y >= height) // если центр круга больше высоты экрана то обнуляем координату Y
y=0;
}
При внимательном рассмотрении анимации Вы можете заметить, что наш круг сопровождают контуры, давайте их уберем:
float x = 100; //координата x круга
float y = 100; //координата y круга
float R = 50; //радиус круга
// значения скорости смещения нашей окружности по осям вертикали и горизонтали
// эти числа влияют на то, как быстро наш круг будет перемещаться по каждой оси от кадра к кадру
// числовое значение определяет количество пикселей на которое будет смещен наш круг по каждой оси
float Vx=1;
float Vy=2;
void setup()
{
size(800, 800); //создаем окно с шириной и высотой в 800 пикселей
background(0, 255, 0);
noStroke(); // отключаем рисование контура
}
void draw()
{
fill(255, 0, 100); // применяем заливку к последующим прописанным элементам в системе RGB
circle(x, y, R); // рисуем круг с координатами x и y радиуса R (в пикселях)
x=x+Vx; // увеличиваем координату X на величину Vx
y=y+Vy; // увеличиваем координату Y на величину Vy
if (x >= width) // если центр круга больше ширины экрана то обуляем координату X
x=0;
else if (y >= height) // если центр круга больше высоты экрана то обуляем координату Y
y=0;
}
Теперь можно поиграть с цветом: для большей контрастности зададим черный цвет фона и случайную генерацию цвета круга при достижении края окна. Так же добавим случайную генерацию позиции круга.
float x = 100; //координата x круга
float y = 100; //координата y круга
float R = 50; //радиус круга
// значения скорости смещения нашей окружности по осям вертикали и горизонтали
// эти числа влияют на то, как быстро наш круг будет перемещаться по каждой оси от кадра к кадру
// числовое значение определяет количество пикселей на которое будет смещен наш круг по каждой оси
float Vx=1;
float Vy=2;
color c; // переменная для хранения цвета
void setup()
{
size(800, 800); //создаем окно с шириной и высотой в 800 пикселей
background(0);
noStroke(); // отключаем рисование контура
colorMode(HSB, 360, 100, 100); // переключение цветовой схемы в режим HSB,
// это полный аналог системы HSV, с которой мы уже знакомы
c=color(random(360), 100, 100);
}
void draw()
{
fill(c);
circle(x, y, R); // рисуем круг с координатами x и y радиуса R (в пикселях)
x=x+Vx; // увеличиваем координату X на величину Vx
y=y+Vy; // увеличиваем координату Y на величину Vy
if (x >= width) // если центр круга больше ширины экрана то обуляем координату X
{
x=random(R, width - R); // генерирование случайной координаты
c=color(random(360), 100, 100); // генерирование случайного цвета круга
} else if (y >= height) // если центр круга больше высоты экрана то обуляем координату Y
{
y=random(R, height - R); // генерирование случайной координаты
c=color(random(360), 100, 100);// генерирование случайного цвета круга
}
}
Следующим шагом добавим обновление фона:
float x = 100; //координата x круга
float y = 100; //координата y круга
float R = 50; //радиус круга
// значения скорости смещения нашей окружности по осям вертикали и горизонтали
// эти числа влияют на то, как быстро наш круг будет перемещаться по каждой оси от кадра к кадру
// числовое значение определяет количество пикселей на которое будет смещен наш круг по каждой оси
float Vx=1;
float Vy=2;
color c; // переменная для хранения цвета
void setup()
{
size(800, 800); //создаем окно с шириной и высотой в 800 пикселей
background(0);
noStroke(); // отключаем рисование контура
colorMode(HSB, 360, 100, 100); // переключение цветовой схемы в режим HSB,
// это полный аналог системы HSV, с которой мы уже знакомы
c=color(random(360), 100, 100);
}
void draw()
{
background(0); // обновение фона на каждом кадре
fill(c);
circle(x, y, R); // рисуем круг с координатами x и y радиуса R (в пикселях)
x=x+Vx; // увеличиваем координату X на величину Vx
y=y+Vy; // увеличиваем координату Y на величину Vy
if (x >= width) // если центр круга больше ширины экрана то обуляем координату X
{
x=random(R, width - R); // генерирование случайной координаты
c=color(random(360), 100, 100); // генерирование случайного цвета круга
} else if (y >= height) // если центр круга больше высоты экрана то обуляем координату Y
{
y=random(R, height - R); // генерирование случайной координаты
c=color(random(360), 100, 100);// генерирование случайного цвета круга
}
}
Отлично, у нас получились летающие разноцветные шарики😉 Теперь будем пробовать управлять ими!
Взаимодействие с интерфейсом с помощью мышки
Изменим нашу анимацию так, что бы наш шарик двигался за курсором мыши:
void setup()
{
size(800, 800); //создаем окно с шириной и высотой в 800 пикселей
background(0);
noStroke(); // отключаем рисование контура
colorMode(HSB, 360, 100, 100); // переключение цветовой схемы в режим HSB,
// это полный аналог системы HSV, с которой мы уже знакомы
}
void draw()
{
background(0); // обновление фона окна
fill(map(mouseX, 0, width, 0, 360),100,100); // масштабирование координаты мыши X
// в оттенок цвета
circle(mouseX,mouseY,20);
}
Далее добавим действие рисования круга по нажатию левой кнопки мыши:
void setup() {
size(800, 800); //создаем окно с шириной и высотой в 800 пикселей
background(0);
noStroke(); // отключаем рисование контура
colorMode(HSB, 360, 100, 100); // переключение цветовой схемы в режим HSB,
// это полный аналог системы HSV, с которой мы уже знакомы
cursor(CROSS); // устанавливаем вид курсора в нашем окне на крестик
}
void draw() {
fill(map(mouseX, 0, width, 0, 360), 100,
100); // масштабирование координаты мыши X в оттенок цвета
if (mousePressed && (mouseButton == LEFT)) // если нажата левая кнопка мыши,
// то рисуем круг в позиции курсора мыши
circle(mouseX, mouseY, 20);
}
Далее добавим очистку экрана по нажатии правой кнопки мыши:
void setup() {
size(800, 800); //создаем окно с шириной и высотой в 800 пикселей
background(0);
noStroke(); // отключаем рисование контура
colorMode(HSB, 360, 100, 100); // переключение цветовой схемы в режим HSB,
// это полный аналог системы HSV, с которой мы уже знакомы
cursor(CROSS); // устанавливаем вид курсора в нашем окне на крестик
}
void draw() {
fill(map(mouseX, 0, width, 0, 360), 100,
100); // масштабирование координаты мыши X в оттенок цвета
if (mousePressed && (mouseButton == LEFT)) // если нажата левая кнопка мыши,
// то рисуем круг в позиции курсора мыши
circle(mouseX, mouseY, 20);
else if (mousePressed && (mouseButton
== RIGHT)) // если нажата правая кнопка обновляем экран
background(0);
}
Добавим действие на прокручивание колеса мыши, в зависимости от количества тиков колеса мыши, будет изменяться радиус круга:
float R = 5; //радиус круга в пикселях
void setup()
{
size(800, 800); //создаем окно с шириной и высотой в 800 пикселей
background(0);
noStroke(); // отключаем рисование контура
colorMode(HSB, 360, 100, 100); // переключение цветовой схемы в режим HSB,
// это полный аналог системы HSV, с которой мы уже знакомы
cursor(CROSS); // устанавливаем вид курсора в нашем окне на крестик
}
void draw()
{
fill(map(mouseX, 0, width, 0, 360), 100, 100); // масштабирование координаты мыши X
// в оттенок цвета
if (mousePressed && (mouseButton == LEFT)) // если нажата левая кнопка мыши,
// то рисуем круг в позиции курсора мыши
circle(mouseX, mouseY, R);
else if (mousePressed && (mouseButton == RIGHT)) // если нажата правая кнопка обновляем экран
background(0);
}
void mouseWheel(MouseEvent event) // функция события поворота колеса мыши
{
R += event.getCount(); // если событие произошло, увеличиваем радиус круга
// на количество тиков колеса мыши
}
В итоге мы получили некоторое подобие графического редактора🙂