$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još 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.

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

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

Чекање одређен број милисекунди између свака два фрејма

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

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

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

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

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

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

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

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