Saturday 28 May 2011

Elämä kehittyy edistymistään

Uutisia, koulun loputtua väsäsin kahdessa illassa uuden MEMAPPER - käyttöliittymän loppuun. Skriini on täällä. Käyttöliittymässä on napit layeroperaatioihin (lisää/poista/kopio/yhdistä layer), tilesettien tuontiin ja poistoon, ja lisäksi olen toteuttanut ToolBoxin niin, että ikkuna korostaa valitun työkalun vihreellä.

Mitä seuraavaksi? Kirjoitan tätä keskeltä mitä parhainta yötä, jossa Tässi suunnittelee PdN:llä hippiAnkkaTässiä, joten minunkin on luonnollisesti suunniteltava ja toteutettava jotain. Kun käyttöliittymä on valmiin näköinen, on luonnollista alkaa miettimään ohjelman datarakenteita. Mitä rakenteita ohjelma tarvitsee?

Rakenteen, joka säilyttää kaikki tilesetit muistissa.
Rakenteen pitäisi pystyä vastaanottamaan tileset ( .add(tileset);), ja palauttamaan ännäs tileset ( .get(tilesetin_nro);). Yllättäen tämän rakenteen pitää laajentua dynaamisesti, mutta se ei ole ongelma.

Tämä koostuu tileseteistä

Tilesetrakenteen
Tämä rakenne osaa palauttaa BufferedImagena/jossain muussa helposti työstettävässä muodossa jokaisen kartalta löytyvän tilen, ottaen parametreina tilen X:n ja Y:n tilesetiltä. Konstruktori voisi ottaa polun .png-tiedostoon, josta tileset sitten ladataan. Ja, kuten toitotettua, ohjelman pitäisi joka kohdassa tukea transparentteja .png-kuvia.

Tämä koostuu tileistä

Tile
Tilerakenne tuntee isäntätilesettinsä numeron, sijaintinsa ko. tilesetillä ja rotaationsa kartalla. Näiden tietojen perusteella pitäisi renderöijän osata piirtää kartan jokainen tile. Jokaista näistä arvoista pääsee käyttäjä muuttamaan.

Tämä on karttojen pienin yksittäinen komponentti

Layer
Layer on samantyyppinen rakenne, kuin tileset. Luodessa layerin koko määritetään, ja layer täytetään erityistileillä. Nämä erityistilet, joiden sijainti tilesetillä on (254,254), ovat täysin läpinäkyviä tilejä. Jokaisen layerin tilen sijaintia voi muuttaa antamalla layer-rakenteelle ensin x,y - arvot, jotka kertovat mistä päin karttaa haluttu tile löytyy, ja sitten muuttamalla palautuvan tilen sijaintia tilesetillä.

Yllättäen, Layeritkin koostuvat Tileistä.

Layerkokoelma
Säilöö Layerit melko samalla periaatteella, kuin tilesetrakenne. Enpä yllättyisi, vaikka Layerkokoelmalla ja Tilesetrakenteella olisi sama, geneerinen kantaluokka jonka päälle erottavat ominaisuudet on rakennettu (Enpä yllättyisi, vaikka käyttäisin oliokielten perusrakenteita :O OMFG)

Saatan olla erittäin paha, ja rikkoa pyhän kolminaisuuden sääntöä, jossa UI ja data pitää pitää erillään. Voi silti olla, että toteutan näille luokille data- ja käyttöliittymärajapinnat, ja käsittelen oliota ulkopuolelta vain rajapintojen kautta, toteuttaen näin piene erotuksen käyttölittymäsysteemien ja datan välille.

Ai miksi teen näin? Tämä mahdollistaisi sen, että kun kartan jonkun layerin jonkun tilen tila muuttuu, osaa systeemi automaattisesti kutsua karttapaneelin repaint()-metodia. Lisäksi minulla on suunnitteilla plugin-api, jonka toteutusta helpottaisi fiksu karttapaneeli. Ei siitä kuitenkaan vielä mitään. Nyt koodaamaan :P

Thursday 19 May 2011

Onnea minä

Tänään valmistui toinen Espanjalaistarina, nimeltään El Lol Ranskassa. El Lol, Diego kavereiden kesken, saapuu Ranskaan eräänä synkkänä yönä keräämään apua Espanjan vallannutta vihollistaan, Fernandezia, vastaan.

Jos se ei päähenkilösankarin kutsumanimestä näy, on tämä (ja edellinenkin) tarina ottanut vaikutteita El Cidin tarinasta. Mikäli tarina ei ole tuttu, voin suositella leffaa, joka minultakin löytyy hyllystä. Jättänen täyden "Viittaukset Cidiin" - listan viimeisen osan loppupuolelle.

Seuraavaksi minun pitäisi kirjoittaa Sceadutiesmikä, aka Ralf-stoori, loppuun. Sen jälkeen joko espanjalaistrilogia loppuun, tai/ja uusi osa Sceadutiesmitä. Minulla on myös suunnitelma tarinasta, joka hylkäisi tutun kioskiritarimiljööni, ja perustuisi vähän enemmän oikeaan elämään. Perustuisi oikeastaan oikeaan elämään yhtä paljon kuin Pröng/MERPG.

Wednesday 18 May 2011

MEMAPPER.net...... tai sitten ei

Hehkutin vähän aikaa sitten Fairandcruelissa alustanvaihtoa .NETtiiin. Enpä hehkuta enään. Noin viikon tekemisen jälkeen on käynyt harvinaisen selväksi, kuinka karmea UI-kirjasto WinForms on. Ellei C#-raamattuni yllätä, palaan takaisin Javaan, vaikka C# omaakin paljon erittäin kivoja rakenteita, joiden hylkääminen ärsyttää, on dynaamisen käyttöliittymän luonti WinFormsilla niin purkkaisaa, etten voi työskennellä sen kanssa.

Eli, palaan Java-alustalle kiintoisan .NET-kokeilun jälkeen. Tämä tarkoittaa sitä, että otan vanhasta mapper.java - projektista käyttöliittymäluokan, ehkä pari muuta rakennetta, ja lähden väsäämään viime postissa mainitsemiani ominaisuuksia (Layerit, pyörittely, transparency). Tämä tarkoittaa, että suurin osa vanhan projektin luokista jää käyttämättä, mutta se tarkoittaa että voin tehdä niistä siistimmät versiot.

Sunday 8 May 2011

Jos ei vappuna ole lunta

Kun vapun aikaan oli sähkökatko, kirjoitin läppärille nojatuolifilosofisen tekstin. Jaan tämän tekstin muille oikolukematta sitä :P

Kirjoitin muuten viime vuonna samankaltaisen tekstin, jonka pitäisi löytyä Yoolista jos mikrobitti ei ole jo poistanut sivutilaani wanhan sivustosoftan vuoksi. Teksti on tässä.


Kuten jo viime vuonna näihin aikoihin kirjoitin, on sähkökatko hyvää aikaa ryhtyä nojatuolifilosofiksi.

Viime vuonna, touko- tai kesäkuussa, oli myös sähkökatko. Silloin se kesti kahdeksan tuntia, joista ehdin kirjoittaa reilut kaksi, koska läppäreissä ei sähkö riittänyt kauemmaksi aikaa. Nyt katko on kestänyt tunnin, ja se on globaalimpi kuin viime vuonna. Muistaakseni viime vuonna ne kahdeksan tuntia, jotka elin pimeässä, Tässi eli valossa. Nyt hänelläkään ei ole valoa. Tästä voisi päätellä kaikenlaista: eteneekö pimeys, hiljaa satoaan korjaten, vai onko sohvalla kaksi mustaa aukkoa jotka kontrolloivat koko universumia – banaanilla?

Onneksi en harrasta ennusmerkkien lukemista vasikan sisälmyksistä. Ei, riistasta ennustaminen on likaista ja antiikkista. Nykyajan ennusmerkit luetaan kevään tapahtumista. Kuoleeko keväällä yksi vai neljä henkilöä, onko keväinen sähkökatko kaksi- vai kahdeksantuntinen, kuinka laaja sähkökatko on? Kaikki nämä kertovat meille jotain elämän nykyisestä tilasta. En vain ole vielä saanut selville mitään, mikä riippuisi näiden kysymysten vastauksista, mutta kuten jo Pröngissä sanotaan: ei vastauksia ensinkään, jos ei kysymyksiä laisinkaan.

Tyhmempi voisi luulla että meillä on vastaukset, kevään ennusmerkkien vastaukset, ja kysymykset puuttuvat. Tällainen oletushan epätoteuttaisi totta olevan ajatuksen siitä että vastaukset riippuvat kysymyksistä, sillä (kuten Linnunradan Käsikirja Liftareille todisti), jos ei ole korrektia kysymystä, ei vastauksessa ole mitään järkeä. Oletus on nimittäin väärin. Kevään ennusmerkkien vastaukset eivät ole osa vastausta jota haemme, vaan osa kysymyksiä joiden vastauksia haemme. Kysymys voisi olla: ”Mitä se tarkoittaa että sähkökatko on näin laaja?”, ja kuten lapsikin osaa päätellä, ei siihen voi vastata että ”sähkökatko ulottuu Tässille asti”.

Ennusmerkit eivät rajoitu yllämainittuihin. Tänä vappuna, eli nimenomaan juuri tänään, 1.5.2011, satoi lunta. Se on melko vahva merkki. Joku voisi ymmärtää sen niin, että pitäisi kuunnella Sonata Arctican Takatalvi – levy lävitse. Tästä taas huomata levyn kolmas ja neljäs kappale, jotka ovat skorpparicover Still Loving You ja omaa tuotantoa oleva Shy. Kuten nimistä jo voi päätellä, ovat kappaleet melko herkkiä ja siirappisia. Putkipäätelmällä voidaan olettaa, että jos vappuna tulee lunta, tulee kesästä romanttinen ja kaunis. Ai miten näen faktoissa vain sen mitä haluan nähdä? :)

Sähköt ovat olleet poissa jo 80 minuuttia. Teoriassa haluaisin päästä jo väsäämään MERPGiä, mutta toisaalta alan jo pitää tästä tajunnanvirtateorian kirjoittamisesta. MERPG on hassu projekti, siihen liittyy jaettu tekemisen maku. Viikoilla se kehittyy vähän hitaahkosti, mutta kun projektiin saa viikonloppuna tai lomalla kipinän, kipinä sytyttää ison tekemisen kokon, ja ennen kuin huomaankaan, on minulla MEMAP-karttaformaatti neljännessä versiossaan ja MEMAPPERista, MERPGin kartanteko-ohjelmasta kymmenen betaa ulkona.

Tämä projekti on opettanut minut hieman nöyremmäksikin. Pelkkä kartantekosofta on käyttänyt puoli vuotta päällä olleesta projektista puolet, eikä sen ohjelman tunnelin päässä näy valoa vielä hetkeen. Onneksi CB-foorumin käyttäjä nimeltä Latexi95 väsää animaatiosoftaa, jota saanemme käyttää projektissa. Jos joutuisin itse tekemään senkin softan, venyisi projekti poikkeuksetta vähintään neljällä kuukaudella. Nyt minulla on ollut aikaa keskittyä MEMAPPERin ja pelimoottorin kartta- ja animaatiosysteemien hiomiseen. Nuo kaikki kolme ovat parhaillaan erittäin paljon parempi kuin kuukausi sitten, mutta silti melkoisia raakileita.

PING! Sähkökatkoa on kestänyt lievästi arvioiden jo puolitoista tuntia. Nyt voisin säästää koneen sähkö mahdollisesti latauksen tarpeessa olevalle DS:lle, ja siirtyä pelaamaan sitä, ellei sähköt palaa.

Wednesday 4 May 2011

Uudesta karttaformaatista vielä

Viime tekstin kirjoituksen jälkeen kävimme Tässin kanssa jatkokeskustelua aiheesta, sillä lopputuloksella että kolmannen memap-formaatin pitäisi tukea
  • Rajoittamatonta layermäärää, tosin näiden kanssa kehittäjät saavat käyttää älliä, sillä kartan käsittelyn raskaus on melko suoraan verrannollinen layereiden määrään.
  • Transparentteja tilejä, mikä tarkoittaa sitä että tilesetit luodaan tästedes PNG-kuvina
  • Käänneltyjä tilejä, mikä tuo helpotusta tilesettien tekijöille, kun yhtä tileä ei enää tarvitse kopioida tilesettiin eri asennoissa.
  • Useampaa tilesettiä, mutta näidenkin kanssa saa käyttää älliä.
  • Tilesettien upotusta karttatiedostoon, eli tilesettejä ei enää tarvitse kuljettaa karttatiedostojen mukana, vaan ne kulkevat karttatiedostossa.
Karttatiedoston rakenne tulee muuttumaan sen verran, ettei nykyisellä MEMAPPERilla luodut kartat ole yhteensopivia tulevien peli- ja MEMAPPER-versioiden kanssa. Julkaissen uuden betan pian, ja odotan että joku veljeskunnasta antaa UIsta ja yleisestä käytettävyydestä kommentteja, jotta softaa voi kehittää eteenpäin. Sen jälkeinen MEMAPPER-versio tukee todennäköisesti uutta karttaformaattia.

Tiedoston speksit pitäisi kirjoittaa, ja nyt kun on aikaa, voisin yrittää sitä.

Tiedoston ensimmäinen tavu ilmaisee kirjastoversion, tätä speksiä noudattavissa tiedostoissa tämän tavun arvo on 3. Seuraava tavu ilmoittaa kartan leveyden tileissä, sen jälkeen tulee korkeus. Neljäs tavu ilmaisee layereiden lukumäärän. Seuraavaksi tulee leveys*korkeus*layerien määrä verran sarjaa, jossa ensimmäinen ja toinen tavu ilmaisevat X,Y - koordinaatit joilta kartan tile löytyy tilesetiltä. Sarjan kolmas tavu ilmaisee monennelta tilesetiltä tile on, ja neljäs tavu sarjassa kertoo tilen kulman. Tilen kulma on 90astetta*sarjan neljäs tavu. Kun sarjoja on tullut tarpeeksi monta (leveys*korkeus*layerien_määrä*4), on tultava ns. EOS-tavu (255), joka merkitsee että layeri on nyt luettu loppuun. Jos oikeassa kohtaa on joku muu kuin EOS-tavu, on karttatiedosto virheellinen, ja sitä ei voi hyväksyä.

Ensimmäisen EOS-tavun jälkeen tulee samaa neljän tavun sarjaa uudelleen leveys*korkeus*layerien_määrä, merkaten toisen layerin sisältöä. Uudet layerit taitetaan samojen periaatteiden mukaan kuin ensimmäinenkin, ja uudet layerit tukevat transparencyä, mitä eka layer ei tee. Kun viimeisen layerin EOS-tavu on kohdattu, eli on luettu tiedoston neljännen tavun verran EOS-merkkejä, alkaa hit-data. Hit-dataa on vain kartan_w*kartan_h verran, eli toisen ja kolmannen tavun tulon verran, ja jos hit-datan joukosta löytyy jotain muuta kuin 1 (=true ("tälle tilelle saa astua")) tai 0 (=false ("tälle tilelle ei saa astua")), on tiedosto viallinen. Karttatiedosto päättyy EOS-tavuun.

Mutta, olen puhunut siitä että tilesetit upotettaisiin karttatiedostoon. Miten tämä tapahtuisi?

Helppoa, rakkaat lukijani. Mietin pari päivää että miten upottaisin n-määrän PNG-kuvia turvallisesti oman datani joukkoon, ilman sitä riskiä että png-kuvan sekaan joutuisi muun kuvan dataa tai omaani. Sherlokkasin lopulta, että MS Wordin .docx - tiedostot, joita wordillä avataan, ovat tunnetusti vain zippitiedostoja jännällä tiedostopäätteellä. Etsin siis Javalle ja C++lle zippikirjastot, ja nyt kun olen ne löytänyt, voin toteuttaa MERPGille ja karttasoftalle tarjottavat karttatiedostot zippeinä, jotka sisältävät todennäköisesti juoksevasti numeroidun tilesetläjän ja binääritiedostona karttadatan, tiedoston jonka speksasin ylle.

Koodaamisiin :P