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 gimnaziju

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

Као и тастатура и миш има дугмад и за њих постоје догађаји притиска и догађаји отпуштања дугмета: 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 белих звездица насумично распоређених по њему. Када се клинке мишем било где на прозор, дан се мења у ноћ, а ноћ у дан.

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

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

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

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

Кругови мишем

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

Кључна новина у овом задатку је то што је након притиска дугмета миша потребно знати координате на екрану на којима се миш налазио у тренутку када је дугме притиснуто. То је, међутим, веома лако одредити, пошто догађаји миша имају поље dogadjaj.pos које садржи управо уређени пар координата на којима се миш налазио. Овај задатак се онда лако решава тако што на почетку обојимо позадину у бело и прикажемо прозор, а затим чекамо на догађаје pg.MOUSEBUTTONDOWN и када се они региструју позивамо функцију pg.draw.circle којом цртамо круг и којој као центар круга прослеђујемо управо dogadjaj.pos. Боја се бира насумично, а полупречник је фиксиран и износи 30.

Кликни у круг

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

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

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

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

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

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

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

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

Цртање помоћу миша

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

Да бисмо задатак могли решити потребно је да реагујемо на догађај померања миша pg.MOUSEMOTION. Након детекције овог догађаја морамо проверити да ли је било притиснуто лево дугме миша (то можемо урадити провером логичке вредности dogadjaj.buttons[0]). Након сваког померања цртамо линијицу између позиције на којој је миш након померања (њу очитавамо помоћу dogadjaj.pos) и позиције на којој је миш био пре померања (њу можемо одредити сабирањем координата парова dogadjaj.pos и dogadjaj.rel).

Задатак смо могли решити и без коришћења поља dogadjaj.buttons и dogadjaj.rel. Можемо памтити претходу позицију миша (за то користимо променљиву prethodna_poss) као и податак о томе да ли је дугме притиснуто (за то користимо логичку променљиву crtanje). Када се региструје догађај pg.MOUSEBUTTONDOWN тада иницијализујемо претходну позицију и региструјемо да је дугме притиснуто. Док се догађају догађаји pg.MOUSEMOTION проверавамо да ли је дугме притиснуто и ако јесте цртамо линијице од претходне до тренутне позиције миша. Када се региструје догађај pg.MOUSEBUTTONUP тада памтимо да дугме више није притиснуто.