perjantai 13. joulukuuta 2013

Seitsemäs tunti: Tasohyppelypelin täydentäminen

Pareton-periaatteen mukaan ensimmäinen 80 % työstä saadaan tehdyksi 20 %:ssa ajasta. Viimeistelyyn, eli viimeiseen 20 %:in, kuluu 80 % työajasta. Tämä on suurinpiirtein totta myös tässä pelissä. Hahmon liikuttelun ja perustoimintojen tekemiseen ei mene paljoakaan aikaa, mutta visuaalinen hiominen on erittäin hidasta homma.

Tässä käyn läpi muutaman esimerkkinä tekemäni idean. Oppilailla oli vapaat kädet tehdä mitä halusivat  ja suurin osa tunnistani kuluikin visioiden suunnitteluapuna tai vikojen syiden etsimiseen. Hour of Code-sivustolta löysin hyvän periaatteen. Kohdatessaan koodiin liittyvän ongelman he kysyvät ensin kolmelta oppilastoveriltaan ja vasta sen jälkeen opettajalta. Tällä tavoin oppilaat joutuvat myös tulkkaamaan kavereidensa tekemiä koodeja, joka on yllättävän haastavaa isolle osalle. Ilmeisesti oman skriptin logiikka on itsestään selvä, koska sen on itse päätellyt ja tehnyt, mutta hivenen toisenlainen logiikka ei meinaa heti aueta ja nopea turhautuminen vie innon auttamiselta. Tämä tapa olisi pitänyt ottaa käyttöön heti aluksi.

Sitten esimerkkeihin.

Teen neljänteen kenttään kaksi liekkiä, joihin osuessaan kissa palaa ja siirtyy aloituskohtaan. Animoin liekit siten, että ne suurenevat ja pienenevät tasaisin väliajoin.

Kun esiintymislava vaihtuu neljänneksi, skripti lähettää "neljäs kenttä"-viestin. Viestin avulla piilotetaan edellisen postin lopussa liikkuneet palkit ja aloitetaan liekkien skriptit.


Teen uuden hahmon. Piirrän liekin, kopioin sen ja muutan sitä hivenen. Nämä kaksi ovat nyt pienen liekin animoitu versio. Kopioin liekin taas ja piirrän siitä reilusti suuremman version

Tarkoituksena on, että liekki roihuaa pienenä ja välillä leimahtaa isommaksi. Kissa voi hypätä liekin yli vain silloin, kun liekki on pieni.




Koska liekki on hahmo, sitä ohjataan sen omilla skripteillä. Haluan liekkien näkyvän vasta neljännessä kentässä, joten ne varmuuden vuoksi piilotetaan vihreää lippua painettaessa. Kun kenttä vaihtuu neljänneksi, esiintymislava lähettää viestin "neljäs kenttä". Tämä aloittaa liekkien animointiskriptin. Ensiksi liekki muutetaan näkyväksi. Isoa ja pientä liekkiä on kaksi erilaista. Pieni liekki vaihtaa asua viisi kertaa, jonka jälkeen iso liekki vaihtaa asua kaksi kertaa. Pieni liekki on siis näkyvissä kaksi ja puoli kertaa niin kauan kuin iso liekki.


Haluan kissan kupsahtavan vähän eri tavoin liekistä. Haluan sen muuttuvan mustaksi ja pomppaavan korkealle. Ensin teen kopion kissasta ja maalaan sen oranssit kohdat mustiksi.

Teen uuden skriptin liekkikuolemaa varten. Olen käyttänyt punaista väriä vain liekissä, joten käytän sitä aloittamaan tämän skriptin. Tuohon voisi laittaa myös "Koskettaako hahmoa X tai koskettaako hahmoa Y", jolloin X ja Y olisivat liekkihahmojen nimet.

Kun hahmo koskettaa punaista väriä se vaihtaa asua mustaksi kissaksi ja pomppaa ylöspäin. Lisäsin perään sekunnin odotuksen, jottei hahmo pysty ohjaamaan lennon aikana. Tämän jälkeen hahmo siirretään aloituskohtaan ja asuste vaihdetaan takaisin kissan asuksi.

Seuraavaksi tehdään laskuri kissan elämille. Alussa kissalla on viisi elämää, jotka vähenevät yhdellä jokaisen kuoleman jälkeen. Teen uuden hahmon, joka toimii laskurina. Piirrän sille kuusi asua, jotka ovat jäljellä olevien elämien määrä tukkimiehen kirjoituksella ja viimeisenä "Peli loppui"-teksti.

Joka kerta, kun kissa osuu liekkiin tai putoaa alas, skripti lähettää viestin "Kuolema".


Jäljellä olevien elämien skripti alkaa "Kuolema"-signaalista. Kun "Kuolema" vastaanotetaan, laskuri vaihtaa seuraavan asusteen. Ohjelma pysäyttää kaiken, kun saavutetaan kuudes asu eli "Peli loppui".


Oppilaat lisäsivät kenttiinsä kolikoita ja rinnakkaisia bonuskenttiä. Pienet ES-tölkit kasvattivat kissaa tai kasvattivat sen nopeutta. Hauskin hahmo oli Scratch-kissa, joka oli puettu Super Marion vaatteisiin ja viiksiin. Aika oli rajoittavana tekijänä, sillä kenttiä tarvittaisiin reilusti yli kymmenen, jotta peli pysyisi mielenkiintoisena. Nyt nopeimmat saivat aikaiseksi vähän yli kymmenen kenttää, jotka pelaa läpi parissa minuutissa. Idea kävi kuitenkin kaikille selväksi ja tekeminen oli hauskaa. Ohjelmointiin tuli kerrankin paljon toistoa, kun samoja hahmoja pystyi käyttämään useissa eri kentissä ja vain niiden ohjaus ja sijoitus vaihtelivat kentän mukaan.

Jälkikäteen ajateltuna tämä olisi ollut tehokkaampi harjoitus esim. neljän hengen ryhmien ryhmätyöskentelynä. Kaikki olisivat ensin yhdessä suunnitelleet juonen, sitten massatuottaneet kenttiä ja vihollisia itsenäisesti. Tällöin valmiin tuotoksen pelattavuus olisi ollut huomattavasti parempi. No, ehkäpä ensi kerralla sitten.

maanantai 2. joulukuuta 2013

Kuudes tunti: Tasohyppelypelin aloittaminen

Tasohyppelypelit, kuten Super Mario, ovat jonkun verran pois muodista, mutta jokainen oppilas kuitenkin tuntee genren. Teemme ensimmäisellä kaksoistunnilla perusteet liikkumiselle, putoamiselle ja kentän vaihtumiselle. Viikon päästä lisätään kenttiä, taustakuvia, kävelyanimaatioita ja muuta sen sellaista.

Härkää sarvista ja aloittamaan.

Aloitan kentästä. Koska kyseessä on tasohyppely, piirrän kissalle ... tasoja. :) Ideana on kävellä ja hyppiä kentän vasemmasta laidasta oikeaan, jolloin kissa pääsee seuraavaan kenttään.


Kissa on perusasetuksilla jättimäinen tällaiseen peliin, joten pienennän sitä reippaasti


 Nyt kissa on suurinpiirtein oikeassa mittakaavassa kenttään nähden.


Sitten ryhdytään rakentamaan kissan liikuttelua. Oikea-vasen -liikuttelu tehdään samalla tavalla kuin rallipelissäkin. 


Haluan kissan putoavan alaspäin, joten pystysuuntaisen liikkeen aikaansaamiseksi teen uuden muuttujan.



"y vel" tulee sanoista Y velocity, eli pystysuuntainen nopeus. Ohjelmaan rakennetaan "painovoima", joka muuttaa pystysuuntaista nopeutta koko ajan. Kissa siis kiihtyy alaspäin mennessään. Kissan nopeus siis. ;) Skriptiä luetaan jatkuvasti ja joka kerta alaspäin suuntautuva nopeus kasvaa 0,3 askelta (toisin sanoen ylöspäin suuntautuva nopeus pienenee 0,3:lla askeleella eli se kasvaa -0,3 askelta). Ohjelma muuttaa hahmon y-sijaintia muuttujan y vel verran.


Jos nuolta ylöspäin painetaan, ylöspäin suuntautuva nopeus muuttuu 5:ksi. Vaikka se muuttuu 5:ksi, se lähtee pienenemään heti ja hetken päästä kissa alkaa taas pudota. Nuoli ylös saa siis aikaan hypyn.


 Kissa putoaa nyt kaikkien palkkien läpi, joten hahmolle pitää kertoa jotenkin minkä päällä voi seistä. Eli kissan koskettaessa mustaa väriä (tasoissa) putoaminen pysäytetään.


Kissan ylöspäin suuntautuvassa liikkeessä on kyse ennemminkin lentämisestä kuin hypystä, sillä kissa suuntaa kulkunsa ylöspäin riippumatta siitä, onko sillä jotain mistä ponnistaa vauhtia. Lisätään hyppykomentoon ja-lause, johon laitetaan hypyn onnistumisen ehdoksi mustan värin koskettaminen ja nuolinäppäimen painaminen.


Kissan pitäisi ilmestyä takaisin aloituskohtaan, kun se on pudonnut rotkoon. Muuten kenttää ei voida kokeilla uudelleen. Tämä tehdään jos-lauseella, joka aktivoituu hahmon pudotessa tietyn korkeuden alapuolelle. Kun y-sijainti on haluttua pienempi, lause nollaa nopeuden ja siirtää hahmon aloituskohtaan.


Tämänhetkisellä koodilla kissa kulkee tasojen läpi. Tämä ei ole toivottavaa ja se pitää saada estettyä jotenkin. Tämän voisi tehdä muuttujallakin, mutta tässä esimerkissä käytetään negaatiota eli ei-lausetta. 


Tasojen alareunat maalattiin ruskeaksi ja liikuttelun ehtoihin laitetaan ja-lauseen sisään nuolinäppäimen painaminen ja ei-ruskean koskettaminen. Tämä tarkoittaa siis sitä, ettei hahmoa saa liikutettua sivusuunnassa mikäli se koskettaa ruskeaa väriä.


Nyt kaikki alkaa olla hienosti. Kentän oikeasta reunasta pitäisi päästä seuraavaan kenttään, joten tehdään sinne samantyyppinen rajaus kuin y-suunnallekin. Jos hahmo menee tiettyä x-koordinaattia pidemmälle, se siirretään aloituskohtaan. Samalla skripti lähettää "Seuraava kenttä"-viestin.


Esiintymislavan täytyy olla ensimmäinen kenttä, kun peli aloitetaan. Kun sitten vastaanotetaan "Seuraava kenttä"-viesti, vaihdetaan tausta seuraavaksi.


Taustakuvissa pitäisi aloituskohdan olla aina samalla korkeudella. Tällöin ei tarvitse säätää putoamiskuolemalle ja seuraavan kentän aloitukselle mitään taustakohtaisia palautuskoordinaatteja. Tämä onnistuu helpoimmin kopioimalla tausta ja pyyhkimällä kaikki muu aloitustasoa lukuunottamatta pois.


Kopioinnin jälkeinen muokkaus

 Ja sitä seuraava muokkaus. Tähän teen liikkuvia tasoja, joiden päälle pitää pystyä hyppäämään.

Tässä harmaat tasot liikkuvat ylös- ja alaspäin eri tahdeissa.


"Odota kunnes"- palikka toimii jos-lauseen tavoin, mutta pysäyttää koodin siihen asti, että ehto täytetään. Laitan esiintymislavan ilmoittamaan viestillä, kun se vaihtaa esiintymislavaksi kolmosen. Tällä viestillä  saan aloitettua kenttiin kuuluvat animaatiot ja voin ohjata samoja hahmoja eri tavoin eri kentissä.


Harmaat tasot ovat kaksi erillistä hahmoa, joille teen omat skriptit. Kun peli aloitetaan, ne piilotetaan. En halua, että ne tulevat näkyviin ennen kolmatta kenttää, joten ne näytetään vasta kun "Kolmas kenttä"-viesti vastaanotetaan. Haluan hahmojen menevän vain ylös ja alas, joten laitan niille sellaiset skriptit. Toinen aloittaa menemällä ylöspäin, toinen alaspäin.

Tätä samaa jatketaan seuraavalla kerralla, lisään tunnin myöhemmin.