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ä

Ping-pelin 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ä

Ping-pelin pelinäkymä

Pelinäkymässä valitut pelaajat ja pallo ovat kentällä. Pelaajien näppäinasetukset ovat:

Ikkunan pienentäminen ja deaktivointi sekä valikon avaus pausettavat pelin.

Valikko

Ping-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ä

Ping-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

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.