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
да би се промењена сцена исцртала.