Tähän mennessä ohjelmamme tekee asioita vain silloin, kun pelaaja painaa nappia. Peleissä kuitenkin tapahtuu usein asioita myös pelaajan tekemättä mitään, esimerkiksi pelaajaa saattaa jahdata vihollinen tai pelikentälle ilmestyy vähän väliä keräiltäviä aarteita.
Kun jokin tapahtuu omia aikojaan, tarvitsee ohjelman tietää milloin se tapahtuu. Tätä varten pygletistä löytyy clock
, eli kello. Kellon kaikki komennot alkavat pyglet.clock
.
Kelloa voi käyttää yleisesti ottaen kolmella tavalla:
- Kellolla voi aikatauluttaa, että jotain tehdään koko ajan.
- Kellolla voi aikatauluttaa, että jotain tehdään tietyn ajan välein, esimerkiksi kerran sekunnissa.
- Kellolla voi aikatauluttaa, että jotain tehdään vain kerran tietyn ajan kuluttua, esimerkiksi kolmen sekunnin päästä.
Näitä kellon käyttötapoja vastaavat komennot ovat:
pyglet.clock.schedule()
, mikä on englantia ja tarkoittaa pyglet.kello.aikatauluta()pyglet.clock.schedule_interval()
, mikä on suomeksi pyglet.kello.aikatauluta_aikaväli()pyglet.clock.schedule_once()
, mikä on suomeksi pyglet.kello.aikatauluta_kerran()
Komennon lopussa oleviin sulkuihin merkitään mitä aikataulutetaan. Puhutaankin siis seuraavaksi vielä nopeasti mitä nämä aikataulutettavat asiat ovat.
Funktiot saattavat olla matematiikan tunnilta tuttuja, mutta ohjelmoinnista funktiot ovat hieman erilaisia. Yksinkertaisesti sanottuna funktio on aliohjelma, eli pieni ohjelma, jota voi käyttää jonkin muun isomman ohjelman sisällä. Olemme tähän mennessä itse asiassa jo käyttäneet funktioita: ikkunatapahtumat nimittäin määritellään funktioilla! Pääohjelmalle on itse peli, ja se mitä näppäintä painaessa tehdään on oma pienempi ohjelmansa, jota pelimme käyttää.
Funktion kirjoittaminen aloitetaa sanalla def
. Se on lyhenne englannin sanasta define eli määrittele. Sen jälkeen tulee funktion nimi ja sitten sulkuihin mitä arvoja funktiossa halutaan voida käyttää.
Kaksoispisteen jälkeen kirjoitetaan mitä funktio tekee. Kaiken funktion koodin tulee olla sisennettyä eli:
def funktio():
funktion sisältö tulee kirjoittaa näin
myös uudessa rivissä on sisennys
Tämä on oikein 🠕
Tämä on väärin 🠗
def funktio():
funktion sisältöä ei voi kirjoittaa näin
Funktiot ovat ohjelmoinnin monikäyttöisimpiä työkaluja ja niitä voi hyödyntää paljon muussakin kuin ikkunatapahtumissa ja aikatauluttamisessa. Emme kuitenkaan tutustu funktioiden muihin käyttötarkoituksiin nyt.
Nyt voimme jatkaa viimekerran ohjelmaa. Ohjelmoidaan niin, että pallo vaihtaa yhden sekunnin välein väriään seuraavan kuvan mukaisesti, eli punaisesta vihreäksi, vihreästä siniseksi ja sinisestä takaisin punaiseksi.
Aloitetaan määrittelemällä funktio, joka muuttaa pallon väriä. Annetaan funktion nimeksi vaikkapa diskopallo. Aikataulutettavat funktiot tarvitsevat arvokseen ajan jolloin funktiota on viimeksi kutsuttu (käytetty). Tätä arvoa kutsutaan delta-ajaksi ja sitä usein merkitään dt.
Aloitetaan siis funktion kirjoittaminen näin: def diskopallo(dt):
Seuraavaksi mietitään mitä funktion pitää tehdä. Jos pallon väri on punainen, pitää väriksi vaihtaa vihreä. Toisaalta jos väri on vihreä, pitää väristä tulla sininen tai jos väri on sininen, tulee väriksi vaihtua taas punainen.
Lisäksi ohjelmassamme ympyrä voi olla myös valkoinen. Ohjelmoidaan siis, että jos väri on jotain muuta kuin kaavakuvassa, väriksi vaihdetaan aina punainen.
Kokonaisuudessaan funktio näyttää tältä ja se pitää lisätä loppuun ennen koodia pyglet.app.run()
:
def diskopallo(dt):
if ympyrä.color == [255, 0, 0]:
ympyrä.color = 0, 255, 0
elif ympyrä.color == [0, 255, 0]:
ympyrä.color = 0, 0, 255
elif ympyrä.color == [0, 0, 255]:
ympyrä.color = 255, 0, 0
else:
ympyrä.color = 0, 255, 0
Huom! Ehtolauseet menevät värien pilkuista sekaisin, joten värit on laitettu sulkuihin ehtolauseissa.
Nyt kun meillä on funktio mitä aikatauluttaa, aikataulutetaan se!
Koska haluamme, että funktio tapahtuu kerran sekunnissa, käytämme komentoa pyglet.clock.schedule_interval()
. Merkitään sulkuihin aikataulutettavan funktion nimi, pilkku ja pilkun jälkeen kuinka monen sekunnin välein haluamme, että funktio tehdään. Koko komento on siis:
pyglet.clock.schedule_interval(diskopallo, 1)
Lisätään komento ohjelmaamme funktion jälkeen, mutta ennen koodia pyglet.app.run()
.
Nyt meillä on diskopallo!
import pyglet
ikkuna = pyglet.window.Window(width = 800, height = 600)
ympyrä = pyglet.shapes.Circle(x = 400, y = 300, radius = 100)
@ikkuna.event
def on_draw():
ikkuna.clear()
ympyrä.draw()
@ikkuna.event
def on_key_press(merkki, muuntaja):
if merkki == pyglet.window.key.P:
ympyrä.color = 255, 0, 0
else:
ympyrä.color = 0, 0, 255
@ikkuna.event
def on_key_release(merkki, muuntaja):
ympyrä.color = 255, 255, 255
def diskopallo(dt):
if ympyrä.color == [255, 0, 0]:
ympyrä.color = 0, 255, 0
elif ympyrä.color == [0, 255, 0]:
ympyrä.color = 0, 0, 255
elif ympyrä.color == [0, 0, 255]:
ympyrä.color = 255, 0, 0
else:
ympyrä.color = 255, 0, 0
pyglet.clock.schedule_interval(diskopallo, 1)
pyglet.app.run()