Paranna Morpion-pelin kansainvälisiä ennätyksiä!
Ohjeet | Nettipeli | Tuloslista
Suunnittele tiedosto, josta tulee suuri ZIP-paketti!
Vastauksia: 32
Paras: 1158
Millä tavalla aiemmissa keskusteluissa esitetyn formin sijoittaminen tuohon linkin paikalle tuottaa ongelmia? (Nettisivut ja -ohjelmointi) lisää...
Oppaat: Peliohjelmointi C++:lla: matopeli
Kirjoittaja: Metabolix
Tulostettava versio: tämä opas | koko opassarja
Osa 4 - Liike, törmäykset ja viimeistely
Asetuksia – Liikkuminen – Syöminen – Omenan arpominen – Törmääminen – Viimeistely – Lopputulos
| Peli toimii jo – mitään ei vain tapahdu. Jäljellä on vain muutama pieni asia: liikkuminen, törmäystarkistukset ja omenan arpominen. Nyt peliä voi onneksi testata jokaisen vaiheen jälkeen, jotta näkee, mikä toteutetun funktion lopputulos on. Lopuksi peli täytyy testata ja viimeistellä julkaisukuntoon.
Tässä oppaassa käytetään jonkin verran matematiikkaa, joka ei nykyään kuulu peruskoulun oppimäärään. Laskuissa tarvitaan Pythagoraan lausetta, neliöjuurta ja trigonometrisia funktioita. Jos nämä eivät ole vielä tuttuja tai ovat jo unohtuneet, erinomainen apu löytyy matematiikkaopassarjan 2. osasta, jossa käydään läpi perustiedot kulmista ja kolmioista. Asetuksia Kun tutkitaan madon törmäystä seiniin ja omenoihin, täytyy tietää, kuinka suuria nämä kappaleet ovat. Pyöreän kappaleen tapauksessa koko on selkeintä ilmaista säteen avulla. Liikkeeseen liittyy kaksi asiaa: kääntyminen ja eteneminen. Määritellään kääntymis- ja etenemisnopeudet vakioilla. Nopeus ilmaistaan kahtena arvona: toinen määrää peräkkäisten jaokkeiden välimatkan, toinen kertoo, montako kertaa tämän matkan mato liikkuu sekunnissa.
Liikkumisfunktion alussa muutetaan madon kulkusuuntaa käännösnopeuden mukaan; nopeus kerrotaan vielä aika-askeleen pituudella, jotta kääntymisnopeudesta saadaan käännytty kulma (X rad / s · Y s = XY rad). Samalla tavalla lasketaan myös madon etenemisvaiheen muutos, mutta tähän eivät vaikuta käyttäjän napinpainallukset. Jos etenemisvaihe ylittää ykkösen, siirretään kaikki madon jaokkeet yhtä edemmäs ja lasketaan nenälle uusi sijainti trigonometristen funktioiden avulla. Jotta liikkeestä tulisi tasaista, siirretään vielä lopuksi jaokkeita jäljelle jääneen vaiheen perusteella hieman tulevaa sijaintiaan kohti. Samalla lisätään matoon hieman aaltoilua, jottei eteneminen olisi liian yksitoikkoista.
Syöminen Mato syö etupäällään. Koska madon jaoke on pyöreä ja omena on pyöreä, törmäys on helppo tarkistaa laskemalla ympyröiden keskipisteiden välinen etäisyys ja vertaamalla sitä säteiden summaan. Etäisyys selviää Pythagoraan lauseen avulla. Lisätään ensin apufunktio, joka laskee etäisyyden, ja käytetään sitten tätä tarkistuksessa.
Omenan arpominen Omenan sijoittelu on matematiikkaa: arvotaan std::rand-funktiolla kaksi lukua ja skaalataan ne oikealle lukuvälille, jotta omena on mukavasti pelialueella. Äskeisessä vaiheessa ilmestyneestä bugista voi kuitenkin ottaa hieman opikseen: lisätään arvontaan pieni tarkistus, ettei omena ilmestyisi madon pään kohdalle. Jos näin uhkaa käydä, siirretään omenaa hieman kohti pelialueen vasenta yläkulmaa tai oikeaa alakulmaa sen mukaan, kumpi on kauempana.
Mato voi törmätä seinään tai itseensä. Riittää, että tarkistetaan nenän törmääminen, koska sehän on madon liikkuva osa. Seinän suhteen tarkistetaan yksinkertaisesti x- ja y-koordinaattien pysyminen rajoissa. Madon itsensä suhteen asia on hieman mutkikkaampi: itse tarkistus onnistuu kyllä samalla tavalla kuin omenan kanssa, mutta mitkä jaokkeet pitää tarkistaa? Nenästä seuraava jaoke voi olla liian lähellä nenää ja aiheuttaa valetörmäyksen, ja jos asetuksia (madon etenemistä) säädettäisiin, seuraavakin jaoke voisi tulla liian lähelle. Onneksi ongelmaan on melko yksinkertainen ratkaisu: käydään jaokkeita läpi nenästä lähtien, kunnes löytyy jaoke, joka on tarpeeksi kaukana, ja tarkistetaan törmäys vasta tästä häntään päin olevista jaokkeista.
Peli toimii jo hienosti. Nyt on viime hetki testata tarkkaan, onko siinä bugeja. Pitää siis kokeilla törmäämistä jokaiseen seinään ja omaan häntään, pitää kierrellä omenoita, pitää painella nappeja valikossa ja pelin jälkeen ja tarkistaa, että kaikki toimii järkevästi. Samalla voi säätää vielä madon etenemis- ja kääntymisnopeutta ja muita pelin asetuksia. Lisäksi täytyy piirtää lopulliset versiot kuvista. Ohjelmasta voi halutessaan myös poistaa ylimääräiset tulostukset; nythän se ilmoittelee std::clog-virtaan valikon piirrosta, pelin tuloksesta ja muista kohdista. Tulosteita on kuitenkin sen verran vähän, etteivät ne haittaa, ja moni käyttäjä ei edes käynnistä ohjelmaa komentoriviltä eikä siis näe ylimääräisiä tekstejä. Lopputulos (Lataa koodipaketti!) Viimeistelty peli voisi näyttää tältä:
Pelistä on tarjolla valmis, kokonainen Windows-versio. Kokonainen peli C++:lla on nyt valmis! Jos tuntuu, että jokin ominaisuus vielä puuttuu tai voisi toimia toisin, on oikein hyvää harjoitusta kehittää peliä eteenpäin. Mahdollisia parannuksia ovat mm. ennätyksen tallentaminen tiedostoon ja taustamusiikin ja ääniefektien soittaminen. Linkkejä paranneltuihin versioihin voi jättää vaikka tämän oppaan kommentteihin. Huomio: Jos levität pelin muokattua versiota, mainitse, mitkä osat ovat alkuperäisiä ja mitkä omiasi, ja anna lisäksi suora linkki tähän opassarjaan. Lauri Kenttä, 7.11.2009 Grafiikanteossa mukana Laura Leinonen |
ylläpito Antti Laaksonen, ulkoasu Otto Seiskari