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).
Покушај да на основу претходне дискусије самостално напишеш програм, а ако видиш да ти је помоћ потребна, затражи је.