Painovoiman ja törmäyksen simulointia GDevelop5-ohjelmassa
GDevelop on ilmainen avoimen lähdekoodin pelikehitysympäristö. Pelien lisäksi GDevelop-ympäristöä voi käyttää erilaisten fysiikan simulaatioiden tekemiseen. Tässä artikkelissa tutustumme GDevelop-pelikehitysympäristössä fysiikan simulaatioon esimerkin avulla.
GDevelopin ensimmäinen versio julkaistiin vuonna 2008 ja se perustui C++-ohjelmointikieleen. C++-ohjelmointikieli muutettiin vuonna 2013 JavaScript-pohjaiseksi. Syy tähän oli se, että GDevelopista haluttiin alustariippumaton. Vuonna 2018 julkaistiin GDevelop5, versio, joka mahdollisti pelin kääntämisen useaan eri ympäristöön, kuten esimerkiksi PC-koneeseen, puhelimeen tai selaimeen. Vuonna 2023 mukaan lisättiin 3D-tuki. Koska kyseessä on avoimeen lähdekoodiin perustuva peliohjelmointiympäristö, se on saavuttanut suuren suosion pelikoulutusympäristönä peruskoulusta yliopistoon asti. Yksi syy suosioon on myös se, että pelin ohjelmointi tapahtuu luomalla ehtoja ja niihin toimintoja Tapahtumat-välilehdellä valmiista komentolistasta, eli varsinaista ohjelmointikielen osaamista ei tarvita. Kynnys aloittaa peliohjelmointi on siis matala. Pelkkä looginen päättely ja ohjelmallinen ajattelu riittävät.
Uusi peli aloitetaan seuraavasti:
- Mene Luo-välihdelle
- Valitse painike Luo uusi peli ja valitse Tyhjä projekti
- Luo uusi peli -ikkunassa valitse pelin koko, esimerkiksi Mukautettu koko W:800 H: 600. Anna projektille nimi, esimerkiksi Fysiikan simulaatio. Lisäksi voit valita tallennuspaikan, esimerkiksi GDevelop Cloud tai Tietokoneesi. GDevelop Cloud -tallennuspaikkaan voi ilmaiseksi tallentaa vain rajallisen määrä pelejä. Rajoituksen voi poistaa ostamalla ohjelmasta maksullisen version, mutta kun tallentaa omalle kovalevylle, rajoituksia ei ole. Pilvitallennukseen lisäksi tarvitset oman käyttäjätunnuksen. Kovalevylle tallennettaessa tätä rajoitusta ei ole.
- Lopuksi napsauta Luo uusi peli -painiketta.
Vasemmassa yläreunassa näet valikon, jossa on kolme viivaa. Tässä valikossa on pelin asetuksia, joita voit tarvittaessa käydä muuttamassa. Esimerkiksi kohdassa Ominaisuudet & Kuvakkeet on pelin asetuksia, joita jo peliä luotaessa kävit läpi. Kohdassa Kentät on pelisi kentän nimi, ja nimen voit tarvittaessa muuttaa kohdassa, jossa on kolme pistettä. Kun kaksoisnapsautat hiirellä kentän nimen päällä, siitä voi aukaista pelikenttää vastaavan välilehden. Joskus saattaa vahingossa nimittäin sulkea välilehden ja on hyvä tietää, mistä sen saa uudelleen auki.
Kun olet aukaissut pelikentän, ensimmäinen asia on lisätä peliin objekteja kohdassa Kenttäobjektit. Lisäämme plus-painikkeella peliin kolme Sprite-tyyppistä kenttäobjektia: PalloPunainen, PalloSininen ja Palkki. Näitä varten tarvitaan myös kolme PNG-bittikarttakuvaa, jotka olen piirtänyt valmiiksi Inkscape-vektorigrafiikkaohjelmalla ja tallentanut Export-komennolla. Pallon koko on 100 x 100 px ja palkin koko on 100 x 40 px.

PalloPunainen lisätään GDevelop-ohjelmassa seuraavasti
- Napsauta hiirellä sinistä plus-painiketta (Lisää objekti) kohdassa Kenttäobjektit.
- Valitse Sprite.
- Olet nyt Ominaisuudet-välilehdellä. Anna objektille kuvaava nimi, esimerkiksi PalloPunainen ja napsauta Tuo kuvat -painiketta, valitse kuva ja napsauta Avaa-painiketta.
- Mene Käytösmallit-välilehdelle ja paina Lisää käytösmalli -painiketta. Valitse 2D Fysiikkamoottori -käytösmalli (Physics2). Katso seuraavat kohdat: Type: Dynaaminen, Shape: Ympyrä, säde: 50. Paina lopuksi Käytä-painiketta.
Lisää samalla tavalla PalloSininen-objekti. Kun lisäät Palkki-objektin, valitse Käytösmallit -kohdassa 2D Fysiikkamoottori -käytösmalli. Katso seuraavat kohdat: Type: Staattinen, Shape: Laatikko. Paina lopuksi Käytä-painiketta. Huomio! Jos jätät leveys- ja korkeusarvot 0:aan, silloin käytetään kuvassa olevia kokoja. Pallot ovat dynaamisia eli pääsevät liikkumaan, sitä vastoin Palkki on staattinen eli on paikoillaan.
Nosta seuraavaksi palkkeja kohdasta Kenttäobjektit pelikenttään hiirellä raahaamalla ja suunnittele alla olevan kuvan mukainen pelikenttä (kuva 2). Lopuksi nosta yksi pallo pelikenttään, jolloin lopputulos näyttää seuraavanlaiselta.

Tee palkeista U:n muotoinen kouru siten, että alhaalla keskellä on suora kohta, nosta yksi pallo kourun keskelle yläpuolelle. Testataan aluksi pallon putoamista. Napsauta Esikatselu-painiketta, joka käynnistää pelin ja näet lopputuloksen Esikatselu-ikkunassa. Seuraavaksi muutamme 2D-Fysiikkamoottorin käytösmallin arvoja. Mene Kenttäobjektit-ikkunaan (kuva 1) ja napsauta PalloSininen-kenttäobjektin nimen oikealla puolen olevaa kolmea pistettä ja valitse avautuvasta valikosta Muokkaa objektia. Mene Käytösmallit-välilehdelle.

Käydään läpi 2D-Fysiikkamoottorin asetuksia. Kohdassa Tiheys on kappaleen tiheys. Mitä suurempi on tiheys, sitä painavampi on kappale. Kohdassa Gravity Scale on painovoima, joka vaikuttaa putoavaan kappaleeseen eli palloon. Arvolla 1 on normaali maassa oleva painovoima, jolloin kappale putoaa alaspäin kiihtyvyydellä 9,81 m/s2. Jos laitat Gravity Scale -arvoksi 2,5, se vastaa Jupiterin painovoimaa. Jos painovoima olisi 0, tällöin kappale pysyisi paikoillaan tai jatkaisi tasaista liikettä eteenpäin, jos siihen vaikuttaisi muita voimia eli pallo olisi tällöin painottomassa tilassa. Jos painovoima olisi –1, silloin kappale putoaisi ylöspäin. Kohdassa Kitka on kappaleen kitkakerroin, joka vaihtelee normaalisti välillä 0–1. Nolla tarkoittaa, että kappaleella ei ole kitkaa ja yksi tarkoittaa maksimaalista kitkaa. Jos kitkakerroin on yli yhden, kyseessä on silloin ns. liimapinta. Negatiivista arvo kitkakertoimella ei ole.
Restitusio tarkoittaa tässä kimmoisuutta eli käytännössä sitä kuinka korkealle pallo pomppaa. Kun arvo on 1, kyseessä on täysin kimmoinen törmäys eli hyötysuhde on tällöin 100 %. Kun arvo on 0, kyseessä on täysin kimmoton törmäys eli hyötysuhde on tällöin 0 %. Realistinen arvo olisi esimerkiksi 0,9, jolloin pomppiminen pikkuhiljaa vaimenee. Jos taas laitat arvon 1,1, pallo pomppaisi joka kerta vähän korkeammalle kuin aikaisemmin ja lopulta ulos pelinäkymästä. Lineaarinen vaimennus tarkoittaa vaakasuuntaista liikkeen vaimennusta. Arvolla 1 kappale pysähtyy vaakasuunnassa nopeasti. Arvolla 0 taas vaimennusta ei ole eli kappale jatkaa vaakasuunnassa eteenpäin. Kulmavaimennus vaimentaa kappaleen pyörimistä eli vastaavasti arvolla 1 kappaleen pyöriminen loppuu nopeasti, mutta arvolla 0 kappale jatkaa pyörimistä. Laita kuvan 3 mukaiset arvot palloon ja katso mitä tapahtuu eli käynnistä peli Esikatselu-ikkunaan. Pienennä nyt Restitusio-arvoa hieman ja katso miten pallo nyt käyttäytyy.
Muutetaan pallon paikkaa eli nostetaan se pelinäkymän keskeltä sivulle. Aluksi voit pudottaa pallon reunaa pitkin samoilla 2D-Fysiikkamoottorin arvoilla kuin kuvassa 3.

Huomasit, että pallo ei nyt pyörinyt vaan pelkästään liukui reunaa pitkin. Jos palikoiden vaihtumiskohdat olivat liian teräviä, niin pallo vielä pomppasi siitä. Kuinka pallo saadaan pyörimään? Yksinkertaisesti siten, että kasvatetaan kitkakerroin yli nollan, esimerkiksi arvoon 0,1. Kun pallo nyt päästetään irti, se pyörii ja lopputulos on realistisempi eli lisäksi huomaat, että pallo ei nouse yhtä korkealle kuin vapaan pudotuksen tapauksessa. Kitkan lisääminen reaalimaailmassakin muuttaa osan liike-energiasta lämmöksi eli tällöin kappaleen liike-energia pienenee, kun se liukuu ja/tai pyörii reunaa pitkin. Saman voit havaita nyt tässä simulaatiossa. Kun laitat kitkakertoimen arvoon 1, silloin pallo tekee pelkästään pyörimisliikettä eli liukumista ei enää tapahdu ollenkaan. Kun lisäksi nyt laitat Restitusio-arvon nollaksi, pallo lopettaa mahdollisen pomppimisen. Muuta arvoja ja tutki mitä tapahtuu. Olen piirtänyt palloon ristin, jotta on helppo havaita milloin pallo pyörii ja milloin ei.
Kokeillaan nyt lisätä pelinäkymän oikeaan reunaan toinen pallo.

Kahden pallon törmäyksessä pidä Kitkakerroin arvossa 1, molemmissa palloissa. Kun sinulla on Restitusio-arvo 0 molemmissa palloissa, kyseessä on kahden pallon kimmoton törmäys eli käytännössä pallot jäävät silloin keskelle törmätessään toisiinsa. Kun laitat Restitusio-arvon 1:een, tapahtuu täysin kimmoinen törmäys ja pallot pomppaavat takaisin. Nyt kannattaa kokeilla seuraavaa. Muuta sinisen pallon Tiheys-arvo 2:ksi tai jopa suuremmaksi. Kun pallot törmäävät, punainen pallo saa suuremman nopeuden. Jos Tiheys-arvo sinisessä pallossa on tarpeeksi suuri, punainen pallo pomppaa tällöin pois pelinäkymästä.
Kuten nämä muutamat esimerkit havainnollistavat, pelin tekijän pitää ymmärtää fysiikkaa. Toisaalta peliympäristössä tehdyllä simulaatiolla voidaan myös havainnollistaa fysikaalisia ilmiöitä. Kun itse pääsee muuttamaan simulaation käytösmallien arvoja ja kappaleiden paikkaa pelinäkymässä, se tekee hommasta mielenkiintoisen ja on täysin verrattavissa fysiikan kokeelliseen työskentelyyn.
Jos joku miettii, kuinka itse voisin tehdä ja julkaista fysiikan simulaatioita, niin helppo lähestymistapa tähän on tutustua GDevelop-peliohjelmointiympäristöön. MAOL ry on julkaissut jäsenetuna tähän paljonkin ohjeita, jotka löytyvät täältä:
https://maol.fi/materiaalit/gdevelop-peliohjelmointia/
GDevelop5-peliohjelmointiympäristöön pääset tästä: