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.time.wait блокирали извршавање програма (корисник би могао осетити да је програм неодзиван, ако би морао чекати цео секунд између притиска на дугме за искључивање прозора и стварног искључивања програма), користићемо тајмер. Програм заправо представља веома једноставну модификацију општег костура програма који смо приказали када смо описали коришћење тајмера. Део у коме се црта је веома једноставан - позивамо функцију fill за бојење позадине екрана и као аргумент јој предајемо насумичну боју коју можемо одредити коришћењем помоћне функције nasumicna_boja коју имамо дефинисану на почетку програма.

У складу са претходном дискусијом, допуни наредни програм.

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

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

Овај програм је по својој структури веома сличан претходном. Поново ћемо користити тајмер и у ситуацијама када тајмер откуца постављати променљиву којом ћемо проузроковати цртање у наредном кораку петље. Кључни део задатка представља механизам цикличне промене боја. Најједноставнији начин да се то уради је да боје држимо у листи и да уз листу одржавамо и позицију текуће боје (њен индекс у листи). Након коришћења боје са те позиције, увећаваћемо је за 1, при том проверавајући да се након последње боје поново вратимо на прву (да индекс постане 0). Најједноставнији начин да се то уради је да се након увећавања индекса за 1 израчуна његов остатак при дељењу са дужином листе (укупним бројем боја).

У складу са претходном дискусијом, допуни наредни програм.

Цртани филм

Напиши програм који приказује цртани филм тако што наизменично приказује пет слика на екрану на којима је приказан дечак који се шета у различитим положајима. Слике носе називе setanje1.png до setanje5.png.

../_images/setanje1.png ../_images/setanje2.png ../_images/setanje3.png ../_images/setanje4.png ../_images/setanje5.png

Насумично цртање облика

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

Опет се ради о анимацији која позива исцртавање у правилним временским интервалима. Пошто је десетинка прилично кратак интервал можемо употребити било који од начина анимације које смо на почетку овог поглавља описали. Централни део задатка представља цртање насумичних облика. Интензивно ћемо користити функцију random.randint из модула random који морамо да укључимо на почетку програма, која генерише насумични цео број из интервала који се задаје кроз параметре функције.

Дефинисаћемо две помоћне функције - једну која насумично одређује боју тако што три пута насумично одабере број између 0 и 255 и другу која насумично одређује тачку на екрану тако што одабере један број између 0 и sirina и други између 0 и visina (при чему ове две променљиве представљају димензије прозора).

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

Пре цртања треба да одредимо да ли ћемо цртати дужи, правоугаонике или кругове. То можемо урадити бирањем насумичног броја између 1 и 3. Ако се одабере 1 цртаће се дуж, ако се одабере 2 онда правоугаоник, а ако се одабере 3 цртаће се круг. Дуж се црта тако што се боја и крајње две тачке одаберу насумично (коришћењем раније описаних помоћних функција). Правоугаоник цртамо тако што одаберемо горње лево теме насумично, а затим димензије одаберемо тако да будемо сигурни да ће правоугаоник остати унутар граница прозора. Ако горње лево теме има координате (x, y) а s ширина правоугаоника, онда мора да важи да је x + s мање од ширине прозора sirina. Зато ширину правоугаоника бирамо као насумични број између 0 и sirina - x. Слично одређујемо и висину правоугаоника. На крају, круг цртамо тако што центар одаберемо насумично, а полупречник бирамо тако да круг не испадне ван граница прозора. Ако центар има координате (x, y), тада је потребно да x - r буде ненегативно, а да x + r буде мање од ширине прозора. Слично y - r мора бити позитивно, а y + r мора бити мање од висине екрана. Стога се r бира као насумични број између нуле и најмањег од бројева x, sirina - x, y и visina - y. Најмањи од 4 броја можемо лако одредити Python функцијом min.

Круг који пулсира

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

Током анимације врши се промена полупречника r. У сваком кораку анимације r ће се увећавати за вредност dr која ће у неким тренуцима бити једнака 2, а у неким -2, у зависности од тога да ли се величина круга тренутно повећава или смањује. Допуштен распон полупречника биће одређен променљивама min_r и max_r и када се тренутни полупречник лоптице нађе ван интервала [min_r, max_r] тј. када се деси да је мањи од min_r или већи од max_r, тада ће dr мењати свој знак.

Анимацију поново можемо организовати на било који начин приказан у уводу (у овом примеру одабрали смо решење у којем користимо тајмер који откуцава на сваких 100 милисекунди).

Дигитални сат

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

Приказ тренутног времена потребно је извршити сваке секунде. Задатак ћемо и овај пут решити помоћу тајмера који ћемо подесити тако да откуцава сваке секунде. Дакле овај програм по својој структури опет прилично подсећа на претходна два, једино што му се фаза цртања разликује.

На почетку цртања одређујемо тренутно време. Време можемо представити бројем сати, минута и секунди. Дефинисаћемо променљиве које чувају те вредности. Функција datetime.now() из модула datetime (који увозимо на почетку програма) враћа тренутно време (време системског сата рачунара на којем се програм извршава) у облику структуре чије поље hour садржи број сати (од 0 до 23), поље minute садржи број минута (од 0 до 59) и second садржи број секунди (од 0 до 59).

На основу броја сати, минута и секунди градимо текст који ћемо приказати на средини екрана. Желимо да и сати и минути и секунде увек имају тачно две цифре (ако су једноцифрени, желимо да се допуне водећим нулама). У језику Python ниску str можемо допунити водећим нулама до дужине n позивом str.rjust(n, "0"). Подсетимо се да ниске надовезујемо применом оператора +. Када смо направили ниску која садржи тренутно време приказујемо је на средини екрана. То радимо на потпуно исти начин као у примерима које смо приказали у поглављу о цртању.