Кретање цртежа¶
Анимације које смо до сада видели раде тако што у сваком фрејму приказују неку другу, унапред припремљену слику. Сада ћемо слике које приказујемо и померати, тако да се иста слика појављује на различитим местима у прозору, то јест креће се.
Погледајмо одмах пример:

Као и раније, имамо функцију nov_frejm која у сваком фрејму приказује неку слику. Оно што је ново у овом примеру је да се положај те слике мења из фрејма у фрејм.
Слику приказујемо тако да се њен горњи леви угао појави у тачки (auto_x, auto_y). Да би се ауто кретао на десно, у сваком фрејму повећавамо x координату слике. При томе још само водимо рачуна да када ауто оде сувише десно, да вратимо ауто тако да се његов десни крај поравна са левом ивицом прозора. На тај начин ауто почиње постепено да се поново појављује са леве стране.
На сличан начин можемо да померамо и цртеже које сами нацртамо (а не само готове слике). При томе слику или цртеж можемо да померамо у било ком смеру. Ево једног таквог примера:
Обратите пажњу на то како проверавамо да ли је билијарска кугла дотакла неку ивицу екрана. Крајња десна тачка кугле има x координату једнаку \(cx+r\). Ако би та вредност постала једнака ширини прозора, то би значило да кугла додирује десну ивицу прозора, а ако је \(cx + r > sirina\), значи да је је кугла бар делом већ прошла десну ивицу прозора. У том случају наредбом \(dx = -dx\) постижемо да се од следећег фрејма x координати кугле додаје супротна вредност у односу на досадашњу, односно да се убудуће кугла помера за по 3 пиксела на лево. То ће изгледати као да се кугла одбила од десне ивице прозора.
Приметимо још један детаљ: уместо \(cx + r > sirina\) могли смо да користимо и \(cx + r >= sirina\) и програм би радио скоро исто. Међутим, пошто се кугла не помера за по један пиксел, не би ваљало да смо користили услов \(cx + r == sirina\), јер би тада могло да се догоди да кугла прескочи положај који проверавамо и прође кроз ивицу прозора.
Детаљно смо анализирали случај десне ивице прозора, а исто размишљање је при писању програма примењено и на остале ивице. Укупни ефекат двеју if наредби је утисак да се кугла одбија од сваке ивице прозора.
Проверите да ли сте ово разумели тако што ћете одговорити на следећа питања.
Кретање цртежа - питања¶
-
Q-70: Повежите проверу да је кугла из претходног примера прошла одређену ивицу са одговарајућом *if* наредбом.
Покушајте поново!
- за леву ивицу
- if cx - r < 0
- за десну ивицу
- if cx + r > sirina
- за горњу ивицу
- if cy - r < 0
- за доњу ивицу
- if cy + r > visina
- на десно
- Покушајте поново
- на горе
- Покушајте поново
- на лево
- Тачно
- на доле
- Покушајте поново
Q-71: На коју страну се помера слика додавањем негативне вредности на њену x координату?
- if x + sl_sirina < 0:
- Покушајте поново
- if y + sl_visina < 0:
- Тачно
- if x < 0:
- Покушајте поново
- if y < 0:
- Покушајте поново
Q-72: Нека су димензије дате слике sl_sirina и sl_visina, а њен горњи леви угао (x, y). Како проверавамо да ли је слика у потпуности прошла кроз горњу ивицу прозора и више се не види ни један њен део?
-
Q-73: Нека је sirina ширина прозора, sl_sirina ширина слике, а (x, y) горњи леви угао слике. Повежите логичке услове са значењем.
Покушајте поново!
- слика је изашла кроз леву ивицу прозора
- x + sl_sirina < 0
- слика је почела да излази кроз леву ивицу прозора
- x < 0
- слика је изашла кроз десну ивицу прозора
- x > sirina
- слика је почела да излази кроз десну ивицу прозора
- x + sl_sirina > sirina
- x = sirina; dx = -10
- Тачно
- x = sirina + sl_sirina; dx = -10
- Не, то је предалеко од десне ивице.
- x = sirina - sl_sirina; dx = -10
- Не, тако је цела слика већ у прозору.
- x = sirina + sl_sirina; dx = 10
- Не, слика је предалеко и још ће наставити да се удаљава.
Q-74: Нека је sirina ширина прозора, sl_sirina ширина слике, (x, y) горњи леви угао слике, а dx величина за коју ће се касније мењати x координата слике. Помоћу којих наредби ће слика почети да се појављује улазећи у прозор кроз десну ивицу?
Задатак - ауто који иде лево - десно¶
Покушајте да преправите први програм, тако се ауто креће наизменично на једну па на другу страну, као у примеру (дугме „Покрени пример”). Програм већ садржи наредбе помоћу којих се формира торка од две слике. Слика аута који иде надесно се учитава, док се слика аута окренутог на другу страну добија функцијом pg.transform.flip која од дате слике прави симетричну.