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

Неке једоставне анимације

Сада можемо прећи на писање програма у којима се приказују неке једноставне анимације.

Насумично цртање кругова

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

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

Срце које куца

Напиши програм који приказује анимацију срца које куца. Срце можеш приказати коришћењем слике srce.png.

../_images/srce.png

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

Смајлић и тужић

Микица често мења расположење. Час је срећна, час је тужна. Напиши програм који приказује слике смајлића и тужића које се наизменично смењују. Можеш употребити слике smajlic.png и tuzic.png.

../_images/smajlic.png ../_images/tuzic.png

Цртани филм

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

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

Овај задатак личи на задатак у ком смо током анимације мењали циклично мењали боје позадине, једино што ћемо уместо листе која садржи називе боја чувати листу која садржи слике које чине цртани филм. Слике је пожељно учитати на почетку програма, пре почетка анимације (подсетимо се, слику можемо учитати помоћу функције pg.image.load). Променљива slika представљаће позицију слике у листи која се приказује у текућем фрејму. Функција crtaj има задатак само да обрише екран (бојећи позадину у бело) и да затим прикаже слику из листе slike која се налази на позицији одређеној променљивом slika (подсетимо се, слику приказујемо помоћу функције prozor.blit). Функција novi_frejm ће имати задатак да увећа вредност променљиве slika, тако да се вредност врати на нулу када превазиђе последњу вредност у листи.

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

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

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

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

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

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

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

Опет се ради о анимацији која позива исцртавање у правилним временским интервалима. Пошто је десетинка прилично кратак интервал можемо употребити било који од начина анимације које смо на почетку овог поглавља описали. Централни део задатка представља цртање насумичних облика. Интензивно ћемо користити функцију 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.

Мало компликованије, али боље решење било би да се тренутни облик (његова врста, и потребне координате и величине) памте у глобалним променљивама. У функцији novi_frejm би се генерисао облик, а у функцији crtaj би се само исцртавао.

Сијалице

Напиши програм који приказује дисплеј на коме је поређано 20 сијалица, тако да се наизменично укључује једна по једна.

Сијалице које се полако гасе

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

Седмосегментни дисплеј

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

Једна од основних ствари у овом задатку је цртање сегмената на дисплеју. Сваки сегмент можемо нацртати као једну дебљу дуж. Нека променљива debljina садржи дебљину сегмента (на пример, 20 пиксела). Нека променљива sirina одређује дужину хоризонтално постављених сегмената, а променљива visina одређује дужину вертикално постављених сегмената. Нека променљива margina представља удаљеност горње ивице горњег сегмента од горње ивице прозора и удаљеност леве ивице левих сегмената од леве ивице прозора. За цртање сегмената потребно је да знамо њихове крајње тачке (оне су означене зеленом бојом) на наредној слици.

../_images/sedmosegmenti_displej_koordinate.png

Пуно нам може помоћи ако одредимо x координате вертикалних, плавих линија и y координате хоризоналних, црвених линија (на пример, прва x координата једнака је збиру маргине и половине дебљине, а друга је једнака збиру прве, дебљине линије и дужине хоризонталног сегмента).

Одржаваћемо текући бројач који ће бројати од 0 до 9 (у круг). Остаје питање како да знамо који сегменти треба да буду укључени за сваки од бројева. Сегменте можемо нумерисати као на слици и затим свакој цифри можемо придружити ниску од седам нула или јединица која одређује који сегменти треба да буду укључени. Те ниске можемо чувати у једној листи (на позицији 0 ниску која кодира сигнале за цифру 0, на позицији 1 за цифру 1 итд.). На пример, нула има укључене све сегменте осим сегмента број 3, тако да за њу правимо ниску "1110111".