Sunday 30 January 2011

Pelilogiikka ja sellainen

Koska vanhassa, vajaan puolentuhannen rivin MEMAP-moottorikokeilussa oli joku pinnanalainen bugi, aloin kirjoittamaan koko juttua alusta, pitäen huolta siitä etten vain räpellä vaan koodaan ihan ajatuksen kanssa.

Ennenkuin edes aloin väsäämään uutta versiota karttaluokasta, oli tehtävä uudestaan näyttöabstraktio ja perusobjektiluokka. Objektiluokan päälle olisi sitten helpohko kasata kartta.

Objektiluokan toteutuksen porkkana on kamera. Systeemi pitäisi toteuttaa niin, että kun kameraa liikuttaa ( .move(4,3)), koko pelimaailma käyttäytyy kuin pelimaailmaa tarkastelevaa kameraa olisi juuri siirretty 4 pikseliä oikealle ja 3 alas. Ellen aivan poro ole, tämä onnistuu antamalla objektille omat koordinaatit, ja kun piirtotarve sattuu kohdalle, sijoitetaan objekti kohtaan (kamera.x+objekti.x,kamera.y+objekti.y).

Ongelmaksi osoittautui etten ole aivan kartalla siitä miten luokkamuuttujat (static - muuttujat) toimivat C++ssa. Kääntäjästä nuo menevät ihan ylösalaisin läpi, mutta linkkeri ei tykännyt. Lopulta, kun linkkeri suolsi siansaksaansa ulos toista tuntia, lähdin iltapalalle. Huomenna olkoon parempi päivä.

Thursday 27 January 2011

MEMAP-formaatti

Uutisia, MERPG:n karttamoottorinalku osaa nyt käydä tileset-kuvan läpi ja esittää ruudulla yksitellen tilet. Seuraava osa projektissa olisi varmaan kirjoittaa joku malli jonka mukaan lopullinen karttaluokka toteutetaan. Samalla pitäisi miettiä MEMAP-tiedostoformaattiakin. Skriptipohjainen- (alkuun tilesetin nimi ja suhteellinen polku, ja sen perään jännästi muotoiltua informaatiota siitä mikä tile tilesetistä kuuluu minnekin ruudulla ja mihin karttakerrokseen), vai binääriformaatti (oikeastaan samantyyppinen, mutta tekstidata korvattu numeerisella datalla)? Miten formaatin sisäinen syntaksi toimii/missä järjestyksessä data on tiedostossa (skripti/binäärinäkökulma)?

Miten toteuttaa MEMAP-luokan ja tiedostolaturin yhteiselo? MEMAP-luokkaan yksi latausmetodi, vai kokonainen oma luokkansa, jolle ensin määritellään asetuksia ja joka sitten palauttaa käyttäjälle täysin käyttövalmiin MEMAP-kartan?

Skriptitiedosto-formaatin toteuttaminen saattaisi olla helpompaa nyt kun tuo Skriptihöskä Viides elää MERPGin taustalla. Binääriformaatin lukeminen taas olisi paljon helpompaa, ja mikä kaikkein kivointa, kevyempää (ja sitä myöten nopeampaa). Toisaalta uskoisin että C++lla skriptitiedosto parsiutuu niin nopeasti, ettei käyttäjä huomaa eroa skripti- ja binääritiedoston välillä.

Formaatin ohjelmallinen toteutus on myös vähintäänkin mielenkiintoinen. Luokkaheader lienee seuraava(nkaltainen):

class MEMAP
{
private:
int kartan_sivun_mitta; //kokonaisina ruutuina, olettaen kartan olevan 1:1 - neliö
int X;
int Y;

std::vector<std::vector<OBJECT> > KARTTA; //näkyvä kerros
std::vector<std::vector<bool> > HIT_KERROS; //kerros joka määrittelee mihin hahmo voi astua, tämän pohjalta pitäisi olla helppo tehdä vaikka minimap...

public:
void draw(näyttölaite& näyttö);
void positionAt(int x,int y);
bool load(const char* polku); //<- toteutan ehkä, harkitsen myös sitä latausluokkaa
};

Ei se ollutkaan niin ihmeellinen. Jännintä ovat kaksiulotteiset KARTTA- ja HIT_KERROS - vektorit. Toisen koko saattaa kyllä nousta aika suureksi, kun tuo OBJECT-luokka on oma abstraktointini SDL-kirjastosta.

Tuohon pitäisi vielä toteuttaa ehkä joku karttanaatit->ruuttunaatit - muunnos (eli kartta-oliolta kysytään mihin pelihahmo on sijoitettava jos se halutaan sijoittaa tilen (3,4) päälle) ja HIT_KERROS-vektoria hyödyntävä funktio, joka yksinkertaisesti tarkistaa saako koordinaatteihin (x,y) sijoittaa pelihahmoa.

Tämän blogitekstin jälkeen projektissa pitäisi olla taas helpompi edistyä. Perehtynen näihin viikonloppuna :P

Saturday 22 January 2011

8 tuntia ja loppupäivä

Kuten naamakirjan puolella hehkutin, eilen piti olla kasituntinen. Alkuun kerron tästä perinteestä.

Joskus kauan sitten, kun Pirates of the Caribbean 3 oli DVDllä uusi leffa, Tässi sai idean että pitäisi katsoa 3 PotCia putkeen, löytää näistä uusia yhteyksiä ja ristiriitoja, ja sellaista. Noh, oli vuodenvaihde ja joululoma, niin katsottiin kolme PotCia putkeen. Seuraavanakin vuonna, samoihin aikoihin, katsottiin leffat putkeen. Ja seuraavana.

Eilinen kasituntinen kulki niin, että kuuden aikaan Tässi ilmestyy tänne. Siinä sitten syödään jotain, ja siirrytään alas. Isken PotC1-BD:n pleikkariin ja katsomme sen. Kun olemme valmiita sen kanssa, kello on yksitoista, ja ainakin minä olin sen verran väsynyt etten olisi jaksanut keskittyä enää seuraaviin leffoihin. Tässi oli ymmärtääkseni samassa tilassa. Aloimme siis metsästämään tähtiä Supermariogalaxyssä :P Teimme myös empiirisen testin jonka tulos oli että Super Mario Bros on äärimmäisen sadistinen peli. Väsyimme kuitenkin pian ja sitten alkoi Civ. Hallitsimme puolta maailmaa vasalleinemme parissa tunnissa.

Kello alkoi jo olla paljon, joten piti pelata vielä perinteisesti DSiä. Lopulta pääsimme tutima-keskusteluihin, joiden taso oli jännä :D Yön paras hetki on kun toinen luulee olevansa kansio joka lentä riippuliitimellä, ja toinen on Tohtori avaruusbussissa.

Aamu meni lähinnä siivoten ja DSää näpräten. Suunnitelmissa on jatkaa kakkos- ja kolmosleffalla kunhan löytyy sopiva rako.

Vähän turhia koulupäiviä

Kuten naapuriblogissa lausuin, ovat koulupäiväni tässä jaksossa vähintäänkin hauskoja. Maanantait ja keskiviikot, kun koko päivät ovat yhtä kurssia, menevät, mutta tiistait ja torstait ovat tällä viikolla ainakin olleet oikeastaan aika turhia. Molempina päivinä on ollut enkuntunti, jonka jälkeen on odoteltu puoli tuntia äikänmaikkaa, ja sitten lähdetty pois kun häntä ei ole kuulunut. Pikkulinnut ovat laulaneet, että häntä ei kuulunut vaikka pikkulintu odotti koko tunnin.


Viikolla olen myös tuhlannut aikaa dvd-boksien kanssa. Katsoin Housen kutoskauden ja jaksoja Rooma 2:sta ja Bones 5:stä. Koodaus on edistynyt tasan sen verran että minulla on käsitys siitä, miten MERPG-kartat toimivat, ja olen tehnyt lähestoimivan loginin MERPG-tarinankertomissovellukseen. Hemmetin merkistöbugi jumittaa sitä projektia...

Thursday 20 January 2011

Niistä projektinhallintataidoista...

Koulussa alkoi tällä viikolla hieman hauskempi jakso. Ma-to 8.15-11.30, pe ei laisinkaan koulua. Eli projekteille on aikaa. Ikävä kyllä projektinhallintataitoni ovat mitä ovat, Meneillään on Pröngiä, Yool-suunnittelua, MERPG (joka sisältää 2-4 aliprojektia, sillä peli vaatii A)moottorin joka pyörittää peliä B)SDK:n C)mediat D)Sen varsisen pelikoodin), Skriptihöskä ja pari pienempää kokeilua. Kaikki projektinhallintaohjeet korostavat sitä että meneillään saa olla vain yksi projekti kerrallaan. Ehkä MERPG-kokonaisuus vielä menisi läpi, sillä MERPG-projekti saa koottua yhteen Visual Studion solutioniin (ehkä jotain netissä toteutettuja SDK-työkaluja lukuunottamatta), mutta MERPG ja Pröng, joilla ei oikeastaan ole mitään vuorovaikutusta toistensa kanssa, eivät MISSÄÄN NIMESSÄ saisi olla samaan aikaan alasimella.

Joka tapauksessa, tällä viikolla olen kasannut pätsiä Pröngiin, tehnyt ryhmätyösovellusta MERPG:n tarinan ryhmätuottoa varten ja kasannut MERPG:n moottoria. Tuo ryhmätyösovellus, joka ei ehkä voita mitään MS SharePoint Serveriä, mutta onpahan toimivaksi suunniteltu kuitenkin, toimii niin, että käyttäjä kirjautuu sinne Pröng-tunnuksilla ja skripti lataa tarinataulusta, tietokannasta, kaikki tähän mennessä kirjoitetut tarinanpalat ja tulostaa ne. Tähän tulostetaan formiin <textarea>, johon käyttäjä saa kirjoittaa tarinanpätkänsä. Textarea-elementtiin voisi iskeä javascript-purkan joka nostaa kentän korkeutta kun rivejä on tarpeeksi. Ei millään pahalla ketään kohtaan, mutta Fairandcruel ja Sceadungungengarmikälie on opettanut minulla kuinka rasittavia alimittaiset textareat ovat.

Sitten, kun textareaan on kirjoitettu tarinanlisäys, se lähetetään POSTilla palvelimelle, joka iskee lisäykset kantaan. Sitten minä ehkä-ennakko-moderoin (suomeksi sanoen siis moderoin ehkä ennakkoon), mutten etsi peeloviestejä, sillä Pröngtunnukset on annettu vain luotetuille persoonille (:P), vaan etsin materiaalia jonka toteutus on vaikeaa tai mahdotonta omilla taidoillani. Abstraktointi on hieno taito, ja monitasoinen abstraktointi pystyy ratkaisemaan moniakin ongelmia (kuinka mallintaa funktiokutsu proseduaaliympäristössä?), mutta ei sekään ihmeisiin pysty.

Tuo MERPG-moottori ei ole vielä kovin ihmeellisessä kuosissa. Se osaa nyt lähinnä napata tilesetistä tilen kohdasta (X,Y) ja piirtää sen SDL:llä ruudulle. Pitäisi laajentaa objektimoottoriani tukemaan kameroita... Muuten tuo karttamoottori on aika turha, ja pelin teosta tulee vaikeaa.

Ensikertaan :P

Sunday 16 January 2011

Uusi vuosi, vanhat kujeet

Kuten jotkut saattavat tietää, palasin viikko sitten Teneriffalta. Viime viikon taas olin töissä miltei puolipäivisiä päiviä, matkat mukaanluettuna, joten en ole ollut kovin aktiivinen. Jotain edistystä on kuitenkin tapahtunut :P

Lopetin viimevuoden ilmoituksella Skriptihöskä viitosesta. Saanen ilolla ilmoittaa, että loman aikana edistyin siinä projektissa. Minulla on nyt suunnitelma muuttujasysteemistä, jota toteuttaessani harjoittelin myös c++n virtuaalifunktioita aka polymorfismia. Eli suomeksi sanoen, sijoitusoperaattorit toimivat nykymuodossaan, string-muuttujasijoituksessa kutsutaan string-sijoitinta string-luokasta eikä desimaalisijoitinta int-luokasta, ja kaikki perytyvät yhteisestä kantaluokasta! Tämä helpottaa järjettömästi funktioiden muuttuja-avaruuksien toteutusta, mistä seuraavaksi lisää.

Funktioistakin on jonkinlainen suunnitelma. Funktioiden olisi tarkoitus tukea omia muuttuja-avaruuksiaan, parametrien vastaanottamista ja palauttamista, lisäksi funktiokutsuarkkitehtuurin (aka kutsupinon) pitäisi mahdollistaa monen, samaa funktiota kutsuvan kutsun päällekkäinlatominen. Suomeksi sanoen rekursiivisuuden pitäisi toimia.

Koska kutsupino pakottaa toteuttamaan kaiken seemäisesti funktioiden sisällä, kieli tulee sisältämään kuuluisan Main()in. Pääfunktio-ajattelun pitäisi myös nopeuttaa koodin parsimista. Vielä on auki, että toimiiko pääfunktion valinta "int main(void)" -tyyppisen kliseisesti vai pakotanko käyttäjän spesifioimaan preprocessor-direktiivillä (lavlia tuo finglish :P) pääfunktion nimen.

C++ on osoittautunut äärimmäisen kivaksi ympäristöksi tälläiselle projektille. Yleisön on turha vielä odottaa projektilta mitään konkreettista, mutta minulla on isot odotukset tässä. Täytyy vain toivoa ettei intoni lopahda.


Toinen uutinen. Lomalla sain idean eräästä pelistä. Julkistin sen fairandcruelissa ja yhteisö piti ideasta. Pelin toteutusympäristöksi on mielestäni ehdottomasti asetettava C++ - SDL-kirjastolla. Minulla on suunnitteilla peliin paljon kivoja ominaisuuksia, joita täytyy demota pian. Ehkä jo tässä kuussa. Taidankin alkaa toteuttamaan näitä demoja nyt :P

Friday 14 January 2011

Kesä -08

Tämä ei mahtunut naamakirjaa eikä tämä päivitys kestä tiivistystä :P

Tahtoo kesän nollakasi <3 Silloin tapahtu kaikkea jännää :P

TADian Dynastiesin vetovoima oli huipussaan, oli Nightwishin tuskakeikka josta kaikki vähänniinkuin alkoi, sitte oli pipari jossain salossa. Siellä oli hauskoja lounaita, joiden perusteella minä ja Tässi olimme uskomattomia, siellä oli se yksi kaunis auringonlasku ja keskiyöt. Erityisen hauskaa oli kun tässi laittoi kuulokkeista soimaan The Escapistin täysillä keskellä yötä, ja se tarkoitti sellaista voimakkuutta että ihmettelen ettei eräs puolipäiväisesti täyspäiväinen kunniakaheli hirttänyt meitä seuraavana aamuna. Siinä leirissä oli sitä jotain, mitä ei tulla enää koskaan näkemään <3