Что бы получить очередное событие от системы (клик, движение мышки/пальца по экрану, нажатие клавиши), используется функция
get_event(). (получить событие. англ.).
Если не было новых событий, то функция get_event() возвращает 0, если события были, то возвращает 1.
Данные о произошедшем событии сохраняются в контейнере EVT.
Это массив, который имеет такие поля:
- EVT_TYPE - тип;
- EVT_FLAGS - флаги;
- EVT_TIME - время;
- EVT_X - координата X;
- EVT_Y - координата Y;
- EVT_KEY - ASCII код нажатой клавиши или одна из констант KEY_xxx;
- EVT_SCANCODE - сканкод (если имеется) или номер нажатия на экран (только для multitouch устройств; от нуля);
- EVT_PRESSURE - давление нажатия (норма = 1024);
- EVT_UNICODE - юникод (если имеется).
Из всего этого многообразия я использовал только 3 варианта данных о событии, именно их мы и разберём.
EVT_X и EVT_Y - это просто координата курсора/пальца на экране.
EVT_TYPE - это тип произошедшего события.
Типы событий бывают такие:
- EVT_MOUSEBUTTONDOWN - клик мышкой, первое нажатие на экран;
- EVT_MOUSEBUTTONUP - окончание клика, палец поднялся с экрана;
- EVT_MOUSEMOVE - движение курсора/пальца по экрану;
- EVT_QUIT - выход из приложения
Именно эти 4 типа событий мы и рассмотрим. Другие события можно посмотреть в справке от автора языка.
примечание
Все эти страшные название - это константы, то есть переменные, значение которых никогда не меняется. Это просто имена, данные разным числам, что бы было проще запомнить и код легче читался. Например массив EVT имеет 9 ячеек и каждому числу от 0 до 8 присвоено имя.
Например код
if EVT[ EVT_TYPE ] == EVT_QUIT // выход
Можно заменить на
if EVT[ 0 ] == 9
но читается он уже хуже и надо обращаться к справке
Пример 1
Ну а теперь разберём простенький пример, где будем использовать клики по экрану.
В строке 2 у нас стоит метка, на которую будем переходить из строки 16
С 3 по 14 строку у нас идёт цикл, который будет выполняться, пока функция get_event() фиксирует какое либо событие (пока возвращает 1).
В строке 5-8, если был клик/нажатие по экрану, то в этом месте пишем синим цветом "DOWN".
В строке 10-13, если отпустили кнопку мыши/подняли палец, то в этом месте пишем зелёным цветом "UP".
Надписи выравнены по нижнему правому краю ( BOTTOM | RIGHT ), то есть нижним-правым краем касаются точку клика.
В строке 15 выводим изображение на экран устройства.
Строка 16 - возвращаемся к строке 2
При выполнении кода, получится вот такая картина
В коде я использовал запись while get_event() , хотя можно было использовать if get_event() , разберём, почему предпочтение отдано циклу.
Во время клика, движения курсора и отпускания кнопки произойдет много событий. Событие "движение мышки" нам не нужно, но при использовании условия if после каждого события будет выполнятся команда frame() - а это затратная по времени операция.
При использовании цикла while количество выполнений команды frame() сократится. При быстром поступлении событий, код будет крутится в цикле, не доходя до frame().
примечание
В функции print() я использовал выравнивание "BOTTOM | RIGHT", разберём, что это такое.
TOP, BOTTOM, LEFT, RIGHT - это встроенные в язык константы. Запишем, чему они равны в двоичном виде
TOP = 0001 (1)
BOTTOM = 0010 (2)
LEFT=0100 (4)
RIGHT =1000 (8)
Команда print() смотрит параметр выравнивания. Если первый бит (крайний правый) равен единице, то выравнивание происходит по верху ( TOP ), если второй бит равен единице, то выравнивание происходит по низу ( BOTTOM ). Если оба бита равны 0, то по центру
Всё то же самое и с 3 и 4 битом и выравниванием по правому и левому краю.
Вертикальная черта ( | ) означает побитовую операцию ИЛИ. Происходит побитовое сравнение двух чисел и если в заданной позиции хоть у одного числа бит равен 1, то на выходе в этой позиции тоже будет 1.
Поэтому "BOTTOM | RIGHT" - это побитовая операция ИЛИ над числами 0010 и 1000, что в итоге даёт 1010 (в двоичном виде).
Пример 2
Разберём пример, где можно с помощью курсора/пальца рисовать линию на экране.
Будем использовать функцию line(), которая рисует прямую линию и в которую в качестве параметров передаётся координаты начала и конца и цвет линии.
В строке 2 объявляем переменный, в которых будем хранить координаты начала(x1,y1) и конца(x2,y2) линии.
В строке 3 объявляем переменную click, которая будет использована, как флаг, сигнализирующий о том, что кнопка мыши нажата. Этот флаг не нужен, если запускать код на телефоне, но для того, что бы код работал и под Windows и под Android будем его использовать
Строка 4 - это метка, куда будем возвращаться, когда код дойдет до конца
Строка 5 - запускаем цикл проверки событий
Строка 8-11. Если была нажата кнопка мышки(палец коснулся экрана), то запишем координаты курсора в переменные x1 и y1 и поставим флаг click, означающий что кнопка мыши нажата(палец коснулся экрана).
Строка 13-15. Если мы отпустили кнопку мыши (оторвали палец от экрана), то отметим это в переменной click.
Строка 17-23. Собственно рисуем. Делаем это только в том случае, если кнопка мыши нажата, то есть если click==1 ( строка 19 ). Дело в том, что событие EVT_MOUSEMOVE в Windows фиксируется в независимости от того, нажата ли кнопка мышки или нет.
Строка 21. Записываем текущие координаты курсора(пальца) в переменные x2, y2.
Строка 22. Соединяем линией старые координаты (x1, y1) с текущими ( x2, y2 ).
Строка 23. Переписываем в переменные x1 и y1 текущие координаты. Теперь эти координаты будут началом следующей линии.
Строка 26. Если программу закрыли, то выйти. Функция halt моментально закрывает приложение. Эта строчка не обязательна, она просто ускоряет выход из программы.
Строка 28. Цикл проверки событий завершился и можно обновить экран.
Строка 29. Переходим к строке 4 (к метке label).
Ну а на этом урок закончен.