! Демонстрация работы функции click() ! Значения возвращаемые функцией открывают ! богатые возможности для регистрации ! событий и анимации кнопок. ! В целях демонстрации тут реализована простенькая ! анимация на события. ! Для того, чтобы поймать момент самого клика ! в программе ипользована пауза, чтобы получить ! максимальное быстродействие, читаем листинг ! и выключаем блок программы с паузой, который ! ловит клик и тормозит процесс, чтобы мы смогли его ! увидеть. gr.open 255,100,100,100,0,1 gr.screen sw,sh gosub gr_functions ! Задаем координаты четырех областей касаний, ! а также - цветных прямоугольников (кнопок) ! lt - left, tp - top, rt - right, bt - bottom array.load lt[], 0, sw/2, sw/2, 0 array.load tp[], 0, 0, sh/2, sh/2 array.load rt[], sw/2, sw, sw, sw/2 array.load bt[], sh/2, sh/2, sh, sh !Задаем цвета прямоугольникам (кнопкам) array.load r[], 255, 100, 255, 100 array.load g[], 100, 255, 255, 100 array.load b[], 100, 100, 100, 255 ! И отрисовываем dim rct[4] for i=1 to 4 gr.color 150, r[i], g[i], b[i],1 gr.rect rct[i], lt[i], tp[i], rt[i], bt[i] next ! Границы кнопок обозначим линиями. gr.color 255,0,0,0,0 gr.set.stroke 3 gr.line ln,sw/2,0,sw/2,sh gr.line ln,0,sh/2,sw,sh/2 ! Создаем лейблы с информацией о статусе кнопок. ! Четыре кнопки - четыре лейбла. dim tx[8] gr.color 255,255,255,255,1 tx[1]=tx(sw/4,sh/4,"") tx[2]=tx(sw/4*3,sh/4,"") tx[3]=tx(sw/4*3,sh/4*3,"") tx[4]=tx(sw/4,sh/4*3,"") ! Под лейблами со статусом, покажем информацию о ! том, находится ли программа на паузе. ! Создаем еще четыре лейбла под статусными. ! И сразу делаем их невидимыми, чтобы показывать ! в нужный момент. ps$="Включена пауза" gr.color 0 tx[5]=txp(sw/4,sh/4+sh/30,ps$) tx[6]=txp(sw/4*3,sh/4+sh/30,ps$) tx[7]=txp(sw/4*3,sh/4*3+sh/30,ps$) tx[8]=txp(sw/4,sh/4*3+sh/30,ps$) gr.render ! Массиву cl[] - будет возвращаться ! значение функции click(), ! а массиву s$[] - будем задавать значение статусных лейблов, для удобочитаемости листинга, хотя ! он (массив) и не нужен. dim cl[4], s$[4] ! Переменная fltch - ключ управления опросом кнопок ! Прослушивание кнопок начинается в момент ! касания экрана. ! Состояние fltch=1, при загрузке программы, ! установлено для определения статуса кнопок и вывода на экран их значений. fltch=1 DO ! Можно было обойтись и без gr.touch ! команда нужна для более стабильной работы, чтобы ! нажатие на кнопку не происходило в середине цикла ! опроса кнопок, это приводило бы к тому, что более ! старшая кнопка в цикле не понимала когда нажали ! не на нее ! Если мы не хотим регистрировать стабильное ! состояние 10 функции click(), мы можем смело ! стереть ( if !fltch then gr.touch fltch, xtch, ytch), ! удалить переменную fltch, и оставить в цикле DO ! только слушатель gosub Listener ! fltch обнуляется в подпрогр. stand_by if !fltch then gr.touch fltch, xtch, ytch if fltch then gosub Listener UNTIL 0 ! Ну понеслась Listener: for i=1 to 4 ! Массив cl[] нужен не только ! для возвращения ! значений функции click(), он нужен еще и ! для передачи в нее, ее же состояния, ! поэтому он присутствует одним из ! аргументов функции, по сути, являясь ее ! входящими данными. ! Так же функция принимает координаты ! нажатий на экран lt,tp,rt,bt, указанные в начале ! программы cl[i]=click(lt[i],tp[i],rt[i],bt[i],cl[i]) ! click() - возвращает значения событий кнопок. ! 0 - режим ожидания (прослушивание). ! 1 - нажатие и удержание кнопки (кнопка вниз). ! 2 - нажатие-отпускание кнопки (клик). ! И 10 - это тот момент, когда что-то нажато, но ! не сама кнопка. ! Также click() понимает, когда на кнопку надавили ! и съехали с нее не отрываясь от экрана, ! это прекращает регистрацию клика !Событие "Клик" происходит одномоментно без !всяких !повторений, поэтому далее используем паузу для !регистрации этого события. ! Чтобы не нагромождать код, уводим события в ! отдельные процедуры if cl[i]=1 then gosub Down if cl[i]=2 then gosub Clicked if cl[i]=10 then gosub No_down next ! Узнаем все ли кнопки перешли в режим ожидания ! Если все, то stand_by if !cl[1] & !cl[2] & !cl[3] & !cl[4] then gosub Stand_by gr.render Return ! При желании можно расписать процедуры для ! каждой кнопки типа Вutton1_Down, Button1_Click ! Button2_noFocus и так далее... ! Понимающие программисты поймут ;) Stand_by: ! Перевод всех значений в стартовое состояние for i=1 to 4 ! Цвет кнопки gr.modify rct[i],"alpha",150 ! Скрываем инфо о паузе gr.modify tx[i+4],"alpha",0 ! Выводим статус s$[i]="Ожидание" gr.modify tx[i],"text",s$[i] ! Указываем, что опрос кнопок надо остановить fltch=0 next Return Down: ! Цвет нажатой кнопки чуть ярче остальных ! Стандартное значение 150 gr.modify rct[i],"alpha",210 ! Выводим статус нажатой кнопки s$[i]="Кнопка вниз" gr.modify tx[i],"text",s$[i] Return No_down: ! Кнопка узнает, что нажали не на нее ! и становится чуть темнее gr.modify rct[i],"alpha",70 ! Выводим статус ненажатой кнопки s$[i]="Нажали не меня :(" gr.modify tx[i],"text",s$[i] ! Скрываем инфо о паузе на всякий случай :) gr.modify tx[i+4],"alpha",0 Return Clicked: ! Момент отпускания ! Выводим статус s$[i]="Был клик" gr.modify tx[i],"text",s$[i] ! Обесцвечиваем кнопку, ! Становится виден серый фон. gr.modify rct[i],"alpha",0 ! Включаем паузу и сообщение о ней ! Чтобы увидеть реальную скорость клика - ! Закоментируйте этот блок ⤵ gr.modify tx[i+4],"alpha",255 gr.render pause 2000 ! ⤴ Return Gr_functions: ! Это текстовые функции ! Совсем другая история fn.def txp(x,y,s$) gr.screen w,h gr.text.align 2 s=h/50 : gr.text.size s v=-(s*(0.29/2))+s/2 gr.text.draw t,x,y+v,s$ fn.rtn t fn.end fn.def tx(x,y,s$) gr.screen w,h gr.text.align 2 s=h/40 : gr.text.size s v=-(s*(0.29/2))+s/2 gr.text.draw t,x,y+v,s$ fn.rtn t fn.end ! Вот она - гордость разработчика :) ! Функция, которая возвращает, ! практически, все необходимые события стандартной ! кнопки. (на самом деле есть еще круче, но ! эта более простая в освоении :-) fn.def click(lt,tp,rt,bt,f) gr.bounded.touch btc,lt,tp,rt,bt gr.touch tc,x,y if f=1 then c=1 if f=2 then c=0 if f=10 then c=10 if tc=1 & btc=0 & f=0 then c=10 if btc=1 & f<10 then c=1 if btc=0 & tc=0 & f=10 then c=0 if f=1 & btc=0 & tc=0 then c=2 if f=1 & btc=0 & tc=1 then c=0 fn.rtn c fn.end Return ! Функция click(), при закрытии программы, ! изредка вызывает жалобы на синтаксис, похоже ! на баг РФО ! Это решается здесь ↴ onerror: end ""