V tejto lekcii sa pozrieme na tzv. _udalosti_ v SDL. Udalosti sú veci, čo sa počítaču, resp. operačnému systému, stanú, a oznámi ich programu. Tu sú nejaké príklady udalostí, čo môže operačný systém programu v SDL poslať:
* "Užívateľ klikol na krížik, skonči sa."
* "Užívateľ pohol myšou a teraz je na pozícii [21, 178]."
* "Užívateľ natiahol okno na veľkosť 1000 krát 100."
* "Prešlo 15 sekúnd, tak ti to oznamujem, presne ako si chcel."
Programy majú na práci aj iné veci, ako spracovávať udalosti. Tie, ktoré ešte neboli spracované, sa zaradzujú do tzv. _fronty udalostí_. Keď má program práve chvíľu času, pozrie sa, aké udalosti v nej medzičasom pribudli, a zareaguje na nich.
Základná funkcia na prácu s frontou udalostí je EventQueue.poll
. Tá sa pozrie do fronty udalostí, a ak tam niečo je, tak to vráti. (Inak vráti _nil_.)
h3. Typy udalostí
Teraz ukážem, ako s tou udalosťou pracovať a zisťovať, čo je zač. Hlavne je dôležité, aký typ udalosti to vlastne je. Keďže Ruby je objektový jazyk, rôzne typy udalostí sú rozlíšené ako rôzne triedy. Základná udalosťová trieda je Event
. Z nej dedia rôzne ďalšie triedy, ako napr. ResizeEvent
a KeyUpEvent
.
Na všetkých objektoch v Ruby fungujú nejaké základné funkcie. Teraz sa budú hodiť dve: funkcia class
zistí, akej triedy je ten objekt, a funkcia is_a?
zistí, či je nejakej konkrétnej triedy.
Hodila by sa praktická ukážka. Vyskúšajte tento program:
loop
event = EventQueue.poll
if event != nil
$screen.fill [0,0,0]
$screen.print [100,100], "Prisla udalost typu #{event.class}", [255,255,255]
$screen.flip
end
break if event.is_a? KeyDownEvent and event.key == K_ESCAPE
Timer.delay 10
end
Z nastavení okna vyhoďte FULLSCREEN
, lebo niektoré udalosti, ako napr. QuitEvent
(zatvorenie okna) alebo ActiveEvent
(aktivovanie alebo deaktivovanie okna) sa dajú pozorovať iba vtedy, keď je program v okne.
Celý pozostáva z jedného cyklu. Najprv zavolám funkciu EventQueue.poll
. Keď dostabem nejakú udalosť, vypíšem jej typ na obrazovku. Program končí, keď sa stlačí kláves Esc. (Objekty triedy KeyDownEvent
, čiže udalosti "stlačila sa kláves", majú atribút key
, ktorý určuje, ktorá kláves sa to stlačila. Zoznam K_
konštánt pre jednotlivé klávesy je v dodatkoch.)
*Úloha č. 1:* Napíšte, pochopte, spustite.
(Zoznam typov udalostí je v dodatkoch. Nakoniec si ho prečítajte, je dôležitý.)
h3. Používanie udalostí v programoch
Programy, ktoré sme doteraz robili, od prvej lekcie až po štvrtú, fungovali tak, že najprv niečo urobili a potom čakali, kým