Očitavanje pozicije miša

U PajGejmu postoji jednostavan način da saznamo, to jest očitamo trenutno stanje miša. Podaci koji nas često najviše interesuju su pozicija miša i pritisnuti tasteri. U ovoj lekciji ćemo koristiiti očitavnje pozicije miša, a u sledećoj tastere miša. Osim pozicije i pritisnutih tastera, postoje i druge informacije o mišu koje možemo da dobijemo, ali to ovde nećemo raditi. Zainteresovani mogu da nađu više detalja na primer ovde .

Poziciju miša možemo dobiti pozivom funkcije pg.mouse.get_pos(), koja vraća uređeni par koordinata tačke na kojoj se trenutno nalazi pokazivač miša.

Kao što ćemo videti u primerima i zadacima koji slede, upotreba ove funkcije je vrlo jednostavna, a očitanu poziciju miša možemo dalje da koristimo na različite načine.

Primeri i zadaci

Primer - leptir prati miša:

U ovom primeru učitavamo dve slike leptira i prikazujemo ih naizmenično, kao što smo to radili u animacijama. Novo je to da se mesto na kome prikazujemo leptira određuje na osnovu pozicije miša, koju smo dobili pomoću funkcije pg.mouse.get_pos().

../_images/butterfly1.png ../_images/butterfly2.png

Verovatno ste primetili da kada brže pomerate miša, leptir malo kasni za njim. Ovo se dešava zato što se prikazuje samo 5 frejmova u sekundi, pa kašnjenje može bude i do 0.2 sekunde.

Ovo kašnjenje se lako eliminiše tako što povećamo učestalost prikazivanja (prikazujemo veći broj frejmova u sekundi), međutim tada se slike smenjuju previše često i dejuje da leptir suviše brzo maše krilima. Rešenje je da povećamo učestalost prikazivanja, a da svaku sliku prikazujemo tokom više frejmova.

Zadatak - brzo kretanje, sporo mahanje: Iskopirajte ovde prethodni program, a zatim ga izmenite tako da leptir ne kasni za mišem, ali da brzina mahanja krilima ostane ista.

Pomoć: da leptir ne bi kasnio, svakako nam treba više frejmova u sekundi, na primer n puta više. To znači da se funkcija nov_frejm poziva n puta češće nego ranije. Da bi se pri tome zadržala ista brzina mahanja krilima, potrebno je da se svaka slika prikazuje n puta duže, to jest tokom n uzastopnih frejmova.

Zadatak - prema mišu: Napišite program u kome se zelena loptica kreće ka mišu, kao u primeru (dugme „Prikaži primer”).

Pomoć: U ovom zadatku je ključno kako se menjaju koordinate \((x, y)\) centra loptice. U situaciji kao na slici, želimo da x povećamo za dx, a y da povećamo za dy. U zavisnosti od toga kako želimo da se loptica kreće, veličine dx, dy mogu da se izračunaju na razne načine. Jedan jednostavan način je da izaberemo \(dx = {1 \over 10} (xm - x), dy = {1 \over 10} (ym - y)\).

../_images/towards_mouse.png

Zadatak - prema mišu sa tragom: Iskopirajte prethodni program, a zatim ga prepravite tako da loptica ostavlja sivi trag, kao u primeru (dugme „Prikaži primer”).

Pomoć: Kretanje loptice je isto kao u prethodnom primeru. Da bismo napravili trag, potrebno je pamtiti listu nekoliko (mi smo koristili 20) prethodnih položaja loptice.

Pri izračunavanju novog stanja, na listu dodajemo najnoviji položaj, a ako je lista postala preduga, izbacujemo najstariji položaj.

Pri crtanju traga, za svaki krug koristimo boju (nijansa, nijansa, nijansa), gde je nijansa pre petlje jednaka 255 (bela), a u petlji se smanjuje za određenu vrednost, tako da u poslednjem prolazu kroz petlju postane nula, ili što bliže nuli (crna).

Dakle, ako se lista na primer zove trag, u vašem programu treba da se pojave ovakve ili slične naredbe:

trag = []
...

def nov_frejm():

    ...
    trag.append((x, y))
    ...
    if ...
        trag = trag[1:]

Na kraju, možete da isprobate sledeća dva programa i da se poigrate sa njima.

Da bi se napravili ovakvi programi, pored ovde prikazanih tehnika programiranja potrebno je i malo znanja fizike (elastična sila, drugi Njutnov zakon) i matematike (Pitagorina teorema). Pogledajte programe, bez obaveze da ih potpuno razumete. Ako želite, probajte da malo izmenite neke konstante, pa vidite kako to utiče na rad programa.

Primer: Jo-jo

Primer: Oči

Ovaj program takođe zahteva malo više znanja matematike, pa se nećemo upuštati u detalje. Ako vas interesuje kako ovaj program radi, a matematika vam dobro ide, pokušajte da razumete detalje uz nečiju pomoć.