28.1. Анимације - сусрети објеката на екрану¶
У примерима који следе видећете како да анимације програмирате тако да се анимирани објекти сусрећу. Ако програме не бисмо писали на овај начин, наши објекти би пролазили једни кроз друге. На пример, да лик у некој игрици не би могао да пролази кроз зидове, морамо код написати тако да препознамо тренутак када он додирује зид и не дозволимо му да настави да се креће у том правцу.
Корњача и зец¶

Напиши програм који приказује корњачу и зеца који полазе са два
краја прозора, крећу се једно према другом (зец се креће два пута
брже од корњаче) док се не сусретну, након чега се на екрану
исписује порука „Здраво“. Можеш употребити дате слике kornjaca.png
и zec.png
.


За разлику од претходних примера, у овом примеру анимирамо два различита објекта.
Стање сцене је одређено положајем корњаче и положајем зеца. Променљивама
kornjaca_x
иkornjaca_y
бележимо горњи леви угао слике корњаче (kornjaca_slika
), а променљивамаzec_x
иzec_y
бележимо горњи леви угао слике зеца (zec_slika
).Цртање и померање ће зависити од тога да ли су се корњача и зец срели. Корњача креће са левог, а зец са десног краја прозора. Тренутак сусрета је када десни крај слике корњаче (на
kornjaca_x
додајемо ширину слике корњаче) достигне леви крај слике зеца.У функцији
crtaj
цртамо небо, земљу и сунце, чиме суштински бришемо претходни цртеж. Након тога приказујемо слике корњаче и зеца на положајима одређеним текућим стањем сцене. На крају проверавамо да ли су се корњача и зец срели и ако јесу, на средини прозора приказујемо поздравну поруку.У функцији
novi_frejm
прво проверавамо да ли су се зец и корњача срели. Ако јесу, анимација је завршена и не вршимо никакве промене. У супротном померамо корњачу надесно (увећавајући вредностkornjaca_x
) и зеца налево (умањујући вредностzec_x
). Зец треба да се креће брже па умањење треба да буде веће него увећање.
Допуни наредни програм на основу претходне дискусије.
Одбијање приликом сусрета¶
Стражар који патролира¶

Напиши програм који приказује стражара који патролира лево-десно по
екрану. Можеш користити дате слике strazar_levo.png
и strazar_desno.png
.


Стање сцене садржи текућу позицију стражара. Позиција може, на пример, бити одређена променљивом
x
која региструје x координату горњег левог угла слике стражара (иницијализује се на нулу и током анимације се мења) и променљивомy
која се иницијално поставља тако да се стражар налази на поду (вредност је једнака разлици висине прозора и висине слике стражара) и која не мења своју вредност. Када стражар дође до краја прозора мења му се смер кретања. Зато ће стање сцене бити одређено и његовим смером кретања. Смер може бити представљен знаком променљиве која представља брзину кретања. Претпоставићемо да брзину кретања одређује променљиваdx
, која може бити и позитивна и негативна.У функцији
novi_frejm
координату \(x\) увећавамо заdx
. Ако јеdx
позитиван број, тада \(x\) координата расте и стражар ће се кретати надесно. Ако јеdx
негативан број, тада \(x\) координата опада и стражар ће се кретати налево. Када стражар испадне ван прозора (када му је координата \(x\) десног краја већа од ширине прозора или му је координата \(x\) левог краја мања од нуле, тј. када јеx < 0
или јеx + strazar_sirina > sirina
), тада му се смер кретања мења тако што се промени знак брзинеdx
.У функцији
crtaj
приказујемо слику стражара тако да јој горње лево теме буде у тачки(x, y)
. Пошто знак бројаdx
одређује и смер кретања, на основу њега одређујемо слику коју ћемо приказивати (када је вредност позитивна, приказујемо слику стражара окренутог надесно, а када је негативна, приказујемо слику стражара окренутог налево).
На основу претходне дискусије допуни наредни програм.
Авион¶

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


Положај авиона можемо регистровати променљивама
avion_x
иavion_y
које представљају координате горњег левог угла слике авиона. Пошто се током кретања авиона мења његов смер кретања, потребно је да део стања буде и правац, смер и брзина кретања. Све ове информације могу бити приказане помоћу променљивихavion_dx
иavion_dy
. Бројavion_dx
ће представљати хоризонталну брзину авиона (за колико ће се пиксела мењати \(x\) координата авиона приликом преласка на наредни фрејм). Пошто се авион стално помера надесно и то увек истом брзином, ова променљива ће имати сталну позитивну вредност. Бројavion_dy
ће представљати вертикалну брзину авиона (за колико ће се пиксела мењатиavion_y
координата авиона приликом преласка на наредни фрејм). Када је негативна, \(y\) координата опада и авион ће се подизати (мање y координате су ближе врху прозора). Када је једнака 0 авион неће мењати висину, а када је позитивна \(y\) координата расте и авион ће се спуштати.Функција
crtaj
боји прозор у небоплаву (чиме се пребрише претходни фрејм), прикажу се слика сунца (на жељеној позицији) и слика авиона (на позицији одређеној променљивамаavion_x
иavion_y
).Функција
novi_frejm
ажурираavion_x
иavion_y
тако што их увећа за вредности брзинаavion_dx
иavion_dy
. Видећеш да се авион хоризонтално увек креће надесно, тако да је потребно мењати само вертикални смер. Иницијално авион треба да се подиже тако да ће иницијална вертикална брзинаavion_dy
бити постављена на негативну вредност (нпр. на -1). Када врх авиона достигне врх прозора, авион треба да почне да се спушта, тако да ћемо му вертикалну брзинуavion_dy
поставити на позитивну вредност (нпр. на 1). На крају, када дно слике авиона (које можемо израчунати тако што положај врха слике авиона увећамо за висину те слике) достигне дно прозора, авион треба да се креће по земљи, што значи да вертикални померајavion_dy
треба да постане 0.
Oдбијање лоптице¶

Напиши програм који приказује лоптицу која се креће и одбија о ивице прозора.
У променљивама
x
иy
ћемо памтити координате центра лоптице (на почетку лоптица се може налазити у центру прозора). Полупречник лоптице ћемо представити променљивомr
.Кретање лоптице се остварује тако што јој се у правилним временским интервалима (на пример, на сваких 25 милисекунди) мењају
x
иy
координате (увећаватју или умањују за по пет пиксела). Пошто су промене по обе координате идентичне, лоптица ће се увек кретати под углом од 45 степени у односу на ивице прозора. Промену координатеx
ћемо представити променљивомdx
која ће имати вредност или 5 или -5, у зависности од тога да ли се лоптица креће надесно или налево. Слично ћемо употребљавати и променљивуdy
за кретање на горе и на доле. Уређени пар(dx, dy)
представља вектор брзине кретања лоптице. Помераћемо лоптицу тако штоx
увећамо заdx
, аy
заdy
.Након сваког померања провераваћемо да ли је лоптица излетела ван граница прозора. Хоризонталну проверу можемо извршити тако што ћемо проверити да ли је леви крај лоптице лево од леве ивице прозора, или је десни крај лоптице десно од десне ивице прозора. Леви крај лоптице има \(x\) координату једнаку
x-r
, а десни крај има \(x\) координату једнакуx+r
, па се провера своди на то да се провери да лиx-r < 0
или јеx+r > sirina
. Ако је то случај, тада се мења смер хоризонталног кретања тако што се промени знак вредностиdx
. Потпуно аналогно се врши и вертикална провера (само се уместоx
користиy
, уместоdx
користиdy
и уместоsirina
користи сеvisina
).