| Клавиатурный ввод
Функции, реагирующие на события клавиатуры
В Processing существует три функции, реагирующие на события клавиатуры:
- keyPressed(),
- keyReleased()
- keyTyped().
Эти функции работают немного по-разному.
1. Функция keyPressed() выполняется, когда вы нажимаете на клавишу. Она понадобится вам, когда вы захотите сделать прямое взаимодействие с компьютером. Функция keyPressed() выполняется один раз при нажатии
2. Функция keyReleased() выполняется, когда вы отпускаете клавишу. Это полезно, когда вы нажимаете на клавишу, а изменение в приложении срабатывает при ее отпускании. Функция keyReleased() выполняется один раз при отпускании клавиши.
3. Функция keyTyped() работает так же, как keyPressed(), но игнорирует специальные клавиши типа:
- стрелок,
- Enter,
- Ctrl
- Alt.
Функция keyTyped() выполняется, когда вы нажимаете клавишу для набора текста. Клавиши Alt, Ctrl или Shift в этой функции игнорируются.
Встроенные переменные
- Встроенная переменная key содержит значение последней нажатой клавиши.
- Встроенная переменная keyCode используется для хранения последней нажатой специальной клавиши вроде:
Скорее всего, вы используете ее в блоке if, проверяющем, является ли клавиша дополнительной. keyCode принимает значения UP, DOWN, LEFT, RIGHT, ALT, CONTROL, SHIFT, BACKSPACE, TAB, ENTER, RETURN, ESC и DELETE.
3 .Встроенная переменная keyPressed является логической переменной. Значение этой переменной истинно, если какая-либо клавиша нажата и ложно, когда ни одна из клавиш не нажата. Эту переменную удобно использовать в функции draw().
Клавиатуру также можно использовать в интерактивном взаимодействии.
Пример 1. Рисуем линии и управляем с помощью клавиатуры
void setup (){
size (500, 500);
smooth ();
background (0);
strokeWeight (1);
}
int i = 0;
int k = 1;
int flug = 1; //объявили еще одну переменную и присвоили ей значение
void draw () {
stroke(i, 20);
if (flug == 1){
line(mouseX , mouseY , 500, random (0 ,500));
} else {
line(mouseX , mouseY , 0, random (0 ,500));
}
i = i + k;
if (i == 255){k=-1;}
if (i == 0){k=1;}
}
void keyPressed () {
if (key== 'q') {
/*мы меняем значение этой переменной,причем если мы первый раз попали в строку, то значение переменной
flug стало -1, если попали второй раз, то значение переменной flug стало1 и так далее. Такое поведение переменной часто называют тригером или переключателем. */
flug = flug *(-1);
}
if (key== 's') {saveFrame("myProcessing.png");}
}
|
|
Этот триггер мы используем в методе draw():
- если триггер в одном положении, то работает строка line(mouseX , mouseY , 500, random (0 ,500));
- если триггер в другом положении, то работает строка line(mouseX , mouseY , 0, random (0 ,500));
Логический оператор if превратился в более полную конструкцию if (...) {...} else {...}, смысл которой предельно ясен:
- если условие в круглых скобках возвращает true, то программа попадает в первые фигурные скобки;
- если условие в круглых скобках возвращает false, то программа попадает во вторые фигурные скобки.
- после того как программа отработала или в первых, или во вторых фигурных скобках, работа продолжается дальше со следующей строки, в нашем примере со строки i = i + k;
|
Пример 2. Рисуем линии в горизонтальной плоскости
void setup (){
size (500, 500);
smooth ();
background (0);
strokeWeight (1);
}
int i = 0;
int k = 1;
int flug = 1;
void draw () {
stroke(i, 20);
float myRandom = random (-20,20);
float myY1 = mousey - myRandom;
float myY2 = mousey + myRandom;
line(0, myY1 , 500, myY2);
i = i + k;
if (i == 255) {k=-1;}
if (i == 0) {k=1;}
}
|
|
Переменную myRandom мы объявляем как float. Float – это тип данных, который описывает числа с десятичной запятой, т.е. дроби.
Каждый раз, когда будет запускаться (вызываться) функция draw(), мы будем создавать эту переменную заново и заново присваивать ей случайное значение: от -20 до 20.
Мы это делаем, чтобы в строке: и в строке: отрисовывать линии относительно центра холста, для чего нам требуется складывать с mouseY и вычитать из него одно и тоже число. Если бы это были два разных случайных числа, то результат был другим.
|
Задание 1. Измените код программы примера 2 в строках:
float myY1 = mousey - myRandom;
float myY2 = mousey + myRandom;
так, что бы вместо переменной myRandom было два разных случайных числа.
Задание 2. Измените код программы так, чтобы на холсте было отрисовано такое же изображение, как на рисунке справа.
Справа на рисунке показан результат выполнения программного кода примера 2 ,но с заменой цвета фона на белый и увеличенной величиной разброса линий относительно положения курсора мыши.
Пример 3.
void setup (){
size (500, 500);
smooth ();
background (150);
strokeWeight (1);
}
/* Переменная flug при старте программы принимает значение 1. Таким образом как только программа начинает работать,линии отрисовываются черным цветом с небольшой прозрачностью (так как второй аргумент как раз отвечает за прозрачность).*/
nt flug = 1;
void draw () {
stroke(flug , 20);
//определение полученных с помощью метода random()) координат
float myY2 = mouseY + random ( -10 ,10) *10;
float myX2 = mouseX + random ( -10 ,10) *10;
/*происходит отрисовка линии из точки с координатами курсора мыши
в точку с рандомными координатами*/
line(mouseX , mouseY , myX2 , myY2);
}
void keyPressed () {
if (key=='w') {flug = 255;}
if (key=='b') {flug = 0;}
if (key=='s') {saveFrame("myProcessing.png");}
}
|
Задание 2. Измените код проекта в примере так, чтобы на холсте отрисовывался шлейф за мышью из эллипсов разного размера и прозрачности.
| |