Prijavi problem


Obeleži sve katergorije koje odgovaraju problemu

Jos detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link
Na žalost nismo trenutno u mogućnosti da obradimo Vaš zahtev.
Molimo Vas da pokušate kasnije.

Programiranje grafike pomoću Pygame, priručnik za sedmi razred

Реаговање на догађаје мишем

Као и тастатура и миш има дугмад и за њих постоје догађаји притиска и догађаји отпуштања дугмета: pg.MOUSEBUTTONDOWN и pg.MOUSEBUTTONUP. Реаговање на њих је веома слично као што је реаговање на догађаје тастатуре pg.KEYDOWN и pg.KEYUP. Миш често има три дугмета (лево, средње и десно) и клик на било које од њих генерише поменута два догађаја. Догађаји типа pg.MOUSEBUTTONDOWN садрже поље dogadjaj.button који може да садржи број од 1 до 5 и означава које дугме миша је притиснуто (1 - лево, 2 - средње, 3 - десно, 4 - скрол на горе, 5 - скрол на доле) и поље dogadjaj.pos које садржи уређени пар координата тачке на којој је дугме притиснуто.

Поред догађаја притиска на дугме, приликом померања миша генерише се догађај pg.MOUSEMOTION. Заправо, током померања миша генерише се више оваквих догађаја (сваки од њих описује неко мало померање миша у неком веома кратком временском интервалу, тако да сваки такав догађај обично описује померање тек за неколико пиксела). Позицију миша након померања можемо одредити помоћу dogadjaj.pos, које садржи уређени пар координата на којима се миш нашао након померања. Поље dogadjaj.rel садржи уређени пар који описује колико се током тог једног померања миша позиција променила (тај пар представља разлику између крајње и почетне координате x и крајње и почетне y координате). Поље dogadjaj.buttons садржи трочлану листу логичких вредности које за свако од три дугмета миша одређују да ли је било притиснуто током померања миша.

Дан и ноћ

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

Једина глобална променљива коју ћемо одржавати је променљива dan која ће имати вредност True ако и само ако је тренутно дан. У функцији за цртање вршимо гранање на основу вредности те променљиве и цртамо плаво небо са сунцем тј. црно небо са звездицама (њих цртамо у петљи и положај им одређујемо насумично).

У функцији обраде догађаја проверавамо да ли је у питању догађај притиска дугмета миша pg.MOUSEBUTTONDOWN и ако јесте, мењамо вредност логичке променљиве dan (најлакше помоћу оператора негације not).

Три боје позадине у круг

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

Сличан задатак је приказан у делу о анимација, једино што се тамо боја позадине мењала у правилним временским интеравалима, док се у овом задатку тражи да се мења на клик мишем. Одржавамо листу имена боја и позицију текуће боје позадине у тој листи. У функцији за обраду догађаја проверавамо да ли се догодио догађај клика мишем и ако јесте, увећавамо позицију текуће боје за 1 и израчунавамо остатак тако добијеног броја са 3 (да бисмо се после вредности 2 вратили поново на 0).

Три боје позадине напред назад

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

И овај задатак решавамо потпуно аналогно оном датом у поглављу о анимацијама.

Кликни у круг

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

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

Координате центра круга одређујемо као половину ширине и висине. Пошто круг додирује ивице прозора, полупречник му је једнак мањој од половине висине и половине ширине (ако су једнаке, онда ће додиривати све 4 ивице).

Тренутно стање (да ли је круг зелен или је позадина зелена) региструјемо помоћу логичке променљиве. Боје при цртању постављамо у зависности од вредности те променљиве. Реагујемо на догађај клика мишем и стање те променљиве мењамо ако се позиција на којој се кликнуло (очитавамо је помоћу dogadjaj.pos) налази унутар круга. У том случају иницирамо и поновно исцртавање.

Трећина прозора

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

У функцији за цртање ћемо одређивати координате текуће позиције миша (које можемо очитати функцијом pg.mouse.get_pos()), одређиваћемо у којој се трећини прозора налази тренутна x координата (то можемо урадити гранањем) и у зависности од тога одређиваћемо x координату леве ивице правоугаоника (ако је тачка у првој трећини та ивица је на координати 0, ако је у другој трећини та ивица је на трећини ширине прозора, а ако је у трећој трећини та ивица је на две трећине прозора).

Шетање пахуље мишем

Напиши програм који омогућава да се померањем миша помера и пахуљица по екрану (како се помери миш, тако се помери и пахуљица). Можеш употребити слику pahulja.png.

../_images/pahulja1.png

У овом програму ћемо показати мало другачију технику него у претходног, тако што ћемо памтити текућу позицију показивача миша. У функцији crtaj цртаћемо пахуљу тако да јој се центар налази на тој позицији (горњи леви угао слике је у односу на ту тачку померен лево тј. на горе за пола ширине тј. висине слике). У функцији obradi_dogadjaj детектоваћемо догађај померања миша (pg.MOUSEMOTION) и мењаћемо вредност глобалне променљиве у којој се памти позиција миша.

Наравно, и у овом примеру смо ову глобалну променљиву могли избећи употребом функције pg.mouse.get_pos() у склопу функције за цртање (тада би у функцији обраде догађаја било једино потребно сигнализирати да се сцена поново нацрта када се детектује догађај померања миша).

Превлачење пахуље

Напиши програм који ти омогућава да мишем превлачиш (енгл. drag and drop) пахуљу са једног на друго место (пахуља се превлачи док је лево дугме притиснуто).

У овом примеру промену координате пахуље вршићемо само ако је дугме притиснуто. Ако се ослонимо само на основни механизам обраде догађаја, тада можемо реаговати на догађај притиска дугмета миша (pg.MOUSEBUTTONDOWN) и тада поставити логичку променљиву prevlacenje на вредност True ако се миш налази негде изнад пахуље (што можемо детектовати посебном функцијом која проверава да ли је тачка у правоугаонику који одговара слици пахуље). Слично, реагујемо на догађај отпуштања дугмета миша (pg.MOUSEBUTTONUP) и тада поставити ту променљиву на вредност False. Када се детектује догађај померања миша (pg.MOUSEMOTION) и када променљива prevlacenje има вредност True, тада позицију пахуље постављамо на текућу позицију миша (dogadjaj.pos). У функцији за цртање цртамо пахуљу тако да јој је центар на месту текуће пахуље.

Боја позадине мишем

Напиши програм који мења боју позадине екрана у зависности од положаја миша. Што се миш налази ближе десној ивици прозора, то је више црвене боје, а што је ближе доњој ивици прозора, то је више плаве боје. Зелена компонента је стално на нули.

У овом задатку не реагујемо на клик миша, него на свако померање миша (догађај pg.MOUSEMOTION). Из позиције на којој се миш налази тј. поља dogadjaj.pos издвајамо координате x и y и на основу њих одређујемо боју. Нијансу цврене боје одређујемо коришћењем линеарне функције која ће бити таква да x координату нула пресликава у интензитет боје нула, а x координату једнаку ширини екрана пресликава у 255. Ту функцију је лако конструисати - координату x делимо са ширином екрана и множимо са 255 (наравно, заокружимо резултат на цео број). Потпуно аналогно, на основу y координате одређујемо нијансу плаве боје.

На основу претходне дискусије допуни наредни програм.