Садржај
1. Робот Карел - линијски програми и бројачка петља
2. Робот Карел - условна петља и гранање
3. Робот Карел - задаци за вежбање
4. Корњача графика - линијски програми и петље
5. Корњача графика - гранање, угнежђене петље, функције, торке и листе
6. Корњача графика - задаци за вежбање
9. Израчунавања - коришћење и дефинисање функција
10. Израчунавања - задаци за вежбање
13. Контрола тока - вежбање
17. Програмирање 2Д графике - Увод у Pygame

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.

../_images/CekicGore.png ../_images/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).

Покушај да на основу претходне дискусије самостално напишеш програм, а ако видиш да ти је помоћ потребна, затражи је.

(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+