5. Hahmon ohjelmoiminen – Event sheet
Teemme siis autopelin, jossa ajetaan kolme kierrosta, jonka jälkeen peli päättyy. Pelissä voisi näkyä jäljellä olevat kierrokset ja aika. Peli tarvitsee muuttujia, joihin tämä tieto voidaan tallentaa. Lisäksi haluamme lähtövalot eli tarvitsemme portin, joka aukeaa vasta kun peli käynnistyy. Tämä estää varaslähdön. Aloitetaan siitä.
Aluksi meidän pitää piirtää portti. Se voi olla samalla lähtöviiva. Mene takaisin Layout- välilehdelle ja Tausta-tasolle. Lisää Sprite-objekti, laita sen kooksi Width: 10, Height: 180 (jos sinulla on kuvan mukainen tilanne) ja väritä se valkoiseksi. Nosta valkea suorakulmio ruutulippuun kiinni. Tämä valkea viiva on sekä lähtöviiva, että portti.
Valkeasta viivasta saadaan helposti portti, joka on kiinni, kun siihen lisätään Solid- käyttäytymismalli, joten lisää se (Kohta Behaviors). Nimeä myös objekti nimellä: Lähtöviiva.
Mene takaisin Event-sheet välilehdelle. Tehdään lähtöanimaatio.
- Paina Add Event
- Valitse System ja paina Next.
- Valitse kohdasta Start & End ehto: On start of layout ja paina Done.
- Paina Add Action
- Valitse System ja paina Next.
- Valitse kohdasta Time toiminto: Wait ja paina Next.
- Anna arvo: Seconds: 2.0 ja paina Done.
- Valitse Valo2 ja paina Next.
- Valitse kohdasta Appearance toiminto: Set visible ja paina Next.
- Laita asetus: Visibility: Visible ja paina Done.
- Paina Add Action uudestaan.
- Valitse Valo1 ja paina Next.
- Valitse kohdasta Misc toiminto: Destroy ja paina Done.
- Paina Add Action uudestaan.
- Valitse System ja paina Next.
- Valitse kohdasta Time toiminto: Wait ja paina Next.
- Anna arvo: Seconds: 2.0 ja paina Done.
- Valitse Valo3 ja paina Next.
- Valitse kohdasta Appearance toiminto: Set visible ja paina Next.
- Laita asetus: Visibility: Visible ja paina Done.
- Paina Add Action uudestaan.
- Valitse Valo2 ja paina Next.
- Valitse kohdasta Misc toiminto: Destroy ja paina Done.
- Paina Add Action uudestaan.
- Valitse System ja paina Next.
- Valitse kohdasta Time toiminto: Wait ja paina Next.
- Anna arvo: Seconds: 1.0 ja paina Done.
- Valitse Valo4 ja paina Next.
- Valitse kohdasta Appearance toiminto: Set visible ja paina Next.
- Laita asetus: Visibility: Visible ja paina Done.
- Paina Add Action uudestaan.
- Valitse Valo3 ja paina Next.
- Valitse kohdasta Misc toiminto: Destroy ja paina Done.
- Paina Add Action uudestaan.
- Valitse System ja paina Next.
- Valitse kohdasta Time toiminto: Wait ja paina Next.
- Anna arvo: Seconds: 2.0 ja paina Done.
- Valitse Valo5 ja paina Next.
- Valitse kohdasta Appearance toiminto: Set visible ja paina Next.
- Laita asetus: Visibility: Visible ja paina Done.
- Paina Add Action uudestaan.
- Valitse Valo4 ja paina Next.
- Valitse kohdasta Misc toiminto: Destroy ja paina Done.
- Paina Add Action uudestaan.
- Valitse Lähtöviiva (se portti) ja paina Next.
- Valitse kohdasta Solid toiminto: Set enabled ja paina Next.
- Laita asetus: State: Disabled ja paina Done.
- Paina Add Action uudestaan.
- Valitse System ja paina Next.
- Valitse kohdasta Time toiminto: Wait ja paina Next.
- Anna arvo: Seconds: 2.0 ja paina Done.
- Paina Add Action uudestaan.
- Valitse Valo5 ja paina Next.
- Valitse kohdasta Misc toiminto: Destroy ja paina Done.
Lopputulos näyttää tältä eli kun valo on vihreä, niin Lähtöviiva aukeaa eli ei ole enää kiinteä (Solid).
Lisätään peliin seuraavaksi näkyviin peli-aika sekunteina. Sitä varten tarvitsemme teksti-kentän.
Lisätään uusi objekti Layers-ikkunassa painamalla pelikentän päällä hiiren oikeaa painiketta ja avautuvasta valikosta otetaan komento: Insert new object. Valitaan teksti-objekti ja painetaan Insert-painiketta. Nosta teksti pelikentän vasempaan ylänurkkaan. Isonna fonttikokoa, Properties- ikkunan kohdassa Font.
Lopuksi lisää Anchor-käyttäytymismalli, niin teksti pysyy paikoillaan pelinäkymä-ikkunassa.
Katsotaan vielä teksti-objektin asetuksia tarkemmin Properties-ikkunassa.
Mene Event sheet-välilehdelle.
- Paina Add event.
- Valitse System ja paina Next.
- Valitse kohdasta General ehto: Every tick ja paina Done.
- Paina hiiren oikeaa painiketta Every tick-ehdon päällä ja avautuvasta valikosta ota komento: Add another condition.
- Valitse System ja paina Next.
- Valitse kohdasta Time: Compare time ja paina Next.
- Tee valinnat: Comparison: > Greater than, Time (seconds): 6 ja paina Done.
- Paina Add action
- Valitse Text-objekti (Aika) ja paina Next.
- Valitse kohdasta Appearance: Set Visible ja paina Next.
- Laita asetus: Visibility: Visible ja paina Done.
- Paina Add action uudestaan.
- Valitse Text-objekti (Aika) ja paina Next.
- Valitse kohdasta Text: Set text ja paina Next.
- Kirjoita kohtaan Text: ”Aika: ”&round(time-6)&” s” ja paina Done. Komento: time näyttää aikaa siitä hetkestä, kun ohjelma käynnistetään. Vihreä valo kuitenkin palaa vasta 6 sekunnin jälkeen, joten joudumme tekemään pienen vähennyslaskun. Komento time palauttaa desimaaliluvun, joten pyöristämme sen kokonaisluvuksi.
Nyt meillä on toiminto, joka alkaa näyttää aikaa kun vihreä valo syttyy. Lopputuloksen pitäisi näyttää tältä.
Laitetaan seuraavaksi vastustajan auto liikkumaan ennalta määrättyä polkua pitkin. Polku koostuu pisteitä, jotka meidän merkittävä karttaan. Mene Layout-välilehdelle ja tuplanapsauta hiirellä pelikentässä, jolloin aukeaa Insert New Object-ikkuna. Valitse Sprite tyyppinen objekti ja paina Insert.
Napsauta kerran työpöydällä hiirellä ja tuttu Kuva-ikkuna aukeaa. Muuta kuvan koko arvoon: Width (pixels): 100, Height (pixels): 100. Väritä neliö haluamallasi värillä. Sulje ikkuna.
Properties-ikkunassa anna neliölle nimi: Piste1. Ja muuta näkyvyysarvo kohdassa Initial visibility arvoon: Invisible (= näkymätön).
Nosta ensimmäinen neliö (Piste1) maalialueen päälle. Nyt tehdään neliöstä kopioita, mutta eri tavalla kuin aikaisemmin eli paina hiiren oikea painike neliön päällä ja avautuvasta valikosta ota komento: Clone object type. Tämä tekee uuden objektin ja nimeää sen automaattisesti nimellä Piste2. Nosta uusi neliö (Piste2) seuraavaan mutkaan.
Tee seuraavasta pisteestä kopio samalla tavalla ja nosta se seuraavaan mutkaan jne. Nosta aina mieluummin ulkokaarteeseen kuin sisäkaarteeseen. Pisteitä pitäisi olla niin paljon, että pisteestä toiseen on suora näköyhteys, niin silloin varmistetaan se, että auto ei lähde ajamaan väärään suuntaan. Näet Projects- ikkunassa juoksevalla numerolla, että syntyy uusia objekteja. Nosta kukin uusi piste kuvan mukaiseen järjestykseen.
Mennään takaisin Event sheet välilehdelle ja lisätään seuraavat komennot.
Vastustaja eli AutoVioletti etsii reitin ensimmäiselle pisteelle (Piste1) heti kun portti aukeaa. Komentoa ei saa laittaa liian aikaisin (ennen portin aukeamista) tai auto etsii väärän reitin.
Seuraavaksi komennetaan vastustajan auto liikkeelle. Tehdään seuraavalla tavalla.
- paina Add evet.
- Valitse AutoVioletti ja paina Next.
- Valitse kohdasta Pathfinding ehto: On path found ja paina Done.
- Paina Add action.
- Valitse AutoVioletti ja paina Next.
- Valitse kohdasta Pathfinding: Movements komento: Move along path ja paina Done.
Olet nyt luonut komennon, jossa auto liikkuu, jos polku on löydetty.
Nyt vastustaja liikkuu vain ensimmäiseen neliöön (Piste1).
- Paina Add event.
- Valitse AutoVioletti ja paina Next.
- Valitse kohdasta Collisions ehto: On collision with another object ja paina Next.
- Napsauta hiirellä kohtaa <click to choose> ja valitse Piste1 ja paina OK. Lopuksi kuittaa valinta painamalla Done.
- paina Add action.
- Valitse AutoVioletti ja paina Next.
- Valitse kohdasta Pathfinding: Find path ja paina Next.
- Laita seuraavat asetukset:
ja paina Done.
Olet nyt luonut komennon, kun violetti auto törmää pisteeseen 1, niin violetti auto etsii uuden polun pisteeseen 2.
Näin pitäisi jatkaa kaikki pisteet läpi (Piste1->Piste2, Piste2->Piste3,… Piste18->Piste19, Piste19->Piste1). Koska samankaltaisia komentoja on paljon, niin helpointa on kopioida yllä olevaa komentoa. Napsauta hiirellä komennon alussa olevaa nuolta. Nyt komento on valittu.
Paina nyt näppäimistöltä: CTRL + C ja CTRL + V. Tämä on sama asia kuin ottaisi komennot: kopioi (Copy) ja Liitä (Paste) peräkkäin. Tuplanapsauta nyt hiirellä kohtaa, jossa lukee: On collision with Piste1. Muuta tähän Piste2 valitsemalla objekti uudestaan. Samalla tavalla tuplanapsauta hiirellä kohtaa: Find path to (Piste2.X,Piste2.Y) ja kirjoita siihen uuden pisteen arvot eli X: Piste.3X ja Y: Piste3.Y
Muutettu komento näyttää nyt tältä.
Tee samalla tavalla eteenpäin, jolloin lopuksi sinulla pitäisi olla seuraavanlaiset komennot.
Nyt olemme saaneet vastustajan kulkemaan radan ympäri loputtomasti.
Nyt jos nyt testaat peliä ( = F5), niin kannattaa kiinnittää huomiota autojen käyttäytymismalleihin ja siellä kohtiin Max speed (maksimi nopeus), Acceleration (= kiihtyvyys) ja Deceleration ( = hidastuvuus). Näissä voi olla isojakin eroja, joten eroja kannattaa tasoittaa, jotta kilpailusta tulisi tasaväkisempi. Sopivat arvot löytyvät testaamalla peliä. Aluksi voit laittaa näihin samat arvot.
Jos haluat, että peli on alussa helppo, mutta vaikeutuu pelin edetessä koko ajan, niin voit muuttaa näiden ominaisuuksien (max speed, acceleration) arvoja ohjelmoimalla.
Nyt meidän pitää enää ohjelmoida peli loppumaan. Halusimme, että peli loppuu kolmen kierroksen jälkeen eli tarvitsemme globaalin muuttujan, johon se tieto tallennetaan. Mene Event Sheet-välilehdelle ja paina hiiren oikea painike pohjaan. Valitse avautuvasta valikosta: Add global variable. Laita kohtaan: Name: Kierrokset ja kohtaan Intial value: 4, joka on kierrosten alkuarvo.
Perusta saman tien toinen globaali-muuttuja: Aika ja anna sille alkuarvo 0. Tätä tarvitaan kun teemme pelin lopetusehdon (palataan tähän myöhemmin), jolloin sinulla pitäisi olla kaksi globaalia muuttujaa: Aika ja Kierrokset.
Mennään takaisin Event sheet välilehdelle. Lisätään komento:
- Paina Add event.
- Valitse System ja paina Next.
- Valitse kohdasta General ehto: Every tick ja paina Done.
- Paina Add action.
- Valitse teksti-objekti (Kierroksia) ja paina Next.
- Valitse kohdasta Text toiminto: Set text ja paina Next.
- Laita kohtaan Text: ”Kierroksia jäljellä: ”&Kierrokset ja paina Done.
Olemme nyt luoneet komennon, joka tulostaa jäljellä olevat kierrokset.
Sitten tietysti tarvitaan ehto, kun AutoKeltainen ajaa Maalialueen yli, niin Kierrokset-laskurin arvo vähenee yhdellä. Se tehdään seuraavasti.
- Paina Add event.
- Valitse AutoKletainen ja paina Next.
- Valitse kohdasta Collisions ehto: On collision with another object ja paina Next.
- Napsauta hiirellä kohtaa <click to choose> ja valitse Maali ja paina OK. Lopuksi kuittaa valinta painamalla Done.
- paina Add action.
- Valitse System ja paina Next.
- Valitse kohdasta Global & local variables toiminto: Add to ja paina Next.
- Laita seuraavat asetukset: Variable : Kierrokset, Value: -1 ja paina Done.
Ehto on valmis.
Pelin lopetusehto
Luodaan peliin vielä lopetusehto. Kun kierroksia on 0, niin peli loppuu ja kello pysähtyy. Nyt tarvitsemme sitä toista muuttujaa: Aika. Kun peli loppuu, niin tallennamme ajan Aika-muuttujalle ja tulostamme sen. Jotta se onnistuu, niin tarvitsemme taas uuden Teksti-objektin. Luo uusi teksti-objekti ja laita se samaan paikkaan, samalla fonttikoolla kuin aikaisemmin luomamme Teksti-objekti: Aika. Nimeä myös tämä uusi teksti-objekti ja lisää siihen Anchor-käyttäytymismalli (Behaviors).
Lopetusehto tehdään Event-sheet välilehdellä seuraavasti.
- Paina Add event.
- Valitse System ja paina Next.
- Valitse kohdasta Global & local variables ehto: Compare variable ja paina Next.
- Laita seuraavat asetukset: Variable: Kierrokset, Comparison: = Equal to, Value = 0 ja paina Done.
- Paina hiiren oikeaa painiketta juuri luomasi ehdon päällä ja valitse avautuvasta valikosta komento: Add another condition.
- Valitse System ja paina Next.
- Valitse kohdasta Global & local variables ehto: Compare variable ja paina Next.
- Laita seuraavat asetukset: Variable: Aika, Comparison: = Equal to, Value = 0 ja paina Done. Tämä toinen ehto tarvitaan siksi, että tämä komento suoritetaan vain kerran.
- Paina Add action.
- Valitse AutoKeltainen ja paina Next.
- Valitse kohdasta Car toiminto: Set enabled ja paina Next.
- Laita asetus: State: Disabled ja paina Done.
- Paina Add action uudestaan.
- Valitse AutoVioletti ja paina Next.
- Valitse kohdasta Pathfinding toiminto: Set enabled ja paina Next.
- Laita asetus: Set: Disabled ja paina Done.
- Paina Add action uudestaan.
- Valitse System ja paina Next.
- Valitse kohdasta Global & local variables ehto: Set value ja paina Next.
- Laita seuraavat asetukset: Variable: Aika, Value: round(time-6) ja paina Done.
- Paina Add action uudestaan.
- Valitse Text-objekti Aika ja paina Next.
- Valitse kohdasta Appearance toiminto: Set visible ja paina Next.
- Laita asetus: Visibility: Invisible ja paina Done.
- Paina Add action uudestaan.
- Valitse Text-objekti LoppuAika ja paina Next.
- Valitse kohdasta Appearance toiminto: Set visible ja paina Next.
- Laita asetus: Visibility: Visible ja paina Done.
- Paina Add action uudestaan.
- Valitse Text-objekti LoppuAika ja paina Next.
- Valitse kohdasta Text toiminto: Set text ja paina Next.
- Laita asetus: Text: ”Aika: ”&Aika&” s” ja paina Done.
Lopetusehdon pitäisi näyttää tältä.
Mene vielä aikaisemmin luomaamme komentoon, joka tulosti ajan. Sinne on lisättävä yksi ehto lisää eli Aika = 0.
Toimi nyt seuraavasti.
- Paina hiiren oikeaa painiketta ehdon Every tick päällä ja valitse avautuvasta valikosta komento: Add another condition.
- Valitse System ja paina Next.
- Valitse kohdasta Global & local variables ehto: Compare variable ja paina Next.
- Laita seuraavat asetukset: Variable: Aika, Comparison: = Equal to, Value = 0 ja paina Done. Tämä toinen ehto tarvitaan siksi, että tätä komentoa ei enää suoriteta silloin kun peli loppuu.
Peli toimii nyt niin kuin haluamme. Tosin vieläkin on jäljellä joitain parannusehdotuksia.