Oppitunti 19 - Board Manager

Tällä oppitunnilla pääsemme koodaamaan. Tarkoituksena on rakentaa niin sanottu board manager eli pelikentän hallintatyökalu. Roguelike-peleissä pelikentät generoidaan tiettyjen parametrien mukaan eli käytännössä ohjelma rakentaa eli generoi uuden kentän aina, kun pelaaja siirtyy seuraavaan kenttää. Kentän hallintatyökalun tekeminen on muutenkin hyödyllistä, sillä se opettaa kuinka tehdään esimerkiksi koordinaatistoja sisäkkäisillä silmukoilla. Tällaisilla sisäisillä silmukoilla pystytään toteuttamaan esimerkiksi shakkilauta tai tehdä kenttiä tasohyppelyyn. Sisäiset silmukat ovat yksi ohjelmoinnin perustekniikoista.

Tällä oppitunnilla tulee paljon koodaukseen liittyvää sanastoa, joten kertaus on paikallaan. Lausekielinen ohjelmointi on sikäli armollista, että usein peruselementit, kuten ehtolauseet, loogiset operaattorit ja silmukat ovat kielestä toiseen melko samanlaisia. Ainoa mikä yleensä muuttuu on niin sanottu syntaksi eli se miten asiat tulee kirjoittaa.

 

Tässä esimerkki C#:lla kirjoitetusta listasta:

 

using System;

 

//Luomme taulukon “arvoja”, jonka tyyppi on int ja sen alkioihin

//tallennetaan arvot 1, 2, 3, 4 ja 5

int[ ] arvoja = new int[ ]{1, 2, 3, 4, 5};

 

Listan arvot ovat kokonaislukuja eli ne eivät ole esimerkiksi liukulukuja, kuten 0.1, 2.4 tai 49.5. Listaan syötettyjä arvoja kutsutaan indekseiksi. Vaikka listan luvut ovat 1, 2, 3, 4 ja 5, niin niiden indeksi numerot ovat 0, 1, 2, 3, 4. Toisin sanoen, jos haluamme numeron 3 listasta, niin se löytyy indeksinumerolla 2.

 

Tällä oppitunnilla tulemme myös käyttämään satunnaisuutta ja sisäisiä for-silmukoita. Kiinnitä erityistä huomiota koodin kommentoitiin ja muista kommentoida myös omaa koodiasi. Kommentointi tapahtuu // -merkeillä.

 

Tehtävä 1 - Scriptien teko

 

1. Luo Assets kansioon kansio nimeltä Scripts

2. Luo Scripts kansioon kaksi scriptiä. Helpoiten tämä tapahtuu menemällä kansioon ja valitsemalla hiiren oikealla näppäimellä Create -> C#-Script

3. Anna ensimmäisen scriptin nimeksi BoardManager ja toisen scriptin nimeksi GameManager

4. Valitse yläpalkista GameObject -> Create Empty

5. Anna uudelle peliobjektille nimeksi GameManager

 

Tehtävä 2 - Board Manager koodin kirjoittaminen

 

Board manager scripti luo uuden kentän aina, kun pelaaja astuu siihen edellisestä kentästä. Lue erityisen huolella kommenteissa oleva sisältö, jotta ymmärrät mitä koodissa tapahtuu.

 

1. Avaa BoardManager scripti Visual Studiossa tai Visual Studio Codessa

2. Lisää seuraavat nimiavaruudet (namespace) koodiin kirjoittamalla using ja nimiavaruuden nimi:

3. Luo BoardManager luokka, johon tulee Count funktio

4. Luo muuttujat ja listat, joilla peliobjektit laitetaan ruudulle. Lista luodaan samaan tyyliin kuin Pythonissa eli käyttämällä hakasulkeita [ ]

Tehtävä 3 - Ulkoseinät ja lattia

 

Seuraavaksi luomme alustetun listan. Huomaa, että tässä käytämme kahta sisäkkäistä for-silmukkaa. For-silmukkoja on käytetty myös Pythonissa, mutta C#-kielessä ne toimivat C-kielen syntaksin tavoin.

 

For-silmukka toimii seuraavalla tavalla. Int x = 1 alustaa kokonaislukumuuttuja x:n yhdeksi. Tämän jälkeen tehdään vertailu, jossa x on pienempi kuin columns - 1. Columns on ylempänä alustettu kahdeksaksi. Lopuksi lisätään x:n yksi ja tehdään silmukka niin monta kertaa kuin x < colums - 1 ehto täyttyy. Kun ehto ei enää täyty eli x on suurempi kuin columns - 1, silmukka pysähtyy.

Pelissä kahdella sisäisellä silmukalla tehdään niin sanottu gridi eli ristikko, ruudukko tai taulukko. Ensimmäinen silmukka luo sarakkeet ja toinen luo rivit. Tilanne hahmottuu paremmin katsomalla alla olevaa kuvaa. Kentässä on 6x6 kokoinen generoitu alue, jossa on esteitä ja zombie. Alue on 6x6 kokoinen sen takia, että hahmon on joka kentästä päästä Exit-kyltille siirtyäkseen seuraavaan tasoon. Jos otetaan mukaan vielä alue, jossa pelihahmo on, niin gridin koko on 8x8. Pelistä voisi tehdä myös sellaisen, että esteitä generoituisi koko alueelle, mutta tällöin syntyisi myös kenttiä, joita olisi mahdoton läpäistä.

 

Syy miksi for-silmukassa lukee columns - 1 johtuu siitä, että aivan niin kuin Pythonin listoista ensimmäinen indeksi on 0, eikä yksi. Jos siis halutaan tehdä esimerkiksi 8 numeroa pitkä lista, niin sen indeksinumerot ovat 0, 1, 2, 3, 4, 5, 6, 7.

1. Tee kahdella for-silmukalla gridi

2. Tee BoardSetup-funktio. BoardSetup luo pelikenttään ulkoseinät ja lattian.

Tehtävä 4 - Sisäseinät, viholliset ja kerättävät objektit

 

1. Tee ensin RandomPosition-funktio, joka palauttaa Vector3 arvon.

2. Tee LayoutObjectAtRandom-funktio, joka asettaa peliobjektit paikalleen

Tehtävä 5 - Level editor

Pelissä on useampia tasoja ja tasosta toiselle pääsee menemällä siihen ruutuun, jossa on Exit-kyltti. Exit-kyltti tulee olemaan aina oikeassa yläkulmassa. Pelaajan etenemistä vaikeuttavat vastustajat, jotka lisääntyvät sitä mukaan mitä pidemmälle pelaaja pelissä etenee.

 

1. Tee SetupScene-funktio

2. Tulkkaa koodi painamalla Unityssä Play-nappia. Luomasi BoardManager scripti ei tee vielä mitään ilman seuraavalla tunnilla tehtävää GameManager-scriptiä, mutta tarkista, että koodi on oikein eli vasemmassa alakulmassa ei ole ilmoituksia syntaksivirheistä tai muista.

Suomen Tiedekoulu Oy