Squares Unlimited – Out of the Sandbox

Sunnuntaina parin viikon ahertamisen lopputuote oli viimein jalostettu finaaliversioksi – kurssin projektityö oli valmis, vieläpä ajoissa. Projektiaiheenani oli refleksejä koetteleva, hiirenkuuntelija-rajapintoja hyödyntävä pikkupeli, joka hetken mielijohteesta sai nimekseen Squares Unlimited, aivan kuin tribuuttina häilyvälle esikuvalleen – Squares2-pelille. ValikkoLähtökohdasta voi lukea lisää projektisuunnitelmasta, vaikka jonkin verran muutoksia pelin rakenteeseen matkan varrella tulikin.

Aikaa projektiin kului aivan tuhottomasti ja oma 90 tunnin arvioni pelin kehittelyyn käytettävästä ajasta ylittyi hulppeasti. En pitänyt tarkkaa kirjaa käytetyistä tunneista, mutta niitä kertyi reilusti yli 100 – ehkä noin 120 tuntia. Melkoinen osa ajasta kului muuhun kuin koodaamiseen – Java2D API:iin tutustumiseen, Sunin aplettitutoriaalin ja muiden nettiartikkeleiden sekä Java-keskustelufoorumien kahlaamiseen, peligrafiikoiden tekemiseen Photoshopilla ja PhotoDraw:lla sekä kaikenlaiseen ylimääräiseen säätämiseen ja vääntämiseen, pelin taustamusasampletkin väsäsin itse. Toki koodiakin kertyi reippaan oloisesti: reilut 3500 riviä kommentteineen.

gameplay-kuva

Lopputulokseen olen aika tyytyväinen. Puutteitakin tosin oli – olisin halunnut peliin tallennussysteemin, joka tallentaa tulokset serverille. Nyt jouduin tyytymään ratkaisuun, jossa apletti tallentaa käyttäjän koneelle txt-tiedoston, jossa omat parhaat tulokset säilyvät. Tämäkin oli ihan kohtuullinen suoritus sinänsä, sillä oletuksena apletilla ei ole mitään oikeuksia kirjoittaa käyttäjän koneelle. Tein pelin jar-tiedostolle itsesertifikoinnin käyttämällä JDK:n mukana tulevia keytool– ja jarsigner -työkaluja. digital signatureTällöin apletti kysyy käynnistyksen yhteydessä käyttäjältä tarvittavat lisäoikeudet tulosten tallentamista varten. Yleensä kuitenkin on tapana, että signeeratulla apletilla on esitettävänä jonkin kolmannen osapuolen varmistus ohjelman luotettavuudesta.

Heikoin puoli koodissani oli luokkarakenne. Periaatteessa alussa oli kaksi vaihtoehtoa – joko tehdä vähän suppeampi peli hartaasti mietityin algoritmein ja tietorakentein sievään pakettiin käärittynä tai sitten yrittää toteuttaa kaikki projektisuunnitelman asiat, keinolla millä hyvänsä. Valitsin jälkimmäisen. Tarkoituksena oli vielä miettiä koodin rakennetta uudelleen myöhemmin, mutta aika ei antanut periksi tämän suhteen. Tuloksena olikin kuusi luokkaa, joista yksi – pelin aplettiluokka – oli jossain määrin ylimitoitettu. Toki piirtämisestä, ruudunpäivityksestä ja pelitapahtumista vastaava sekä selaimen kanssa suoraan vuorovaikutuksessa oleva luokka haukkaa luonnollisesti ison osan pelin sisältämästä datasta. Sen olisi silti voinut kenties hajauttaa pariksi pienemmäksi luokaksi. Toisaalta olisi ollut suhteellisen riskialtista tehdä lopussa suuria rakennemuutoksia: se olisi vaatinut ainakin paljon testausta, että kaikki toimii kunnolla uusilla järjestelyillä. Palauttamani peli kuitenkin toimii juuri niin kuin pitääkin, joten sikäli voin olla tyytyväinen.

Monista ennen vielä tuntemattomista asioista tuli ylipitkiksi venyneiden koodaussessioiden ohessa melkeinpä rutiinia. Tällaisia uusia tuttavuuksia olivat mm. luokat AffineTransform (kierto ja skaalaus), AlphaComposite (läpinäkyvät kuvat), TexturePaint (tekstuurimaalit), GradientPaint (gradienttimaalit), TextLayout, tuplabufferoinnin hyödyntäminen, 2D API:n geometriset muodot – ja Graphics2D:n käyttö ylipäänsä.

digital signature

Koko pelin piirtosysteemi perustuu Timerien hyödyntämiseen – tuttua kauraa jo edellisistä Java-kotitehtävistä. Javassa kuvalle tehtävät muokkaukset tehdään BufferedImage-muotoiselle kuvadatalle. Helpoin tapa tehdä Imagesta BufferedImage on luoda vastaavan kokoinen tyhjä BufferedImage ja tämän grafiikkakontekstilla piirtää haluttu Image tyhjään kuvaan. Käytinkin tätä tekniikkaa monessa eri yhteydessä. Erityisesti ARGB-tyyppiset läpinäkyvät BufferedImaget osoittautuivat erittäin käyttökelposiksi. Kierrossa taas tuli esille fakta, että kun koordinaatistoa halutaan kiertää, niin se tapahtuu aina grafiikkakontekstin koko koordinaatistolle.

Peliä tehdessä heräsi hieman kiinnostusta myös kehittyneemmän grafiikan luontiin Javalla – lueskelin hieman OpenGL-rajapintaa hyödyntävien JOGL ja LWJGL -kirjastojen käytöstä. Ehkäpä näihin ehtii tutustua paremmalla ajalla vähän syvällisemmin.

Räjähdys

Mitä tästä kaikesta sitten jäi käteen? Opin paljon Javan 2D-grafiikasta, apletin teosta ja ohjelmoinnista yleensä. Luultavasti myös seuraava vastaavan kokoluokan projekti on jonkin verran helpompi toteuttaa – mitä se sitten ikinä onkaan. Ja tietysti on ihan kivaa myöskin saada omille kotisivuille jotakin aktiivista sisältöä.

Huomasin myös suunnittelun merkityksen: kunnollinen ja tarpeeksi tarkka alkusuunnitelma säästi aikaa ja hermoja useassa eri vaiheessa. Tarkensin suunnittelmia aina pienissä paloissa ennen jonkin isomman kokonaisuuden toteuttamista. Pelin teon sivutuotteena syntyikin reilut parisenkymmentä kuulakärkikynällä sutattua luonnostelusivua.

Lisää pohdintaa luvassa varsinaisessa projektin loppuraportissa. Peliä pääset kokeilemaan alla olevasta buttonista.

Näkymä

 

– Teemu

3 Responses to “Squares Unlimited – Out of the Sandbox”


  1. 1 Henri Heinola tammikuu 16, 2008 3:56 pm

    Siis mtäh..?! Aivan _hillittömän_ hieno peli!🙂 Onnitteluja vaan uurastuksen palkinnosta!

  2. 2 Asta tammikuu 19, 2008 1:15 pm

    Todella upeat kuvat, olet nähnyt varmaan enemmän vaivaa kuin kukaan muu. Jännää huomata, että yhden kurssin jälkeen jälki voi olla noin ammattimaista🙂 Hienoa Teemu!

  3. 3 ullap tammikuu 19, 2008 3:51 pm

    ^^ pakko yhtyä edellisiin, aivan TAJUTTOMAN hieno (ja koukuttava :D) peli!! Upeeta!


Vastaa

Please log in using one of these methods to post your comment:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s





%d bloggers like this: