Sikoban 2.0, Legoukkelin paluu

Viimeisen Java-tehtävän aihepiirinä oli tulosten tallentaminen ja näiden näyttäminen JTable-komponentin avulla. JTable on perinteinen taulukkokomponentti – kaikki, jotka ovat vähänkään tutustuneet jonkun taulukkolaskentaohjelman, kuten Exelin, käyttöön tunsivat varmasti olonsa kotoisaksi kuudennen Javan parissa.

Näkymä

JTable on Swingin monimutkaisin komponentti” [1]. Jos näin todella on, niin se ei ainakaan aiheuttanut minulle juurikaan ylimääräistä päänvaivaa. Päinvastoin, aikaisempi paneelien ja framejen kanssa temppuilu kulutti aikaa ja hermoja huomattavasti JTaulukoita enemmän. Sikobaniin teimme oman Tulostaulukko-komponentin, joka on AbstractTableModel:n aliluokka.

Sinänsä oli hauskaa kehittää edellisellä tehtäväkierroksella luotua peliä, mutta kaiken kaikkiaan kuudes Java-tehtävä oli aika lailla puuduttavaa vääntämistä. Taulukointia ja tallentamista? Blaah. Jäin kaipaamaan tehtävältä jotakin mielenkiintoista kiintopistettä. Jotain mistä olisi hyötyä projektissa (no niin, toki tästäkin oli) ja jotain mikä saisi projektin lähestyessä peruskoodauksen maistumaan vähemmän puulta. VoittonäkymäTällainen kiintopiste olisi voinut olla vaikkapa jonkin grafiisen aspektin lisääminen Sikobaniin: pidettiinhän 2D-grafiikasta varta vasten luentokin. Tällaisenaan kuudennen tehtävän sisältö jäi kovin heppoiseksi. Ehkä nämä asiat (JTable, tallennus) olisi voitu jo mahduttaa edelliseen Javaan? Lisäksi jäin hieman ihmettelemään äänien puuttumista ns. pakollisista tehtävistä. Tietokonepeli – vaikkakin kevytrakenteinen sellainen – ilman ääniä on kuin joulukuusi ilman koristeita, eli eipä paljon mitään.

Kukaan ei tietysti ole heristämässä sormea ja kieltämässä omatoimista tutustumista grafiikan kiehtovaan maailmaan. Niinpä päätin lisätä parilla asteella Sikoban-pelini visuaalisuutta ja kehittää siihen muutaman sellaisen graafisen härpäkkeen – Sikoban-animaation.

Animaatio (lat. animatio ’elävöittäminen’) on tekniikka, jossa elokuva toteutetaan kuva kuvalta [3]. Perinteinen tapa luoda animaatioita on näyttää nopeasti erilaisia kuvia peräkkäin, jolloin saadaan eräänlainen illuusio liikkuvista objekteista. Javalla frame-animaatio on melko yksinkertaista toteuttaa. On myös muita tapoja, kuten java.awt.graphics:n piirto-ominaisuuksien käyttö tai ns. sprite-animaatio.

Sikoban_GUI

 

Tein animaatiototeutuksen omaan luokkaansa. Sikobananimaatio.java sisälsi itse asiassa myöskin toisen luokan eli sisäluokan (inner class). Halusin animaatiot näkymään tarvittaessa samaan peli-ikkunaan pelipaneelin tilalle, joten oli luonnollista tehdä Sikobananimaatiosta JPanel:n aliluokka. Animaatio saadaan siten näppärästi esiin poistamalla framesta pelipaneeli ja asettamalla tilalle animaatiopaneeli.


Mikäli kuvatiedostot ovat suuria tai kuvia näytetään verkkoyhteyden yli, saattaa ongelmaksi muodostua kuvien hidas tulostuminen näytölle [2]. Kun kuvien vaihtoväli laskee muutamaan kuvaan sekuntia kohden, ei oikein voida hyvällä tahdollakaan puhua enää animaatioista. En saanut ensin yritelmiäni näkymään lainkaan, joten luulin, että kuvani olivat tiedostokooltaan liian suuria animaation näyttämistä varten. Niinpä tutustuin API:n MediaTracker-luokkaan. Se pakottaa ohjelman odottamaan yhden tai vaihtoehtoisesti kaikkien kuvien latautumista muistiin ennen animaation aloittamista [2].

Turhautuminen kipusi kliimaksiinsa, kun liikkuva kuva loisti poissaolollaan MediaTracker-olion käytöstä huolimatta. Ongelma löytyikin aivan toisesta suunnasta: kuvat kylläkin piirtyivät juuri niin kuin pitääkin – myöskin ilman MediaTrackeria – mutta framen ulkopuolelle, näkymättömiin. VoittonäkymäLopulta löysin virheen vaihtelemalla paneelin kokoa. Ongelman ratkaisemiseen tuhlaantui muutama ylimääräinen tunti ja hajoilemisen puuska, mutta ensimmäistä omaa animaatiotani katsellessani totesin vaivan olleen sen arvoinen.

Laitoin Sikobananimaatio-luokan konstruktorin ottamaan parametrina String-olion. Ideana oli mahdollistaa useiden erilaisten animaatioiden toteutus samaa luokkaa käyttäen. Konstruktorin parametrin perusteella otetaan oikeat kuvat käyttöön kyseistä animaatiota varten. Asetin aiemmin jo mainitun sisäluokan huolehtimaan kuvan näyttämisestä ja perimään luokan Thread, jolloin kuvien vaihtovälin saattoi toteuttaa laittamalla säikeen nukkumaan sopivaksi ajaksi. Totesin, että 60 millisekuntia on sopiva viiveaika.

Onnittelut

Sikobanissani on myös ääniefektit featuring Homer Simpson, Austin Powers, Sgt. Hartman (FMJ) ja Samuel L. Jackson. Koitan perehtyä WAV-ääniin projektin aikana hieman tarkemmin – nyt sain äänet toimimaan netistä löytämieni esimerkkien avulla ja palauttamani ratkaisu ei ollut toimivuudestaan huolimatta tyylikkäin mahdollinen ratkaisu.

 

Hyvää joulua!

– Teemu

[1] Vesterholm, Mika. Kyppö, Jorma. Java-ohjelmointi, Talentum, 2006, 6.painos.
[2] Java Coffee Break: Using MediaTracker to help load images
[3] Wikipedia: Animaatio

Linkkeihin viitattu 23.12.2007

0 Responses to “Sikoban 2.0, Legoukkelin paluu”



  1. Jätä kommentti

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: