Mielensä pahoittaneet sorsat¶
Sorsat ovat pahoittaneet mielensä, mutta kenelle, ja miksi? Tarina ei kerro kumpaakaan, mutta vaihtoehtoja on vain yksi: sorsien on pommitettava vihollisensa pois maan kamaralta. Parhaiten tämä onnistuu ottamalla ritsasta lisävauhtia ja törmäämällä suoraan kohteeseen. Kuinkas muutenkaan? Tässä työssä pääset toteuttamaan kotimaisittain hiukan tutulta kuulostavasta pelikonseptista oman versiosi. Sopivasti yksinkertaistettuna, sillä ovathan sorsatkin vain vähän mielensä pahoittaneet, eivätkä ollenkaan vihaisia...
Huom: Tämä lopputyöaihe on aivan uusi, joten sen vaikeusastetta ei ole vielä välttämättä säädetty loppuun asti kuntoon. Jos tunnet olosi hieman epävarmaksi, muut lopputyöaiheet ovat turvallisempia valintoja. Kyseessä on myös eniten matikkaa sisältävä lopputyöaihe.
Pelin aloitus¶
Peli-ikkunasta löytyy sorsien laukaisupaikka sekä tuhottavat kohteet. Näiden ohella on esteitä, joista sorsat eivät saa lentää läpi. Lisäksi pelaajalle olisi syytä ilmoittaa jäljellä olevien sorsien määrä sekä hänen edistymisensä pelissä.
Kenttä voidaan ladataan tiedostosta, jossa on määritelty esteiden ja kohteiden paikat, sekä käytettävien sorsien lukumäärä. Kenttätiedostossa on myös määritetty seuraavan kentän sisältävän tiedoston nimi. Toisena pelimoodina on satunnaiset kentät, jotka generoidaan aina pelin alkaessa. Arvotun kentän kanssa kannattaa käyttää nelosharjoituksen laatikonpudottelualgoritmia - tämä helpottaa arvontaa kun esteet ja kohteet voidaan arpoa mihin tahansa.
Pelin kulku¶
Pelaaja laukaisee sorsia yksi kerrallaan hiiren avulla, yrittäen osua kohteisiin ja täten tuhota ne kentältä. Taso läpäistään, jos pelaaja tuhoaa kaikki kohteet ennen kuin häneltä loppuu sorsat kesken. Kohteet tuhoutuvat kun sorsa osuu niihin. Jos sorsa osuu esteeseen se joko pysähtyy, tai kimpoaa pois (saat itse valita, jälkimmäinen on haastavampi toteuttaa). Maahan osuessaan sorsa myös pysähtyy. Kun sorsa pysähtyy, pelaaja voi laukaista uuden mikäli sorsia on vielä jäljellä.
Pelin päättyminen¶
Yksittäinen kenttä voi päättyä kahdella tavalla:
- Pelaaja voittaa tuhottuaan kaikki kohteet kentältä.
- Pelaaja häviää, jos hän on käyttänyt kaikki sorsat ja kentällä on edelleen jäljellä kohteita.
Pelissä tulee olla toteutettuna vähintään kaksi eri kenttää sekä kenttien satunnainen generointi. Kaikki kentät läpäistyään pelaaja voittaa pelin.
- Läpäistyään kentän, tulee pelaajan päästää siirtymään seuraavaan kenttään.
- Jos pelaaja häviää kentän, nollataan kyseinen kenttä ja pelaaja yrittää sitä uudestaan.
- Satunnaisuus laitetaan päälle joko komentoriviparametrilla tai valikosta, tällöin peli jatkuu arpoen uusia kenttiä kunnes pelaaja häviää kentän.
Toimiva toteutus¶
Toimivan toteutuksen tulee osoittaa kurssin asioiden hallintaa. Seuraavasta listasta voit tarkistaa mitä työltä vaaditaan, jotta se hyväksytään:
- Peli toteuttaa yllä kuvatut pelin vaatimukset.
- Pelissä on painovoima, joka estää sorsia lentämästä ikuisesti.
- Pelitilanne esitetään pelaajalle ymmärrettävässä muodossa graafisesti.
- Pelaaja pystyy laukaisemaan sorsat ainoastaan laukaisupaikalta. Kertaalleen laukaistua sorsaa ei siis saa laukaista uudelleen kesken lennon tai pysähdyttyään.
- Uusi sorsa pitää pystyä lisäämään laukaistavaksi joko automaattisesti tai klikkaamalla/näppäimellä.
- Kenttä vaihtuu seuraavaan voittoehdosta ja peli päättyy kun viimeinen kenttä on läpäisty.
- Pelissä on valikko tai komentoriviargumentit joilla voidaan valita käsintehtyjen kenttien ja satunnaiskenttien välillä.
Grafiikka¶
Peligrafiikkaa varten olemme toteuttaneet pienen kirjaston, jonka avulla grafiikan piirto peli-ikkunaan onnistuu jotakuinkin samoilla keinoilla kuin muutkin asiat kurssilla tähän asti - kutsumalla siis funktiota. Kirjastoa ei ole pakko käyttää, mutta pelissä on oltava vastaava graafinen käyttöliittymä jollain tavalla toteutettuna. Kirjastomoduulissa on varsin kattavat dokumentaatiomerkkijonot, jotka kertovat sen käytöstä. Lisää ohjeistusta on koottu alle.
Historiallisista syistä pelikirjaston nimi on haravasto. Se on nimittäin tehty alunperin miinaharavaa varten. Olemme kuitenkin lisänneet siihen myös sorsien nakkelua tukevat ominaisuudet.
Koska emme halunneet mustamaalata mitään tiettyä eläintä viholliseksi, kohteet merkataan neliöillä joissa on x. Halutessasi voit piirrellä tilalle oman kohdegrafiikan.
Käyttöönotto¶
Lataa kirjasto ja grafiikkana käytettävät kuvat yllä olevista linkeistä. Kuvat laitetaan oletuksena spritet-nimiseen kansioon projektikansiosi sisälle - kyseessä on siis pakattu kansio, älä pura sitä erikseen spritet-kansioon koska silloin saat spritet/spritet hakemistoksi. Kopioi myös sorsagrafiikat samaan kansioon. Sinun tulee myös asentaa Pyglet-kirjasto, koska pikkuinen kirjastomme on sen päälle toteutettu. Pyglet on muutenkin ihan näppärä kirjasto, jos haluaa tehdä Pythonilla 2D-pelejä.
Pelikirjastojen 101¶
Siinä missä tähän asti ohjelman käyttöliittymäsilmukka on koodattu kokonaan itse (yleensä
while True
:lla), pelikirjastoissa on tyypillisesti konepellin alle piilotettuna huomattavasti monimutkaisempi pääsilmukka. Se on piilotettu, jotta sillä ei tarvitse vaivata päätään. Kirjastoa käytettäessä määritellään tyypillisesti käsittelijäfunktioita, joita pääsilmukka kutsuu, kun funktioon liitetty asia tapahtuu. Esimerkiksi hiiren klikkaukseen voidaan kytkeä käsittelijäfunktio. Jos näin tehdään, tuota funktiota kutsutaan aina, kun käyttäjä painaa hiiren nappia. Toinen hyvin yleinen käsittelijä on grafiikan piirtofunktio, jota kutsutaan aina, kun ruudulla oleva näkymä pitää päivittää.Pelikoodissasi et siis määrittele omaa pääsilmukkaa, vaan toteutat tarvittavat käsittelijäfunktiot. Käsittelijäfunktiot tulee erikseen kytkeä tapahtumiin. Tämä onnistuu kirjastossa olevilla funktioilla (muotoa aseta_joku_kasittelija). Näiden funktioiden dokumenttimerkkijonoista ilmenee millainen käsittelijäfunktio niihin tulee liittää. Työjärjestys grafiikan piirtämisessä annetulla kirjastolla on kaiken kaikkiaan seuraavanlainen:
- lataa peligrafiikat
- luo peli-ikkuna
- määrittele ja rekisteröi käsittelijäfunktiot
- käynnistä peli
Tästä eteenpäin peli pyörii käsittelijäfunktioiden varassa. Grafiikan piirtämisestä löydät hyvin yksinkertaisen esimerkin kirjastomoduulin lopusta. Siellä on koodinpätkä, joka piirtää kaikki ruutugrafiikat satunnaisessa järjestyksessä ikkunaan yhdelle riville.
Koodin suunnittelussa on syytä huomoida, että koska käsittelijäfunktioita kutsuu ns. konepellin alla pyörivä pääsilmukka, et pysty vaikuttamaan siihen mitä argumentteja niille annetaan. Erityisesti pelin tila (kuten kenttä) täytyy hankkia käsittelijöiden tietoon jotain muuta kautta. Suositeltava lähestymistapa on tehdä tilaa varten sanakirja pääohjelmassa. Pääohjelmassa määriteltyä sanakirjaa voidaan muuntuvan luonteensa ansiosta lukea sekä muokata kaikissa funktioissa.
Palautus¶
Palautustakaraja: 2024-12-02 23:59