soodan sivut

arkisto

237 kirjotelmaa.

avainsanat

Koodattiin kolmistaan prototyyppi eräästä suomalaisesta klassikkopelistä I've bot some balls tuossa jokin aikaa sitten. Piti tiivistelmöidä siitäkin mutta tietysti unohtui. Tämän viikonlopun visiitti Instanssi-demopartyille muistutti kuuden viikon takaisesta värkkäysviikonlopusta, jonka aikana peliproto puljattiin likimain valmiiksi. Tässä siitä projektiraportti, vaikka onkin malliesimerkki hätäisestä protokoodista kun piti tehdä proto.

Otaniemessä järjestettiin toistamiseen GGJ:n saitti koska FGJ. Global Game Jam on pelihackathonviikonloppu, ja vaikkei palkintoja virallisesti jaeta niin Suomen osasto (Finnish Game Jam) on aiemminkin kunniamaininnut joitakin pelejä (huomattavasti jälkikäteen). Meille tapahtuma oli tekosyy saada puuhasteluvirtaa. FGJ17 järjestettiin 20.-22.1. ja Otaniemen saitti sijaitsi Startup Saunan tiloissa. Osallistujia oli vajaa sata. Olin tällä kertaa puoliksi järkkäämässä ja puoliksi jammaamassa, kun viime vuonna olin osa järjestäjäporukkaa (by DOT ry).

Tehtiin Wavy Balls (lähdekoodi kaikkineen Githubissa). Vuoden GGJ-teema oli aalto (julkistettiin perjantaina jamien alussa), ja nimi valittiin hätähousuillen kun projektit piti muka rekisteröidä ajoissa. Alkuperäisessä I've got some ballsissa on siis ideana ohjata kuulaa varsin epäsäännöllisten kenttien läpi, hyppiä tasolta toiselle, ja kerätä timantteja. Jokainen meistä kolmesta (koodissa mukana cyndis ja Jontte) oli pelannut tuota klassikkoa joskus muinoin. Vähän huijattiin ja tavattiin pari kertaa ennen hackathonviikonloppua jotta idea löytyisi (aluksi haluttiin vain osallistua) ja lisäksi sitten ohjelmoitiin engine alkuun kun likimain kaikille muille oli kuitenkin peliengine tarjottu valmiina ja itse haluttiin nimenomaan enginöidäkin. Viikonloppuna tehtäisiin itse peliä, niinkuin kaikki muutkin osallistujat.

Jutun jujuhan oli että tahdottiin tekosyy naputella Rustia ja värkätä 3d-graffaa. Itselle oli vielä vähemmän tuttu kieli käytännössä, vaikka teinkin advent of codea ja erästä hyvin keskeneräistä pikkuprojektia harjoituksen vuoksi. Ensin kokeiltiin fysiikkaan nalgebran kanssa pelaavia ncollidea ja nphysicsiä mutta erikoiset fysikaaliset epästabiilisuudet ajoivat purkkaamaan ODEn käyttöön, vaikka se onkin C:tä eikä Rustia - kunnon wrapperilibiä ei ehtinyt tehdä, joten tuli kauheaa sotkua kun unsafe-koodia piti tunkea kaikkialle kun interfacettiin oden C-APIn kanssa suoraan. Rustin FFI on kyllä mainio sinänsä, etteivät itse funktiokutsut vaatineet juurikaan kurjuutta.

Pohjana käytettiin cyndisin jotain aiempaa peliä mainloopgraffarungolla ja simppeliä objuloaderia. Ikkunamankelointi menee SDL:n kautta ja graffalle on Glium. Glium on mainio ja peittää OpenGL:n vaatimat sadetanssit hienosti. Täytyy tehdä itse vielä joku isompi juttu sitä käyttäen. SDL2 osaa myös äänet. Äänieffuihin tehtiin kikka jotta niitä voisi filtteröidä lennossa, vaikka filtteröintiä ei juurikaan käytetty lopulta muuhun kuin yksittäisen effun äänenvoimakkuteen, koska aika. Oli suunnitelmissa muokata äänen taajuutta kollision nopeuden funktiona yms. mutta eipä ehditty. Tuo kikka lienee ainakin osasyynä siihen, että peli todennäköisesti segfaulttaa kun sen sulkee. Ehkä jokin resurssi vuotaa ja/tai suljetaan ennenaikaisesti, kun itte tein FFI-laajennuksen äänieffucallbackeille.

ODE osoittautui ihan mainioksi ja cyndis rupesikin tunkkaamaan sille kelvollista Rust-wrapperia. Käyttämämme fysiikka ei ollut juurikaan kovin monimutkaista (törmäyksiä maastoon, timantteihin, ja liikkuviin asioihin joita ei ehditty viimeistellä). Pallo saa vauhtia maan kitkasta kun ohjaus aiheuttaa sille pyörimismomenttia. Lopputunteina venkslattiin myös aiemmin implementoitu ilmassa liikkuminen takaisin kun se oli oleellista pelimekaniikan kannalta vaikkei fysiikan lakien mukaista.

Ohjata voi myös peliohjaimella eikä vain näppiksellä. SDL:lle on käsittääkseni jonkinlainen näppärä tietokanta mäppäämään kaikki maailman usbiin menevät pleikkariohjaimet vakionapeiksi. Opin että moderneissa PS3-ohjaimissa jopa napeissa, ei vaan tateissa, on analoginen outputti - tunnistavat paineen, joten hätäiseen painallukseen voi reagoida pelissä jotenkin. Siistiä. Vehje näkyy tosimoniakselisena joystickinä.

Maasto piirretään Blenderillä tai sitten generoidaan heightmapista. "Lopullisessa" versiossa käytettiin heightmappia josta tehdään kolmiosoppaa. Alkuperäisestä pelistä tämä peli eroaa siinä, että GGJ:n aalto-teeman inspiroimana pelihahmopallo aiheuttaa maastoon aaltorintama-displacementin eli perässä vyöryvän vuoren, jota voi käyttää apuna mm. erilaisten jyrkänteiden yli kiipeämiseen. Juurikin tämän featuren värkkääminen oli monimutkaisinta ohjelmoida; parin kokeilun jälkeen kun huomattiin että se onnistuu niin Jontte kirjoitti koko homman parin yrityksen jälkeen todella toimivaksi viimeisenä yönä. ODE tukee juuri tähän sopivia korkeuskarttoja.

Renderöinnissä ei ole mitään kovin erikoista. Tehtiin tuki shaderien livekoodaukselle mutta sitä ei ehditty käyttää mihinkään kummempaan. Pallo on hiukkasen läpinäkyvä mikä auttaa pelattavuudessa. Maastoon tulee varjo pallon alle tolkuttoman yksinkertaisella projisoinnilla, ja devauksen aikana ihmeteltiin phantomvarjoja kaikissa muissakin objekteissa kuin maastossa. Samaa shaderia käytettiin niihinkin ja siinä oli bugi. Taustalla on cubemappi koristamassa maaston ulkopuolisia pikseleitä. Cubemapin reunoja vaivasi pienet mustat saumat kunnes eroteltiin mappi useaksi kuvaksi ristilipputekstuurin sijaan.

Pelin kehittyessä vauhtikoodiviikonloppuna cce lupautui irkissä tekemään pelin taustamusiikin ja ääniefektit, ja hienot tekikin. Eräs Erkka Erävala mallinsi meille objuja joista ehdittiin ottaa käyttöön poimittava timantti. Piti tukea myös liikkuvia hammasrattaita sun muuta jännää. Ehkä myöhemmin.

Tykkään Rustista. Töissä tulee murehdittua usein sitä, miten helppoa C:llä on tehdä pidemmän päälle mahdotonta sotkua ja/tai erittäin haurasta koodia, etenkin kun on moniajosta ja kernelikoodista kyse, ja miten paljon Rustin kaltainen käännösaikamagia estäisi kurjuuden jo ennen sen syntymistä. Tätä peliprojektia ei sellaisenaan jatketa mihinkään koska koodi on jatkokehityskelvotonta, mutta uuden voisi koodata puhtaalta pöydältä kunnollista ode-wrapperia käyttäen ja ilman aaltopelleilyä ja enemmän alkuperäistä peliä mukaillen.

0 kommenttia

Oma kommenttisi

Mielipide tämän sivun asiasta? Kirjoita toki. Älä raapusta kuitenkaan ihan asiattomia juttuja.

Jos on yksityisempää asiaa, tarkkaa kysyttävää tai aihetta pidemmälle keskustelulle, käytä yhteydenottolomaketta kommentoinnin sijaan.

Hölmöt kommentit saatetaan moderoida pois jälkikäteen.

Nimimerkki:

Spammibottiesto: Mikä on yhdeksän ja kahden summa? (vastaus numeroina)