Materiaalit on lisensoitu Creative Commons BY-NC-SA-lisenssillä, eli materiaalin levittäminen ja muokkaaminen on sallittu, kunhan tekijöiden nimet säilyvät mukana ja jatkoversiot julkaistaan samalla lisenssillä. Kaupallinen käyttö kielletty.

Alkuperäinen tekijä (2014): Jenna Tuominen


Takaisin: Syksy 2014

3D FPS-keräily

Pelin toiminta Pelissä luodaan 2D-tasolle (näyttö) 3D-näkymää vastaava grafiikka. Näin simuloidaan peliä pelihahmon näkökulmasta (First Person Shooter). Pelissä tarkoituksena on kerätä tai ampua kaukaisuudesta lähestyviä hahmoja.
Vaikeustaso Peliä tehdessä Scratchin alkeet kannattaa olla jo hyvin hallussa (kuten liikkuminen ja silmukat). Tässä pelissä on erityisesti mahdollisuus tutustua klooneihin. Lisäulottuvuutta antaa jos ohjelmoijat tuntevat trigonometriaa ja voivat harjoitella myös sitä peliä suunnitellessaan. Tämä ei kuitenkaan ole välttämätöntä, koska riittävän 3D-efektin saa jo kerto- ja jakolaskuilla.
Oppimistavoitteita - Kerrataan koordinaatistoa.
- Tutustutaan koordinaatiston kolmanteen ulottuvuuteen.
- Kerrataan silmukoiden käyttöä ja ehtolauseita.
- Opitaan vaikuttamaan hahmoihin klikkaamalla.
- Opitaan käyttämään muuttujia muistettavina ja käytettävinä arvoina.
- Opitaan kloonien käyttöä.
- Tutustutaan merkkijonojen katenaatioon.
Toimiva versio FPS-keräily mallina Scratchissa
Muut mallit "Rasti ruutuun" -tehtävälistaus oppilaalle
Variaatioita toteutuksessa Pelissä voi vapaasti kerätä tai ampua melkein mitä tahansa. Jos haluaa toteuttaa peliin pisteiden sijasta tai lisäksi elinvoiman (kuten hapen tai ruoan) niin kerättävän hahmon voi suunnitella tätä silmällä pitäen. Peliin voi myös lisätä hahmoja, jotka kerättävän hahmon mukaisesti tulevat kohti pelaajaa, mutta joita ei tule syystä tai toisesta kerätä/ampua.

Kuvia mallipelistä:

Työvaiheet:

Väriselite:

Oppimistavoite
Tarkennus tekotapaan
  1. Kloonien luonti
    Tutustutaan klooneihin eli hahmoihin, joiden toiminnallisuus on toteutettu kerran, mutta joita tietokone osaa samalla reseptillä luoda äärettömän määrän.
    1. Ensimmäinen klooni luodaan
    2. Scratchissä hahmot ja sen kloonit ovat kaksi eri asiaa. Jos niiden haluttaisiin toimivan samoin täytyisi samat toiminnallisuudet ohjelmoida erikseen kummallekin. Ohjelmoidaan nyt kuitenkin kaikki vain klooneille ja piilotetaan alkuperäinen hahmo.
    3. Luodaan klooneja jatkuvasti
    4. Odota aina hetki kloonien luonnin välissä.

  2. Kloonin paikan määritys
    Opitaan käyttämään muuttujia apuna numeroiden muistamiseen.
    Tutustutaan koordinaatiston kolmanteen ulottuvuuteen.
    1. Tee hahmokohtaiset muuttujat 3D-x, 3D-y ja 3D-z
    2. Muuttujien pitää olla hahmokohtaisia, muuten ne ovat samat jokaiselle kloonille kun käytännössä kunkin kloonin pitää muistaa oma sijaintinsa.
    3. Alusta muuttujat kloonin syntyessä
    4. Asetetaan klooni syvyyteen z=200. Muuttujille x ja y arvotaan sijainti, joka voi olla esimerkiksi puolet esiintymislavasta (-120->120, -90->90).

  3. Kloonin sijoitus ja nousu pohjasta
    Äsken toteutettiin kloonin kolmiulotteinen sijainti, mutta se on aivan eri asia kuin kloonin sijainti 2D-näytöllä. 3D-koordinaatistosta voi laskea kaikille pisteille näyttökoordinaatit, mutta kun kloonin x- ja y-näyttökoordinaatteja nyt asetetaan niin älä muuta kloonin 3D-sijainnin muistavia muuttujia.
    Jos trigonometria on jo tuttua niin tässä vaiheessa voi itse laskea miten 3D-koordinaateista saa 2D-näyttökoordinaatit. Hahmotusapua täältä.
    1. Aseta klooni kohdalleen
    2. aseta x:lle arvo 200 * 3D-x / 3D-z
      aseta y:lle arvo 200 * 3D-y / 3D-z
    3. Siirrä kloonia hieman korkeammalle pohjasta
    4. 3D-x ja 3D-y pysyvät pelissä jatkuvasti samoina, mutta hahmon noustessa pohjasta korkeammalle niin 3D-z muuttuu (esim. -2 yksikköä). Mitä enemmän hahmoa nostetaan kerrallaan pohjasta sitä nopeammin se liikkuu myös pois näkyvistä.
    5. Piirrä ja siirrä kloonia vuorotellen kunnes se häviää näkyvistä
    6. Laita edelliset piirto- ja siirtokomennot toisto-silmukan sisälle. Toistetaan niitä kunnes z < 0 tai klooni koskettaa reunaan.
    7. Poista klooni silmukan jälkeen

  4. Kloonin koon muuttaminen
    Asetetaan kloonin koko oikeaksi aina samalla kun sen paikka asetetaan. Kloonin 3D-z etäisyyden käänteisluku vastaa kokoa tarpeeksi hyvin 3D-simulaatiota varten. Mitä suurempi kloonin etäisyys, sitä pienempänä se piirretään. Täsmällisen etäisyyden voi laskea myös trigonometrian avulla: etäisyys = neliöjuuri ( 3D-x * 3D-x + 3D-y * 3D-y ), mutta laskun toteutus Scratchissä on turhan työlästä. Jos laskussa käytetään täsmällistä etäisyyttä niin kuplat kannattaa myös sijoittaa alussa kauemmaksi kuin 200 yksikön päähän.

    Kerro etäisyys sopivalla arvolla, jotta klooni on hyvän kokoinen.

      TAI


  5. Aseta klooni taaimmaiseksi sen syntyessä
  6. Scratchissä ei ole suoraan komentoa tähän, mutta voit laittaa kloonia taaksepäin sen verran, että se varmasti on taaimmaisin.

  7. Klooni siirtyy noustessaan
    Kloonin ensimmäinen skripti käsittelee sen piirtämistä sijainnin perusteella. Jotta se ei paisuisi tavattoman pitkäksi ja hankalalukuiseksi niin luodaan siirtyminen omaksi skriptikseen uuden "kun aloitan kloonina"-tapahtuman alle.
    Nyt puhutaan kuplan oikeasta, kolmiulotteisesta sijainnista, joten sijaintia muokatessa muutetaan muuttujia 3D-x ja 3D-y.

      - Kloonin täsmällinen paikka vaihtelee satunnaisesti hieman

      Esimerkiksi vedessä nousevat kuplat eivät nouse aivan tasaisesti. Ne eivät ole fyysisesti kiinteitä kappaleita ja niiden hetkittäisestä muodosta ja ylläolevasta veden määrästä riippuen niille vähimmän vastuksen reitti ei ole välttämättä suoraan ylöspäin.

      JA / TAI

      - Klooni liikkuu itsenäisesti johonkin suuntaan

      Syynä tälle voi olla esimerkiksi virtaus tai kloonin oma tahto siirtyä jotain kohti tai muuten vain liikuskella.

  8. Klooneja kerätään tai ammutaan
    Kloonien keräys normaalinäkymässä voi olla hankalaa, koska osa klikkailuista saatetaan mieltää raahauksiksi. Tätä vaihetta voi olla parempi testata esiintymislavanäkymässä, minkä saa pelin nimen vierestä -nappulasta.
    1. Klooni poistuu jos sitä klikataan
    2. Tee muuttuja "pisteet" tai "elinvoima"
    3. Pelissä voi joko perinteisesti kerätä pisteitä tai keräämisen motivaatio voi olla pysyä elossa/tajuissaan. Esimerkkeinä elinvoimasta ruoan sisältämä energia tai vedessä kuplien sisältämä ilma.
    4. Muuta muuttujan arvoa osumasta
    5. Voit antaa enemmän pisteitä tai elinvoimaa jos osuttiin kauempana olevaan hahmoon. Osumasta voi siis esimerkiksi lisätä muuttujan arvoa etäisyyden, 3D-z, verran. Jos etäisyys on suuri niin saadaan paljon pisteitä, jos se taas on pieni niin saadaan vähemmän pisteitä.

      Seuraavat vain elinvoimaa toteutettaessa:

      Elinvoima on pelaajan ominaisuus eikä niinkään kuplan. Koska pelaajalle ei ole omaa hahmoa niin voit tehdä seuraavat toiminnot suoraan esiintymislavalle.
    6. Alusta elinvoiman määrä maksimiinsa pelin alussa
    7. Pienennä elinvoiman määrää jatkuvasti
    8. Aseta elinvoiman määrälle maksimi
    9. Jos elinvoimaa on liikaa niin asetetaan elinvoiman määrä maksimiinsa.
    10. Pysäytä peli jos elinvoima menee negatiiviselle

  9. Haavi tai ase klooneja keräämään
    Vaikka pelaaja istuukin näytön toisella puolella niin voimme kuitenkin sijoittaa näytön alalaitaan pelaajan kädessä olevan haavin tai aseen.
    1. Aseta valittu työkalu näkymän alalaitaan
    2. Aseta työkalu aina osoittamaan hiiriosoitinta
    3. Jos työkalun väärä puoli osoittaa hiiriosoitinta päin niin käännä piirrettyn kuvan asustetta niin, että työkalu osoittaa kuvassa oikealle.

  10. Elinvoiman loppumiselle lopetusnäkymä
    1. Pelin pysäyttämisen sijasta lähetä viesti GameOver
    2. Viestin lähettämisen johdosta pysäytä esiintymislavan ja pelaajan työkalun skriptit
    3. Jäädytetään kloonien luonti ja liike
      1. Tee leima jokaisesta kloonista
      2. Kukin klooni voi vastaanottaa lähetetyn viestin ja leimata itsensä näkyviin. (Itse kloonit häviävät kun niiden toiminta pysäytetään.)
      3. Pyyhi näkymä aina pelin aluksi
      4. Pysäytä kaikki kerättävän hahmon toiminnot lopuksi
    4. Tehdään peliin tuomari
    5. Tutustutaan merkkijonojen katenointiin eli yhdistämiseen.
      1. Aseta tuomari näkymään vasta pelin lopussa
      2. Tuomari piilotetaan pelin alkaessa ja asetetaan esiin kun vastaanotetaan viesti 'GameOver'.
      3. Tuomari sanoo miten kauan selvittiin
      4. Pelin alussa on käynnistynyt ajastin (tuntoaisti). Tuomari voi nyt yhdistää tarvittavat tekstit sanoakseen kokonaisen lauseen missä haetaan myös ajastimen sen hetkinen arvo.