Догађаји

Када очитавање стања није довољно

На почетку поглавља о интеракцији смо поменули да постоје два основна начина да програм добије информације о акцијама корисника. Први начин је очитавање стања миша и тастатуре, и тај начин смо у међувремену упознали.

Очитавање стања миша и тастатуре је једноставно и довољно за многе примене. Ипак, у неким ситуацијама оно није најпогоднији начин рада. На пример, ако желимо да знамо када је корисник кликнуо мишем:

  • при честом очитавању стања миша може се догодити да се у више узастопних очитавања констатује да је тастер миша доле, али не знамо да ли је то све исти клик или више кликова.

  • при ређем очитавању стања миша може се догодити да након једног очитавања корисник притисне и отпусти тастер пре следећег очитавања. У таквом случају програм неће добити информацију о том клику.

Погледајмо следећи пример.

Пример - покварени прекидач:

Следећи програм за сваки фрејм исцртава слику електричне шеме, а затим преко ње слике прекидача и сијалице. Идеја је да се кликом на прекидач „укључује и искључује светло”.

Када задатак решавамо тако што очитавамо стање миша, због горе описаних недостатака би се могли догодити разни нежељени ефекти, као што је нереаговање на клик (сувише ретко очитавање) или треперење светла (пречесто очитавање). Чак и ако ви можете да избегнете те нежељене ефекте и нормално укључите или искључите сијалицу, неко ко кликће брже или спорије може да осети проблем.

Испробајте програм кликћући различитом брзином.

../_images/Shema1_Off.png ../_images/Shema1_On.png ../_images/SwitchOff.png ../_images/SwitchOn.png ../_images/BulbOff.png ../_images/BulbOn.png

Информације о промени стања

Као што смо у уводу у ово поглавље споменули, акције корисника можемо да пратимо и на други начин, а то је коришћење системских догађаја. Догађаје којима ћемо се овде бавити можемо да схватимо као промене стања миша и тастатуре (мада има и других догађаја, као што су они генерисани помоћу системског часовника). На пример, у тренутку када се неки тастер на тастатури или мишу спусти, оперативни систем рачунара добија сигнал од улазног уређаја и региструје то као догађај. Слично се дешава и у тренутку отпуштања (подизања) тастера, промене положаја миша итд.

Сви догађаји остају регистровани и запамћени, тако да се не може догодити да неку акцију корисника пропустимо, као што је случај када само очитавамо стање.

Пајгејм библиотека нам омогућава да за сваки догађај редом добијемо по један објекат са информацијама о том догађају, да испитамо о каквом догађају се ради и да по потреби програмски реагујемо на тај догађај.

Употреба догађаја у програмима

У програмима који користе догађаје писаћемо посебну функцију obradi_dogadjaj(dogadjaj) (можете јој дати и другачије име). Ова функција као аргумент добија Пајгејм објекат dogadjaj, који садржи све потребне информације о догађају. Име наше функције за обраду догађаја додајемо као трећи аргумент у позиву функције pygamebg.frame_loop. Тиме смо омогућили да наша функција obradi_dogadjaj буде позвана за сваки догађај који наступи током рада програма.

Погледајмо сада и како конкретно обрађујемо догађај.

У функцији obradi_dogadjaj проверавамо да ли је тај догађај типа „спуштање неког дугмета миша”. То радимо тако што тип догађаја, записан у dogadjaj.type поредимо са Пајгејм константом pg.MOUSEBUTTONDOWN, која има описано значење.

Ако догађај јесте типа који нас интересује (спуштање тастера миша, то јест почетак клика), наредбом mis_tacka = dogadjaj.pos у променљиву mis_tacka смештамо координате тачке на којој је био миш у тренутку наступања догађаја, јер нас занима на шта је корисник кликнуо.

Наредбама које следе проверавамо даље да ли је корисник кликнуо на прекидач, па ако јесте мењамо вредност логичке променљиве ukljucen_prekidac која представља стање прекидача.

Пример - прекидач: Овај програм ради исто што и претходни, али користи догађај спуштања тастера миша па нема нежељених ефеката.