Ohjattava ympyrä
Viime kappaleen tehtävässä teimme yksinkertaisen tavan liikuttaa ympyrää. Liikkuminen tulee kuitenkin raskaaksi jos joutuu yhä uudelleen painamaan haluamaansa suuntaa. Olisi siis helpompaa, jos liikkuminen tapahtuisi pohjaan painamalla. Sen toteutusta varten meidän pitää ohjelmoida seuraavat:
- Ikkunatapahtumassa
on_key_press
tallennetaan muistiin mihin suuntaan olemme menossa. - Ikkunatapahtumassa
on_key_release
tallennamme, onko johonkin suuntaan liikkuminen loppunut. - Funktio joka tarkistaa mihin suuntaan ollaan menossa ja sen perusteella muuttaa hahmon sijaintia.
- Aikataulutetaan funktio tapahtumaan koko ajan.
Liikkumissuunnan tallennus
Haluamme tallentaa johonkin mitä nappia on painettu, eli mihin suuntaan olemme matkalla. Tehdään tätä varten dict eli sanakirja. Sanakirjat muistuttavat osin listoja ja osin muuttujia. Ne koostuvat ns. avaimista ja niiden arvoista. Listassa alkioihin eli arvoihin, jotka lista sisältää, viitataan niiden järjestysluvulla, kuten lista[0]
. Sanakirjalle voimme tehdä saman eli sanakirja[0]
. Tässä kuitenkaan 0 ei merkitse ensimmäistä (tai etäisyyttä ensimmäisestä) vaan avainta, jolle on jokin arvo. Sanakirjalla ei siis ole järjestystä ja sen takia avain voikin olla muitakin kuin lukuja, kuten merkkijonoja tai totuusarvoja.
Siinä oli sanakirjoista tiiviisti, mutta on syytä vielä käydä se miten määritämme pythonissa sanakirjan. Se tapahtuu seuraavasti:
sanakirja = {avain: arvo, ...}
eli jos vaikka haluamme tallettaa pystyliikkumissuunnat voimme sanoa:
suunta = {'ylös':False, 'alas':False}
Tehtävä
Lisää suunta -sanakirja tallettamaan pohjassa painetut suunnat. Lisää siis pysty- ja vaakasuunnille avainmerkkijono ja totuusarvo.
Napinpainallusten käsittely
Ohjelmoidaan ensin ylöspäin liikkuminen kokonaan. Haluamme siis että jos painetaan nuoliylösnäppäintä, liikkumissuunnasta ylös tulee tosi. Kyseessä on tuttu ehtolause:
@ikkuna.event
def on_key_press(merkki, muuntaja):
if merkki == pyglet.window.key.UP:
suunta['ylös'] = True
pyglet.window.key.UP
tarkoittaa nuoli ylös -näppäintä. UP on englantia ja tarkoittaa ylös.suunta['ylös'] = True
muuttaa suunnan ylös arvoksi True, eli totta.
Tehtävä
Ohjelmoi, että, kun lopetamme ylöspäinnapin painamisen, suuntamme ei ole enää ylöspäin. Sen saa tutulla ikkunatapahtumalla on_key_release
ja epätosi arvolla False.
Liikkumisfunktio ja sen kellotus
Kirjoitetaa seuraavaksi funktio, joka muuttaa ympyrän sijaintia jos suunta on ylös.
Aloitetaan funktio määrittelemällä ja antamalla sille nimi. Se tarvitsee yhden arvon sulkuihin, nimittäin dt, koska se on aikataulutettava funktio. Funktio katsoo jos suunta['ylös']
, ja silloin lisää ympyrän y-koordinaattiin 10.
def liiku(dt):
if suunta['ylös']:
ympyrä.y = ympyrä.y + 10
Tehtävä
-
Lisää funktion aikataulutus. Sopivaksi kellotusväliksi voi valita halumansa ajan, kuten 0,1. Tässä vaiheessa ohjelmassa pitäisi pystyä liikuttamaan ympyrää ylöspäin painamalla pohjaan nuoliylösnäppäintä.
-
Lisää loput liikkumissuunnat.
Mitä tehdä seuraavaksi?
- Kokeillaan miten voimme vaikuttaa nopeuteen:
-
Muokkaa koodia niin, että koordinaatteja ei muutetakaan kymmenellä vaan kahdellakymmenellä. Mitä liikkumiselle tapahtuu?
-
Muokkaa koodia niin, että koordinaatteja ei muutetakaan kahdellakymmenellä vaan viidellä. Mitä liikkumiselle tapahtuu?
-
-
Entä liikkuminen WASD-näppäimistä?
Videopeleistä toinen mahdollinen ohjaustapa on ns. WASD, jossa ylöspäin liikutaan W-näppäimestä ja loput suunnat voikin jo päätellä näppäimistön asettelusta. Muokkaa koodia niin, että ympyrä ei liikukaan nuolinäppäimistä vaan WASD-näppäimistä.
-
Haastavampi tehtävä Lisää ohjelmaasi toinen ympyrä, niin että toista voi liikuttaa nuolinäppäimistä ja toista WASD-näppäimistä
-
Lisää ympyrä ja tallenna se muuttujaan ympyrä2.
-
Tee muuttuja suunta2, johon tallennetaan ympyrä2:n suunta.
-
Ohjelmoi ympyrä2 liikkumaan eri näppäimistä kuin ensimmäinen ympyrä.
-