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

25.2. Анимације - почетни примери са објашњењима

Подијум за игру

Прилагодимо програм који је исцртавао подијум за игру из лекције 23.2, тако да подијум стварно „оживи“. Пронађи кôд који исцртава подијум и на основу тога допуни функцију crtaj.

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

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

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

Приметимо да кôд који се налази у функцији користи променљиве boje и broj_boje које су дефинисане ван функције. Такве променљиве се називају глобалне променљиве и њихова се вредност може без икаквих проблема очитати из функције. Међутим, промена вредности глобалних променљивих у функцији је компликованија. Наиме, ако желимо да глобалној променљивој променимо вредност у функцији, на почетку те функције морамо нагласити да је та променљива глобална (помоћу кључне речи global иза које следи листа глобалних променљивих, раздвојених запетама, којима ћемо у тој функцији мењати вредност). Ако у функцији не бисмо навели реч global, добили бисмо поруку о грешци.

UnboundLocalError: local variable 'broj_boje' referenced before assignment

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

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

Анализирајмо још једном претходни пример.

  • Стање програма је једнозначно одређено глобалном целобројном променљивом broj_boje која одређује редни број боје којом се прозор боји. Почетна вредност ове променљиве је нула, што значи да боје крећу да се приказују од почетка листе. Боје су смештене у глобалној листи boje, која се не мења током извршавања програма.

  • Функција crtaj боји прозор бојом, одређеном вредношћу променљиве broj_boje.

  • Функција novi_frejm ажурира вредност стања, тј. променљиве broj_boje тако што јој увећава вредност и враћа је на нулу када вредност достигне укупан број боја. Пошто се мења вредност променљиве broj_boje која је глобална, у функцији novi_frejm морамо да променљиву broj_boje означимо помоћу кључне речи global.

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

Анализирајмо још једном претходни пример.

  • Стање програма је једнозначно одређено глобалном целобројном променљивом boja која одређује тренутну боју позадине екрана. Почетна вредност ове променљиве се одређује насумично.

  • Функција crtaj боји прозор бојом одређеном вредношћу променљиве boja.

  • Функција novi_frejm ажурира стање, тј. променљиву boja тако што јој насумично додељује нову вредност. Пошто се мења вредност променљиве boja која је глобална, у функцији novi_frejm морамо да променљиву boja означимо помоћу кључне речи global. Ова се функција позива аутоматски у правилним временским интервалима и након ажурирања променљивих она позива функцију crtaj да би се прозор поново исцртао.

Општи облик програма са анимацијама

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

1. Потребно је да дефинишеш глобалне променљиве којима се представљају подаци о ликовима и објектима на сцени (ти ће се подаци мењати током анимације).

2. Потребно је да дефинишеш функцију crtaj која коришћењем тих података црта сцену. У тој функцији нећемо вршити никакву промену података.

3. Потребно је да дефинишеш функцију novi_frejm која ажурира податке о ликовима и објектима на сцени (при чему све променљиве којима се у тој функцији мења вредност морају на њеном почетку бити експлицитно означене као глобалне коришћењем кључне речи global). Након ажурирања променљивих, потребно је да у функцији novi_frejm позовеш функцију crtaj да би се промењена сцена исцртала.

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