Садржај
1. Робот Карел - линијски програми и бројачка петља
2. Робот Карел - условна петља и гранање
3. Робот Карел - задаци за вежбање
4. Корњача графика - линијски програми и петље
5. Корњача графика - гранање, угнежђене петље, функције, торке и листе
6. Корњача графика - задаци за вежбање
9. Израчунавања - коришћење и дефинисање функција
10. Израчунавања - задаци за вежбање
13. Контрола тока - вежбање
17. Програмирање 2Д графике - Увод у Pygame

28.1. Анимације - сусрети објеката на екрану

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

Корњача и зец

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

../_images/kornjaca.png ../_images/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.

../_images/strazar_levo.png ../_images/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.

../_images/avion.png ../_images/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).

(Created using Swinx, RunestoneComponents and PetljaDoc)
© 2022 Petlja
A- A+