Кретање више објеката¶
До сада смо правили анимације у којима су се кретали разни објекти (ауто, билијарска кугла, авион, текст), али у сваком таквом програму кретао се само један објекат. Као глобалне променљиве које описују сцену користили смо координате тог покретног објекта, а понекад и друге величине, на пример померај, смер кретања и слично.
Кретање више објеката се суштински не разликује од кретања једног објекта, само ће бити потребно да се прате величине које описују кретање свих објеката. На пример, можемо сваки објекат да представимо торком вредности које га описују, а све такве торке да држимо у листи.
Лопте¶
У следећем примеру видећемо анимирано кретање неколико лопти. Свака лопта је представљена торком \((x, y, dx, dy, r, boja)\), где су \(x, y\) координате центра лопте, \(dx, dy\) су помераји лопте по координатама, \(r\) је полупречник, а \(boja\) је боја лопте. Све такве торке су смештене у листу lopte.
Приликом распакивања торке из једног елемента листе (наредба x, y, dx, dy, r, boja = lopte[i]
), као и приликом враћања у листу (наредба lopte[i] = (x, y, dx, dy, r, boja)
), водимо рачуна о редоследу променљивих.
У примеру се за креирање лопти користи модул random
, који омогућава случајне изборе (увезен помоћу наредбе import). Функција random.randint(a, b)
враћа случајан цео број између a и b (укључујући и границе), а Функција random.choice(a)
враћа случајан елемент колекције a.
Ако упоредимо овај програм са анимацијом кретања билијарске кугле, приметићемо велику сличност. Функција nov_frejm се у суштини разликује само по томе што се сада све радње (померање, одбијање, цртање) обављају у петљи, пошто их треба обавити за сваку лопту. Задавање почетног стања је такође нешто сложеније, јер има више објеката и за сваки од њих памтимо више података, а уз то користимо и случајне изборе.
У претходном примеру сви објекти (лопте) су присутни од почетка до краја програма. Има ситуација када желимо да неки објекти престану да постоје током рада програма, или да се појаве нови (или и једно и друго). У таквим случајевима можемо у функцији nov_frejm да користимо помоћну листу, у коју стављамо величине које описују ново стање. Типичан редослед активности је следећи:
на почетку функције nov_frejm направимо нову празну листу
пролазимо кроз листу постојећих торки, мењамо их, и оне које нам и даље требају додајемо у нову листу
ако је потребно, допунимо листу новим торкама
на крају ажурирамо глобалну листу тако што она добија вредности из нове, помоћне листе
Погледајмо пример.
Звезде¶
У овом примеру симулирамо кретање кроз свемир. Звезде на које наилазимо, представљене су као бели кругови и одређене су положајем и полупречником.
За сваки фрејм израчунавамо нову, помоћну листу која описује следеће стање. Звезде померамо по неком правилу, а оне које нису потпуно изашле из прозора преписујемо у листу следећег стања. Након обраде постојећих звезда, у листу следећег стања додајемо нове звезде да се њихов број укупан број не би смањивао. На крају све звезде пребацимо у глобалну листу, да бисмо касније могли да израчунамо и следећи фрејм.
Овај пример је дат пре свега зато да бисмо на њему показали другачији начин баратања листом торки које описују сцену. Тиме су неки занимљиви детаљи остали у другом плану. Осврнимо се мало и на те, у овом контексту споредне детаље. Да бисмо добили ефекат као да се приближавамо, звезде испред нас треба да се размичу и повећавају. Због тога се у програму вредности x и y мењају тако да се звезде крећу у смеру од центра прозора, при томе све брже што су даље од центра.
За учење програмирања није нарочито важно да потпуно разумете наредбе у којима се мењају вредности x, y и r, али можете да испробате како се анимација мења када мало промените коефицијенте у тим наредбама (на пример, звезде могу да се крећу спорије, или да расту брже).
Задаци¶
Пахуље: Довршите програм тако да ради као у примеру (дугме „Прикажи пример”).
Свака пахуља је описана са само два броја, а то су њене координате, тако да су торке које ћемо користити у ствари парови \((x, y)\).
Пахуље падају за по 1 пиксел, а оне које изађу из прозора, замењују се новим пахуљама. Формирање новог стања је слично као у програму „звезде”, само су правила померања пахуља једноставнија.
Пахуље из почетног скупа се бирају било где у прозору, а оне које се касније додају као допуна, бирају се негде на горњој ивици прозора.

Одлазеће лопте: Ископирајте овде први програм (лопте), па га измените тако да се лопте не одбијају него настављају да се удаљавају, а оне које оду замењују се новим лоптама. Овај програм је комбинација два дата примера (лопте и звезде), па покушајте зато да искористите делове из оба ова програма.
Клизећи текст: Испробајте програм и пробајте да разумете како он ради. Пробајте да измените нешто у програму (текст који се приказује, боју којом се текст приказује, брзину кретања текста, или неки други детаљ).
Изазов: покушајте да измените програм тако да текст клизи на доле уместо на горе.