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

Анимације

Анимације подразумевају промену слике на екрану обично у правилним временским интервалима (на пример, на сваких 50 милисекунди). У програмима у којима се слика није мењала током извршавања, цртање смо вршили само једном, пре главне петље обраде доагађаја, док ћемо у програмима са анимацијом цртање вршити обично унутар тела те главне петље (или у засебној функцији коју ћемо на том месту позивати). Постоји неколико уобичајених начина да се анимација реализује и у наставку ћемо објаснити неколико њих.

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

Чекање дати број милисекунди

Најједноставнији начин да се анимација оствари је следећи.

У склопу главне петље прво вршимо цртање, затим чекамо одређено време (на пример, 50 или 100 милисекунди) и након тога обрађујемо све догађаје који су наступили током цртања и чекања, тј. који су наступили од претходне обраде догађаја (пре свега проверавамо да ли је корисник искључио прозор тј. да ли је наступио догађај pg.QUIT). Ако јесте, прекидамо петљу (било постављањем променљиве kraj на True, било наредбом break).

Чекање можемо остварити позивом функције pg.time.wait(???), чији је параметар дати број милисекунди (1000 милисекунди је једна секунда).

Листа свих догађаја који су регистровани у реду од тренутка претходног читања тог реда се може добити функцијом pg.event.get(). Током обраде догађаја пролазимо кроз ту листу анализирајући један по један догађај (подсетимо се, пролазак кроз елементе листе остварује се наредбом облика for element in lista: ...). Дакле, у овом сценарију имамо петљу у петљи. У унутрашњој петљи for можемо вршити анализу свих догађаја и реаговати на њих на исти начин као што је то био случај у програмима у којима смо приказивали како се реагује на догађаје (обично је то гранање на основу типа догађаја).

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

Коришћење сата

Претходно решење не узима у обзир ни трајање исцртавања ни обраде догађаја (пауза је увек иста, без обзира на то колико је исцртавање трајало). То се може поправити ако се уместо pg.time.wait употреби сат који креирамо помоћу pg.Clock.

На овај начин смо рекли да желимо да се тело петље (тј. цртање) изврши тачно 25 пута током једне секунде и то ће најчешће и бити случај. Ако хоћемо да будемо потпуно прецизни, овим смо заправо поставили горње ограничење на учесталост извршавања тела главне петље - оно сигурно неће бити извршено чешће од броја који је наведен као аргумент функције tick. Наиме, у неким изузетним ситуацијама (на пример, ако поставимо велику учесталост, а цртање је компликовано и захтева пуно времена), систем неће успети да постигне наведену учесталост и тело петље ће се извршити ређе од онога што је наведено.

Коришћење тајмера

Још једно решење за прављење анимација подразумева да се направи тајмер (енгл. timer) који ће откуцавати у правилним временским интервалима (откуцај тајмера подразумева генерисање одређеног догађаја). Посматрајмо наредни код.

Сваки пут када тајмер откуца, генерише се догађај који смо навели у позиву pg.time.set_timer. То ће најчешће бити догађај pg.USEREVENT који се не региструје аутоматски (као што се нпр. pg.QUIT аутоматски региструје приликом гашења прозора или се pg.KEYDOWN региструје приликом притиска на тастер тастатуре), већ се управо користи за овакве сврхе.

Петљу обраде догађаја организујемо тако да се на њеном почетку црта, а затим се чека да се деси наредни догађај позивом pg.event.wait() - потпуно исто као у програмима које смо описивали у делу у ком смо описивали реаговање на догађаје. Та функција блокира извршавање програма док се не догоди неки догађај. Ако се догодио догађај pg.QUIT, прекида се извршавање петље (па самим тим и програма). Ако је то био догађај pg.USEREVENT, који представља откуцај нашег навијеног сата, тада треба да ажурирамо наш цртеж. У супротном се десио неки догађај на који не реагујемо (на пример, корисник је мало померио миша) и тада не би требало ништа радити. Пошто ће се и након таквих догађаја тело наше петље поново извршити, потребно је некако да спречимо да се у тим ситуацијама исцртавање поново врши. Један начин да се то уради је да се уведе променљива treba_crtati коју на почетку постављамо на True (да би се у првом проласку кроз петљу слика нацртала), да се након цртања она постави на вредност False, да се у наредним проласцима кроз петљу (проузрокованим догађајима који су нам често ирелевантни) не би поново цртало, а да се након откуцаја нашег сата она поново поставила на True да би се након тог догађаја слика ажурирала. Са оваквим приступом апликација је веома одзивна (скоро моментално реагује на све врсте догађаја) и лако се може проширити и реакцијама на друге врсте догађаја (нпр. на притиске на тастере на тастатури или акције мишем).