Kretanje crteža

Animacije koje smo do sada videli rade tako što u svakom frejmu prikazuju neku drugu, unapred pripremljenu sliku. Sada ćemo slike koje prikazujemo i pomerati, tako da se ista slika pojavljuje na različitim mestima u prozoru, to jest kreće se.

Pogledajmo odmah primer:

../_images/car.png

Kao i ranije, imamo funkciju nov_frejm koja u svakom frejmu prikazuje neku sliku. Ono što je novo u ovom primeru je da se položaj te slike menja iz frejma u frejm.

Sliku prikazujemo tako da se njen gornji levi ugao pojavi u tački (auto_x, auto_y). Da bi se auto kretao na desno, u svakom frejmu povećavamo x koordinatu slike. Pri tome još samo vodimo računa da kada auto ode suviše desno, da vratimo auto tako da se njegov desni kraj poravna sa levom ivicom prozora. Na taj način auto počinje postepeno da se ponovo pojavljuje sa leve strane.


Na sličan način možemo da pomeramo i crteže koje sami nacrtamo (a ne samo gotove slike). Pri tome sliku ili crtež možemo da pomeramo u bilo kom smeru. Evo jednog takvog primera:

Obratite pažnju na to kako proveravamo da li je bilijarska kugla dotakla neku ivicu ekrana. Krajnja desna tačka kugle ima x koordinatu jednaku \(cx+r\). Ako bi ta vrednost postala jednaka širini prozora, to bi značilo da kugla dodiruje desnu ivicu prozora, a ako je \(cx + r > sirina\), znači da je je kugla bar delom već prošla desnu ivicu prozora. U tom slučaju naredbom \(dx = -dx\) postižemo da se od sledećeg frejma x koordinati kugle dodaje suprotna vrednost u odnosu na dosadašnju, odnosno da se ubuduće kugla pomera za po 3 piksela na levo. To će izgledati kao da se kugla odbila od desne ivice prozora.

Primetimo još jedan detalj: umesto \(cx + r > sirina\) mogli smo da koristimo i \(cx + r >= sirina\) i program bi radio skoro isto. Međutim, pošto se kugla ne pomera za po jedan piksel, ne bi valjalo da smo koristili uslov \(cx + r == sirina\), jer bi tada moglo da se dogodi da kugla preskoči položaj koji proveravamo i prođe kroz ivicu prozora.

Detaljno smo analizirali slučaj desne ivice prozora, a isto razmišljanje je pri pisanju programa primenjeno i na ostale ivice. Ukupni efekat dveju if naredbi je utisak da se kugla odbija od svake ivice prozora.

Proverite da li ste ovo razumeli tako što ćete odgovoriti na sledeća pitanja.

Kretanje crteža - pitanja

    Q-70: Povežite proveru da je kugla iz prethodnog primera prošla određenu ivicu sa odgovarajućom *if* naredbom. Pokušajte ponovo!
  • za levu ivicu
  • if cx - r < 0
  • za desnu ivicu
  • if cx + r > sirina
  • za gornju ivicu
  • if cy - r < 0
  • za donju ivicu
  • if cy + r > visina

    Q-71: Na koju stranu se pomera slika dodavanjem negativne vrednosti na njenu x koordinatu?

  • na desno
  • Pokušajte ponovo
  • na gore
  • Pokušajte ponovo
  • na levo
  • Tačno
  • na dole
  • Pokušajte ponovo

    Q-72: Neka su dimenzije date slike sl_sirina i sl_visina, a njen gornji levi ugao (x, y). Kako proveravamo da li je slika u potpunosti prošla kroz gornju ivicu prozora i više se ne vidi ni jedan njen deo?

  • if x + sl_sirina < 0:
  • Pokušajte ponovo
  • if y + sl_visina < 0:
  • Tačno
  • if x < 0:
  • Pokušajte ponovo
  • if y < 0:
  • Pokušajte ponovo
    Q-73: Neka je sirina širina prozora, sl_sirina širina slike, a (x, y) gornji levi ugao slike. Povežite logičke uslove sa značenjem. Pokušajte ponovo!
  • slika je izašla kroz levu ivicu prozora
  • x + sl_sirina < 0
  • slika je počela da izlazi kroz levu ivicu prozora
  • x < 0
  • slika je izašla kroz desnu ivicu prozora
  • x > sirina
  • slika je počela da izlazi kroz desnu ivicu prozora
  • x + sl_sirina > sirina

    Q-74: Neka je sirina širina prozora, sl_sirina širina slike, (x, y) gornji levi ugao slike, a dx veličina za koju će se kasnije menjati x koordinata slike. Pomoću kojih naredbi će slika početi da se pojavljuje ulazeći u prozor kroz desnu ivicu?

  • x = sirina; dx = -10
  • Tačno
  • x = sirina + sl_sirina; dx = -10
  • Ne, to je predaleko od desne ivice.
  • x = sirina - sl_sirina; dx = -10
  • Ne, tako je cela slika već u prozoru.
  • x = sirina + sl_sirina; dx = 10
  • Ne, slika je predaleko i još će nastaviti da se udaljava.

Zadatak - auto koji ide levo - desno

Pokušajte da prepravite prvi program, tako se auto kreće naizmenično na jednu pa na drugu stranu, kao u primeru (dugme „Pokreni primer”). Program već sadrži naredbe pomoću kojih se formira torka od dve slike. Slika auta koji ide nadesno se učitava, dok se slika auta okrenutog na drugu stranu dobija funkcijom pg.transform.flip koja od date slike pravi simetričnu.