DEA.FI

Intro, osa 2

Moi taas.

Tällä kertaa onkin luvassa paljon sisältöä!

Edellisessä videossa yritin vähän pohjustaa tätä videosarjaa, mutta en oikeastaan päässyt alkua pidemmälle. Tämä on vähän tällaista opettelua. Etenkin esiintymisen kanssa. Koitan tällä kertaa pysyä paremmin käsikirjoituksessa, joka löytyy edestäni. Lisähaasteena tässä on tosin tällä kertaa vielä se, että osaan kässärin jo liiankin hyvin ulkoa. Olen nimittäin jo pariin kertaan koittanut kuvata tämän videon, mutta aina jotain on mennyt pieleen. Ekan kerran mikki ei tallentunut, ja tokalla kerralla toi nätti koristevalo tuolta taustalta sammui kesken. Katsotaan miten onnistuu tällä kertaa.

Halusin kuitenkin kaikesta huolimatta julkaista edellisen videon, sillä siinä oli paljon sellaista asiaa, jonka halusin sanoa. Ja ehkä on parempi muutenkin pilkkoa nämä enemmän aiheeseen liittyvät asiat omaan videoonsa. Pyrin koostamaan kunkin episodin yhteenvedot nettisivuilleni, sekä videon kuvaukseen. Siitä on sitten toivottavasti helppo silmäillä mahtaako jaksossa olla kiinnostaa asia vaiko ei. Linkki kuvauksessa.

Toisaalta: en kuitenkaan malta olla mainitsemasta vielä muutamaa asiaa, jotka jäivät edellisestä videosta uupumaan.

Ensinnäkin nämä videot ovat myös itseäni varten. Olen jo pitkään pitänyt blogia, jossa aiheista kertomisen lisäksi on myös ollut läsnä sitä, miten ajattelen. Sama jatkuu täällä. Kai minulla sitten vain on tarve kertoa edes jollekin siitä, miten mulla menee, ja mitä olen saanut aikaan. Eli tämä on oikeastaan nimensä mukaisesti ihka aito vlogi, eikä videosarja devauksesta.

Soolodevaajan elämä kun tuppaa olemaan kovin yksinäistä; etenkin kun en ole osannut aloittaa postailemaan alan yhteisöihin. Minulla on lähinnä tämä oma nurkkani internettiä blogin ja tämän kanavan muodossa. Joku on tosin saattanut huomata, että olen vähän kokeiluluonteisesti myös postaillut hieman asiaa Twitteriin.

Sanoin edellisellä videolla, että kaiken takana on innostus. Mutta ehkä tarkemmin asia menee kuten vanha sanontakin: jaettu ilo on paras ilo. Tai sitten vähän molempia. Oli asia miten vain, niin olen toistaiseksi perin tyytyväinen, että minulla on nyt sellainen olo, että videoita kiinnostaa tehdä. Vaikka sinänsä tällä hetkellä tämä videoiden tekeminen tuntuu myös osin vähän itsetarkoitukselta. Toiveissa olisi, että tästä voisi kehittyä jotain aidosti positiivista.

Ehkä opin joskus jopa puhumaan ja katsomaan kameraan samaan aikaan :O

* * *

Mutta syvälle itse aiheeseen siis. Olen viime aikoina käyttänyt paljon keskittymistä peliprojektiini. Lähimmät ”seuraajani” ehkä tietävät ja muistavat, että minulla on pitkäaikainen unelma 2D-avaruuspelistä. Ja epävirallisten laskelmien mukaan tänä vuonna taisi tulla täyteen 15 vuotta tätä unelmaa. Myös blogilla taitaa olla 10 vuoden juhlavuosi. Miettikääpä sitä. Tästä videosta taisikin siis tulla kertaus menneestä:

Aikojen saatossa konsepti pelistä on elänyt varsin paljon, mutta toisaalta monet asiat ovat myös pysyneet ennallaan. Sen sijaan asia, joka ei todellakaan ole pysynyt ennallaan on itse toteutus. Olen aivan totaalisesti menettänyt kyvyn laskea pelin eri iteraatioita, mutta lopullinen luku lienee laskentatavasta riippuen jotain viiden ja viidentoista välillä.

Kaikki alkoi CoolBasic-versiosta kauan sitten. Tuhat – pari tuhatta koodiriviä, ja valmiina oli jo oikeastaan pelattavissa oleva peli. Löytyi useita aseita, tuhoutuva maasto, tekoäly ja käyttöliittymä. Hieman myöhemmin jopa polunetsinnällä ja kaupalla, josta pystyi ostamaan aseita tuhottuja vihollisia vastaan saaduilla krediiteillä.

Jo tässä antiikkisessa versiossa oli enemmän ominaisuuksia kuin olisi ehkä tarvinnut. Ja enemmän kuin missään muussa versiossa sittemmin (: Lisäksi vaikka ominaisuuslista olikin kattava, niin koodin taso oli jotain, mitä 15 vuotta sitten kirjoitetulta Basic:ltä voisi odottaa.

Toinen ongelma liittyi suorituskykyyn. Silloisessa CoolBasic:n versiossa ei ollut tukea rautakiihdytetylle läpinäkyvyydelle - tai oikein muullekaan - ja tarve alkoi kasvaa. Jossain vaiheessa löysin Pythonin, ja SDL-pohjaisen PyGame-kirjaston. Samalla tarjoutui tilaisuus kirjoittaa koodi vähän siistimmäksi.

Pelien ohjelmointi oli muutoinkin kovin kiinnostavaa, ja tällä uudella alustalla oli jotenkin entistä motivoivampaa niitä pelejä tehdäkin. Tein useita pelikokeiluja, joissa kaikissa oli jotain uudenlaista tekniikkaa kokeilussa. Partikkelitehosteita, fysiikkasimulaatiota, geneettisiä algoritmeja, tekoälyä, erilaisia aseita, käyttöliittymää, karttaeditoria, natiivikoodin kiihdytystä, tai jotain muuta. Lopulta myös verkkoaspekteja ja varsinaisia naiiveja verkkopelejä.

Mutta tässä välissä on pakko teroittaa jotain tärkeää, jolla on pitkät vaikutukset: oma osaaminen, ympäröivä maailmani ja myös mielenkiinto olivat kaikki fokusoituneet nimenomaan itse tekemiseen alusta asti. Kaikenlaiset laajemmat kehitysympäristöt ja kirjastot eivät olleet millään tavalla kiinnostavia. Valmiin pelimoottorin käyttäminen mihinkään ei tullut edes mieleen, ja olisi ajatuksena varsin tylsä. Itse tekemällä kaikki oli omissa käsissä, ja se myös opetti ihan parhaiten.

Joka tapauksessa pelikoodailussa aikojen saatossa alustaksi vaihtui vähitellen Pyglet, joka oli OpenGL-pohjainen grafiikkakirjasto, ja tämän myötä tarjolla oli entistä enemmän suorituskykyä. Myöskin eri aiheet alkoivat enemmän kiertää tuon avaruuspelin ympärillä, ja siitä tulikin tehtyä näitä tarpeita palvelemaan useita eri versioita ja iteraatioita. Muutamia kertoja tosiaan sitten myös isompi uudelleenkirjoitus uusilla opeilla ja fokuksella.

Peliaiheiden rinnalla - ja oikeastaan myös ennen niitä - olin myös pitkään ollut kiinnostunut verkko-ohjelmoinnista. Aluksi JavaScriptistä sen lähestyttävyyden myötä, mutta sitten nopeasti PHP:n maailmasta, sillä se mahdollisti pysyvyyttä ja monen käyttäjän järjestelmiä. Ja niihin aikoihin se oli parasta mitä oli olemassa.

Pysyinkin pitkään PHP:n maailmassa, mutta vähitellen kiinnostus kääntyi sielläkin Pythoniin, ja sen PHP-vastaavuuksiin. Lopulta kuitenkin löysin gevent-kirjaston, jolla oli mahdollista kirjoittaa sovelluspalvelimia, ja kaiken lisäksi siihen aikaan varsin kunnioitettavalla suorituskyvyllä. Sovelluspalvelimen konsepti mahdollisti uudenlaiset ideat. Olin jo PHP:n aikaan tehnyt jonkin verran kokeiluja EventStream-putkilla, mutta nyt avautui mahdollisuus WebSocket-maailmaan ja aidosti reaaliaikaisiin kaksisuuntaisiin web-sovelluksiin monen käyttäjän tuella, helposti.

Myös mobiili alkoi hieman kiinnostaa; jossain vaiheessa korvasin lopulta pitkään palvelleen Nokia E51:n Android-pohjaisella Nexus 5. Olin muuten Symbianillekin ehtinyt kirjoitella monenlaista sovellusta Pythonilla. Mutta Androidin kautta siis syntyi yksi toinen pitkäaikaisista projekteistani, eli GPS-seurantapalvelu. Ja se oli iso juttu mulle. Projekti itsessään, sekä sen tuoma kiinnostuksen kohteiden muutos syrjäytti pitkäksi aikaa peliaiheet korvaten ne backend-aiheilla.

Trackerin backendistä ehdin tehdä kaksi versiota Pythonilla. Viimeisimmässä versiossa oli jopa vähän mikropalvelu-ideaa, sillä suorituskyvyn parantamiseksi käyttäjän tallennettujen reittien pohjalta laskettiin erillisessä prosessissa avoimen datan pohjalta maantieteelliset alueet reittilistaukseen. Olin myös erityisen ylpeä puhelinsovelluksen pienikokoisista AES-salatuista paikannuspaketeista, sekä WebSocket-pohjaisesta web-näkymästä. Kaiken tämän myötä viive oli todella pieni, ja kokonaisuus paljon edellä mitään tuntemaani kaupallista tuotetta. Järjestelmä olisi tukenut myös salattujen paikannuspakettien vastaanottamista yksisuuntaisen radiolinkin yli. Ja se on myös niin vakaa, että on vieläkin minulla satunnaisessa käytössä, eikä ole tarvinnut minkäänlaista ylläpitoa vuosien aikana.

Trackerin myötä peliaiheet eivät kuitenkaan aivan täysin korvaantuneet. Olen pitkään käynyt vuosittain Finnish Game Jam -tapahtumassa tekemässä viikonloppupeleja, ja sitä kautta tutustuin Unityyn, joka on siis C# pohjainen pelinkehitystyökalu. Tähän liittyen minulla oli aiemmin Pythonin lisäksi ollut kokemusta myös Javasta ja C/C++, ja C# vaikutti olevan kaikin puolin parempi versio Javasta, mahdollistaen kuitenkin paljon muutakin.

Lopulta päädyin testailemaan Unityä siihen omaan avaruus-ikuisuusprojektiini. Mutta Unityn paradigma ei vaan ollut yhteensopiva kanssani. En siis päässytkään kovin pitkälle, mutta rakastuin lopulta itse kieleen. Kun .NET Coresta sitten julkaistiin ensimmäinen versio, niin huomasin, että siitä olisi myös korvaaja geventille. Käytin myös paljon aikaa hajautetun Akka.NET-aktorijärjestelmän opetteluun, mutta se ei lopulta vastannut tarpeitani. Sattumalta näihin samoihin aikoihin myös pitkään kestänyt työprojekti käytti C#-kieltä backend-ohjelmointiin, ja sitä kautta tuli oikeastaan saturoiduttua backend-devauksesta varsin pitkäksi aikaa.

Nyt tässä välissä olen sitten kuitenkin tehnyt monenlaista pientä sälää ennen kaikkea verkkoasioihin ja vähän devopsiinkin liittyen, mutta nyt lopulta mielenkiinto on taas ainakin joksikin aikaa palannut peleihin, ja tuohon omaan avaruusteemaiseen ikuisuusprojektiin. Nimittäin marraskuussa sattumalta törmäsin Silk.NET nimiseen kirjastoon, joka suorastaan ennenkuulumattoman laadukkaasti tarjoaa suorituskykyiset bindingit eri grafiikkakirjastoille .NET ja C# maailmaan. Paluu juurille. Ja pakkohan sitä oli kokeilla.

Nyt minulla on sitten kasassa taas yksi iteraatio pelistäni, uusilla hienoilla tekniikoilla. Vaikka kyseessä onkin taas yksi tyhjästä uusiksi kirjoitus, niin tässäkin tapauksessa seison omilla hartioillani ja pyrin hyödyntämään kaikkea oppimaani. Toisaalta kuitenkaan myöskään unohtamatta tutuksi tullutta uusien asioiden kokeilua ja aiemmin mainitsemaani itse tekemistä. Paras tapa oppia käyttämään pyörää kun on keksiä se uusiksi. Tietää sitten, että mitä se onkaan oikein vaatinut.

Tähän, kuten noihin vanhojen aikojenkin pelinkehitykseen liittyy eräs sanonta. Vapaasti suomennettuna se menee jotakuinkin näin: Opeta tyyppi tekemään peli, ja hän tekee pelin. Opeta tyyppi tekemään pelimoottori, ja hän ei enää eläessään saa peliä valmiiksi.

Tykkään tehdä pelimoottoreita. Pelimoottoria tehdessä pääsee soveltamaan koko oman osaamisen kirjoa niin kattavasti. Se vaan tuntuu kivalta ja stimuloivalta. Mutta tästä huolimatta yllätyksekseni minulla onkin tässä käsissäni jotain, joka voisi ehkä oikeastikin olla joku päivä ihan oikea peli! Vaikka olenkin tehnyt paljon moottoripuolen asioita, niin olen myös kirjoittanut paljon alustariippumatonta ja varsin puhdasta koodia pelin eri järjestelmiä varten, ja sekin puoli näyttää ihan hyvältä. Yllättävän hyvältä.

Ja nyt tuntuu siltä, että ehkä minulla on käsissäni jotain, joka voisi oikeasti olla joskus jopa kaupallinen tuote. Tai vaikka en koskaan sinne asti pääsisikään, niin tässä tuntuu olevan jo sen verran paljon kaikkea, että olisi kiva jakaa edistystä, ja tosiaan myös sitä, mitä tämän kokonaisuuden koodaamiseen kuuluu.

* * *

Siitä en tosin ole ollenkaan varma kuinka pitkäikäiseksi tämä videosarja tulee osoittautumaan, ainakaan tämän peli-iteraation osalta. Mielenkiinnon kohteillani on paha tapa vaihdella, ja muita kiinnostavia aiheita olisi esim. kotiautomaatio, sekä sulautettu C# WildernessLabsin Meadow-alustan muodossa. Niitä nimittäin löytyy parikin kappaletta hyllystä. Instagram- ja Twitter seuraajat ovatkin jo jotain esimakua saaneet. Olisi myös kiva joku päivä palata Guild Wars 2:n MMO-maailmaan. Pitäisi vaan osata löytää joku kiva tasapaino checklist-pelaamisen sekä "aidon" ja sosiaalisen pelaamisen väliltä. Alkuvuodesta siihen olisi tulossa uusi lisäri, että silloin viimeistään. Ja nyt oikeastaan ennen kuin sain tämän videon valmiiksi asti, niin palasinkin pelin pariin rastittamaan niitä ruutuja. Mutta raiditkin ovat varsin lähellä!

Mutta tällaisia aiheita tällä kertaa. Ensi videossa pyrkinen vähän esittelemään tuon uusimman avaruuspelini teknistä alustaa, ja yleisesti muutenkin vähän sitä, että missä mennään. Tämän jälkeen vuorossa voi hyvinkin olla lopulta varsinainen devaus-video, jossa teen jotain uutta kanssanne. Toisaalta minua vähän kutittaisi koodailla pieni kaksisuuntainen aputyökalu OBS:n ohjaamiseen MIDI-ohjaimen avulla ennen näitä, tai jotain muuta vähän pienempää.

Joka tapauksessa: nähdään seuraavalla videolla. Kukaan meistä ei vielä tiedä mitä se pitää sisällään, tai milloin se tapahtuu!