Studio 1 –loppuraportti: Ping
Kuvaus
Ping on eräänlainen PONG-klooni, jossa pelaajalla on yksi kentän neljästä reunasta puolustettavanaan. Pelaajan tulee siis estää parhaansa mukaan palloa pääsemästä kosketukseen oman reunansa kanssa liikkumalla pallon ja reunan väliin. Pelissä voi olla yhdestä neljään ihmispelaajaa, jotka kaikki pelaavat samalla koneella. Pallon ja pelaajan "mailan" tai pelaajattoman reunan välille syntyy realistisen kaltainen törmäys. Pelaaja saa pisteitä palloon osumisesta ja menettää niitä pallon joutumisesta omaan maaliin. Pallon nopeus voi kasvaa, mikäli siihen osutaan "hypättäessä".
Pelissä on kolme erilaista pelimuotoa, Single Event, Time Battle ja Last Man Standing. Single Event on näistä yksinkertaisin, siinä pelataan yksi pallo, eli siis pallo on kentällä niin pitkään, kunnes joku pelaajista sen mokaa taakseen. Tällöin pelaajien keskinäinen paremmuus ratkaistaan heidän keräämillään pisteillä (siis pallon mokannutkin pelaaja voi voittaa, tosin se on hyvin epätodennäköistä.) Time Battlessa pelataan tietty aika, jona palloja ilmestyy kentälle aina uusi vanhan jouduttua reunaan ja ajan loputtua paremmuus katsotaan pelaajien saamien pisteiden perusteella. Ylimääräisenä jännityksenä pelattua aikaa ei ilmoiteta missään, vaan pelaajien tulee arvioida se.
Pelimuodoista ehkä mielenkiintoisin, Last Man Standing, toimii siten, että aluksi pelaajille annetaan tietty määrä pisteitä, joita he menettävät mokatessaan pallon omaan maaliin. Viimeisenä pisteitä omaava pelaaja voittaa pelin, toiseksi tulee toiseksi kauiten pelissä sinnitellyt jne.
Käyttöliittymä
Aloitusnäkymä
Käynnistettäessä Ping asettaa näkyviin aloitusnäkymän, josta voi säätää pelin, kentän ja pelaajien ominaisuuksia. Pelaajat on järjestelty reunojen mukaisesti, kuvassa siis pelaaja 3 on yläreunassa, pelaaja 1 vasemmalla jne. Kentän ja pelimuodon asetukset ovat alimpana. Pelaajien kohdalla olevat valintalaatikot disabloivat ko. pelaajan pelistä. Numeroboksista määritellään pelaajan mailan säde, värilaatikosta väri. Nimilaatikosta määritellään pelaajan nimi. Valittaessa pelimuotoa Combo-laatikosta Last Man Standing –muoto valittaessa ilmestyy sen viereen alkupisteet-laatikko, samoin Time Battlessa peliaika. Single Eventissä ei tällaista ”pelimuotokohtaista” asetusta ole, vaan laatikko katoaa. Ok aloittaa uuden pelin, Cancel palaa vanhaan peliin. Aloitusnäkymä käyttää edellisen pelin arvoja seuraavan pelin oletusarvoina.
Pelinäkymä
Pelinäkymässä valitut pelaajat ja pallo ovat kentällä. Pelaajien näppäinasetukset ovat:
- Vasen reuna: W(ylös), S(alas), D(hyppy)
- Oikea reuna: nuoli ylös(ylös), nuoli alas(alas), nuoli vasemmalle(hyppy)
- Yläreuna: O(vasemmalle),P(oikealle),0(hyppy)
- Alareuna: Y(vasemmalle),U(oikealle),7(hyppy)
Ikkunan pienentäminen ja deaktivointi sekä valikon avaus pausettavat pelin.
Valikko
Ping-ohjelma sisältää vain yhden valikon, nimeltään Tiedosto. Valikosta löytyy toiminnot Uusi Peli, Ohjeet, Pojot ja Lopeta. Uusi peli vie pelin uudestaan aloitusnäkymään, ohjeet tuo esille peliohjeen, pojot tekijät ja Lopeta lopettaa pelin.
Ohjenäkymä
Ohjenäkymässä on lyhy peliohje. Enterillä pääsee takaisin peliin ja F2:lla aloitusnäkymään.
Tekninen toteutus
Ohjelma koostuu mallistaosasta, näkymäosasta ja ohjainosasta. Malliosaan kuuluvat Maila, Pallo ja Kentta, näkymään Ikkuna ja paneelit. Pääluokka Ping ja Yleiskuuntelija vastaavat ohjainosasta.
Toteutusympäristö
Ohjelman tekemiseen on käytetty freeBSD- ja Windows XP –käyttöjärjestelmiä, joihin on asennettu Java 5.0. Sovelluskehittimenä toimi kummassakin järjestelmässä Eclipse.
UML-kaavio
Ohessa hieman kuvankäsittelyohjelmalla muokattu uml-kaavio. Linkki
Merkittävimpiä tietorakenteita ja algoritmeja
Käytin pallojen törmäysalgoritmin pohjana Petri Klemelän tekemää pallot-appletin törmäysalgoritmia, jota lähdin laajentamaan ottamalla mukaan myös massat ja kimmoisuudet sekä sen, että toinen osapuoli törmäyksessä saattaa olla maila, jonka ei tulisi törmäyksessä liikkua.
Pallon ja seinän törmäysalgoritmi on yksinkertaisempi, siinä törmäys jaotellaan kahteen erikoistapaukseen (vaakaseinä ja pystyseinä) ja muutetaan pallon x- tai y-koordinaatti vastaluvukseen.
Kentässä on kolme listaa, törmäävät, jossa on kaikki törmäävät oliot (mailat ja pallot), mailat, jossa on mailat ja pallot, jossa on pallot. Mallipuoli tukee useampiakin palloja, mutta pelimuotoihin niitä ei ole implementoitu eikä siis pelissä ole mahdollista ilman muutoksia niitä saada esiin.
Luokkien kuvaukset
- Ping - ohjelman pääluokka, joka hoitaa pelin yleisiä asioita ja kontrolloi mallin ja näkymän yhteistyötä.
- Kentta - kuvaa kenttän mallia, sisältää tiedot kentän ominaisuuksista sekä palloista, mailoista yms.
- Pallo - kuvaa pallon mallia, sisältää tiedot omasta tilastaan
- Maila - kuvaa mailan mallia, sisältää tiedot omasta tilastaan, pelaajan nimestä ja sijainnista yms
- Perusmaila - abstraktin luokan maila (toistaiseksi) ainoa ilmentymä, korvaa luontimetodit
- Ajastin - hoitaa pelin päivityksen ajoittain
- DoublePoint - muuten kuin java.awt.Point, mutta säilöö arvot liukulukuina. Näkyvät muuttujat ja metodit suunnilleen samat
- Fysiikat - pari staattista metodia ja attribuuttia, jotka laskevat törmäyksiä yms
- Tormaava - rajapinta, kaikki oliot, jotka voivat törmätä toisiinsa
- Yleiskuuntelija - hoitaa näppäimistön kuuntelun
- Pelimuoto - enumeraatio, jonka mahdollisia arvoja ovat single_event, time_battle ja last_man_standing. Kuvaa pelimuotoja
- Ikkuna - pelin graafisen puolen alin luokka, perii JFramen
- Pelipaneeli - paneeli, johon kentän tapahtumat piirretään
- Anakuma - aloitusnäkymäpaneeli, overrideaa paintComponent-metodin
Kokemuksia projektista
Yleisesti projektin tekeminen sujui hyvin. Olen erittäin tyytyväinen ratkaisuuni tehdä ensin malli lähes valmiiksi koskemattakaan graafiseen puoleen. Näin otin malli-näkymä-luokituksen käyttööni lähes huomaamatta. Toisaalta jouduin refaktoroimaan koodiani jonkin verran esimerkiksi siirtyessäni kokonaisluvulla ilmoitetuista sijainneista liukulukusijainteihin, koska kokonaislukusijainnella pienet nopeudet aiheuttivat hankaluuksia. Juuri refaktoroinnin minimoimiseksi otin käyttööni DoublePoint-luokan enkä AWT:n Point2D-luokkaa.
Koska en ehtinytkään toteuttaa useammantyyppisiä mailoja, abstraktin Maila-luokan ja sen perivän Perusmaila-luokan tekeminen saattaa tuntua hieman oudolta ratkaisulta. Toisaalta jos tulevaisuudessa täydennän peliäni, voi ratkaisu muuttua hyvinkin tyylikkääksi.
Suurimpia bugeja koin todennäköisesti yrittäessäni tehdä turhan hienoa törmäysmallinnusta. Debuggasin laskeTörmäys-metodia lähemmäs kymmenen tuntia, koska pallot tuntuivat takertuvan mailoihin. Lopulta sain yksinkertaistettua mallinnusta siten, ettei kyseistä ilmiötä enää tapahtunut.
Pääsin aloittamaan projektin kunnolla vasta joulun tienoilla, mikä pelotti hieman alkutaipaleella, varsinkin edellämainittua törmäysbugia korjatessa. Sain kuitenkin loppua kohden itse pelin hyväööe mallille, vaikken kaikkia ominaisuuksia saanutkaan toteutettua. Lisäksi minulta meni muutama päivä "hukkaan"” dok umentaatiota ja portfoliota tehdessä, koska lähdin armeijan harmaisiin 8.1, Studio 1:n demopäivänä.
Ajankäytöstä en osaa arviota tehdä, mutta koska joulun jälkeen vietetyn vapaa-ajan (siis aika, joka ei kulunut koodaukseen, nukkumiseen, syömiseen yms) tunteina pystyi laskemaan muutaman ihmisen sormilla, oli kokonaistuntimäärä varmasti valtava. Suunnitelmassa ei siis pysytty tuntijakauman eikä -määrän osalta.
Yhteenveto
Projektini onnistui melko hyvin – peli on pelattavassa kunnossa, ihan oikeasti jopa. Se voisi hyvinkin esimerkiksi lanitapahtumaan sopia räiskintämätön väliin. Toisaalta siinä on muutama pelaamista haittaava ominaisuus, kuten näppäinpainallusten ”interferenssi”. Yleisesti ottaen pelin pitäisi kuitenkin olla hyvin bugiton, vaikka esimerkiksi näppäinasetusten säätämisen toteuttaminen jäikin ensi kertaan.
Projektin tekemisestä opin paljon etukäteen suunniteltavasta koodauksesta. Tekemällä malli-näkymä-systeemin mukaista koodia sain helposti laajennettua peruspeliin lisää ominaisuuksia ja suunnittelemisella sain koodin yleisestä eheydestä todennäköisesti huomattavan paljon paremman. Toisaalta opin myös Graphics-luokan käytön ja luokkajaon perusteita, lisää Swingiä ja tietenkin projektinhallintaa.
Ping (sorsat, binäärit, dokumentaatio) zip-pakattuna, sorsat pakkaamattomina ja Javadoc-dokumentaatio.