29.3. Догађаји миша¶
За дугмад миша постоје догађаји притиска и отпуштања дугмета: pg.MOUSEBUTTONDOWN
и
pg.MOUSEBUTTONUP
. Миш често има три дугмета (лево, средње и десно) и клик на било које од
њих генерише поменута два догађаја. Ови догађаји садрже следећа
поља.
Поље
dogadjaj.button
може да садржи број од 1 до 5 и означава које дугме миша је притиснуто (1 - лево, 2 - средње, 3 - десно, 4 - скрол на горе, 5 - скрол на доле).Поље
dogadjaj.pos
садржи уређени пар координата позиције миша на којој је дугме притиснуто.
Поред догађаја притиска на дугме, приликом померања миша генерише се
догађај pg.MOUSEMOTION
. Заправо, током померања миша генерише се
више оваквих догађаја (сваки од њих описује неко мало померање миша у
неком веома кратком временском интервалу, тако да сваки такав догађај
обично описује померање тек за неколико пиксела). Ови догађаји садрже
следећа поља.
Позицију миша након померања можемо одредити помоћу
dogadjaj.pos
, које садржи уређени пар координата на којима се миш нашао након померања.Поље
dogadjaj.rel
садржи уређени пар који описује колико се током тог једног померања миша позиција променила (тај пар представља разлику између крајње и почетне координате \(x\) и крајње и почетне \(y\) координате).Поље
dogadjaj.buttons
садржи трочлану листу логичких вредности које за свако од три дугмета миша одређују да ли је било притиснуто током померања миша.
Дан и ноћ¶

Напиши програм који приказује небо и то - ако је дан, плаво са жутим сунцем у горњем левом углу, а ако је ноћ, онда црно са сто белих звездица насумично распоређених по њему. Када се клинке мишем било где на прозор, дан се мења у ноћ, а ноћ у дан.
Стање сцене биће одређено логичком променљивом
dan
, која ће имати вредностTrue
ако је тренутно дан.У функцији за цртање вршићемо гранање на основу вредности те променљиве и цртамо плаво небо са сунцем, односно црно небо са звездицама (њих цртамо у петљи и положај им одређујемо насумично).
У функцији обраде догађаја проверавамо да ли је у питању догађај притиска дугмета миша
pg.MOUSEBUTTONDOWN
и ако јесте, мењамо вредност логичке променљивеdan
(гранањем, или још лакше помоћу оператора негацијеnot
).
Мењај боју позадине мишем¶

Напиши програм који мења боју позадине екрана у зависности од положаја миша. Што се миш налази ближе десној ивици прозора, то је више црвене боје, а што је ближе доњој ивици прозора, то је више плаве боје. Зелена компонента је стално на нули.
Глобално стање сцене биће одређено променљивама
crvena
иplava
, које имају вредности између 0 и 255 и одређују количину црвене, односно плаве светлости у тренутној боји позадине.Функција
crtaj
ће бити веома једноставна - бојиће позадину прозора на основу вредности променљивихcrvena
иplava
.Реагујемо на свако померање миша (догађај
pg.MOUSEMOTION
). Из позиције на којој се миш налази, тј. пољаdogadjaj.pos
, издвајамо координатеx
иy
и на основу њих одређујемо боју, дакле ажурирамо вредности глобалних променљивихcrvena
иplava
. Нијансу цврене боје одређујемо коришћењем линеарне функције која ће бити таква да \(x\) координату нула пресликава у интензитет боје нула, а \(x\) координату једнаку ширини екрана пресликава у 255. Ту функцију је лако конструисати - координатуx
делимо ширином екрана и множимо са 255 (наравно, заокружимо резултат на цео број). Потпуно аналогно, на основуy
координате одређујемо нијансу плаве боје.
На основу претходне дискусије допуни наредни програм.
Чекић¶

Напиши програм у коме мишем помераш чекић по екрану. Чекић је у
подигнутом положају, а када притисне дугме миша, чекић се
спусти. Можеш употребити слике CekicGore.png
и
CekicDole.png
.


Стање сцене биће одређено положајем центра чекића који ће бити одређен вредностима променљивих
mis_x
иmis_y
. Слике ћемо учитати у уређени парmis_slika
(прво чекић горе, затим чекић доле), а слику коју тренутно треба приказати ћемо одређивати на основу вредности променљивеi_slika
(њена вредност 0 ће указивати на то да треба нацртати чекић горе, а 1 да треба нацртати чекић доле).У функцији
crtaj
бојићемо позадину екрана у светлоплаво (да би се обрисала претходна слика) и приказиваћемо одговарајућу слику (елемент параmis_slika
на позицијиi_slika
) тако да јој се центар налази на позицији(mis_x, mis_y)
(подсетимо се, треба одредити положај горњег левог угла слике и то се ради тако што се од центра слике одузме пола њене ширине, односно висине).У функцији за обраду догађаја ћемо реаговати на притисак тастера миша (догађај
pg.MOUSEBUTTONDOWN
) и тада ћемо променљивојi_slika
додељивати вредност 1, како би се приказивао спуштен чекић. На отпуштање тастера миша (догађајpg.MOUSEBUTTONUP
) ћемо променљивојi_slika
додељивати вредност 0, како би се приказивао подигнут чекић. На померање миша (догађајpg.MOUSEMOTION
) ћемо променљивеmis_x
иmis_y
ажурирати на основу очитаног положаја миша (вредностиdogadjaj.pos
).
Покушај да на основу претходне дискусије самостално напишеш програм, а ако видиш да ти је помоћ потребна, затражи је.