Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

Samankaltaiset tiedostot
1. Miten tehdään peliin toinen maila?

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

1. Taustatietoa näppäimistönkuuntelusta

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi

Pong-peli, vaihe Rajojen tarkistus Yläreunan tarkistus. Muilla kielillä: English Suomi

Apuja ohjelmointiin» Yleisiä virheitä

Jypelin käyttöohjeet» Ruutukentän luominen

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

Jypelin käyttöohjeet» Ruutukentän luominen

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

Jypelin käyttöohjeet» Miten lisään ohjaimet peliin

Jypelin käyttöohjeet» Miten saan peliin pistelaskurin?

ITKP102 Ohjelmointi 1 (6 op)

Jypelin käyttöohjeet» Millaisia olioita on olemassa?

ITKP102 Ohjelmointi 1 (6 op)

Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Javan perusteita. Janne Käki

1. Omat operaatiot 1.1

Olio-ohjelmointi Javalla

Scratch ohjeita. Perusteet

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

9. Periytyminen Javassa 9.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Luokat ja oliot. Ville Sundberg

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

5 Näppäimistö. 5.1 Näppäimistön eventit

4. Luokan testaus ja käyttö olion kautta 4.1

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Ohjelmoinnin jatkokurssi, kurssikoe

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

5. HelloWorld-ohjelma 5.1

C# Windows ohjelmointi perusopas

Ohjelmoinnin perusteet, syksy 2006

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Helsingin yliopiston LUMA-keskus

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

1. Mitä tehdään ensiksi?

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

11/20: Konepelti auki

Metodien tekeminen Javalla

Venekilpailu! Esteiden väistely ja hahmon ohjaaminen

Java-kielen perusteita

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Ohjeissa pyydetään toisinaan katsomaan koodia esimerkkiprojekteista (esim. Liikkuva_Tausta1). Saat esimerkkiprojektit opettajalta.

JUnit ja EasyMock (TilaustenKäsittely)

Kopiodaksesi, leikataksesi ja liittääksesi helpointa on käyttää näppäimistön pikavalintoja:

Ensikosketus ohjelmointiin

ASCII-taidetta. Intro: Python

Google-dokumentit. Opetusteknologiakeskus Mediamylly

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Visma.net Approval. Versiosaate 1.40

Liikennevalot. Arduino toimii laitteen aivoina. Arduinokortti on kuin pieni tietokone, johon voit ohjelmoida toimintoja.

TEHTÄVÄ 1.1 RATKAISUOHJEET

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

9. Periytyminen Javassa 9.1

15. Ohjelmoinnin tekniikkaa 15.1

Osa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include <iostream.h> 15: 16: int main() 17: {

Condes. Quick Start opas. Suunnistuksen ratamestariohjelmisto. Versio 7. Quick Start - opas Condes 7. olfellows 1.

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

5. HelloWorld-ohjelma 5.1

Ohjelmoinnin perusteet Y Python

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Eclipse 3.2 pikku opas versio 1.0. Esittely Uuden projektin perustaminen Sovelluksen luominen Koodin siistiminen Vinkkejä

19. Olio-ohjelmointia Javalla 19.1

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

GEOS 1. Ilmastodiagrammi Libre Office Calc ohjelmalla

Ohjeistus pöytäkirjan käyttöön. Suomen Lentopalloliitto ry

Alkuun HTML5 peliohjelmoinnissa

Osoitin ja viittaus C++:ssa

Ohjelmointityökalu Scratch

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Asiointipalvelun ohje

Interaktiivinen tarinankerronta

75059 Suuri lajittelusarja

Ohjelmointi 2 / 2010 Välikoe / 26.3

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmoinnin peruskurssi Y1

Alkukartoitus Opiskeluvalmiudet

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

C:\MyTemp\ohj1\ohjdemot\k2012\demot\vastaukset\demo11\PP1\TokaPisin.cs 1 using System; 2 using System.Collections.Generic; 3 using System.

YH1b: Office365 II, verkko-opiskelu

KODU. Lumijoen peruskoulu

Taulukot. Jukka Harju, Jukka Juslin

Excel syventävät harjoitukset

1 Funktiot, suurin (max), pienin (min) ja keskiarvo

7. Oliot ja viitteet 7.1

Transkriptio:

Muilla kielillä: English Suomi Pong-peli, vaihe 3 Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana Jaetaan ohjelma pienempiin palasiin (aliohjelmiin) Lisätään peliin maila (jota ei voi vielä liikuttaa) Vaihe on melko pitkä, mutta sitäkin tärkeämpi, joten jaksathan lukea ohjeet huolellisesti loppuun saakka. 1. Aliohjelman tekeminen Lisäämme pian pelikenttään lisää olioita, tällä kertaa mailan. Jotta koodi pysyisi hallittavan kokoisissa palasissa, teemme kentän luomisesta oman aliohjelman nimeltä LuoKentta. Aliohjelma on pienempi osa koodia, jota voidaan kutsua jostain muusta kohtaa koodia. Aliohjelmasta näkee usein käytettävän myös nimityksiä funktio tai metodi. Ne tarkoittavat (melkein) samaa asiaa. Kirjoita aliohjelma LuoKentta. Aliohjelman koodi on seuraavassa merkattu vihreällä värillä. Harmaalla oleva koodi pitäisi olla jo koodissasi, joten sitä ei pidä kirjoittaa. public class Pong : PhysicsGame PhysicsObject pallo = new PhysicsObject(40.0, 40.0); Add(pallo); Level.Background.Color = Color.Black; 1. Aliohjelman tekeminen 1

Camera.ZoomToLevel(); Kiinnitä erityisesti huomiota siihen, miten aaltosulut tulevat. Rivin jälkeen tulee yksi aaltosulku auki?? ja toinen kiinni??. Niiden väliin kirjoitetaan LuoKentta-aliohjelmaan kuuluvat koodirivit. Aliohjelman esittelyrivin jälkeen ei tule puolipistettä?;?. Aliohjelman alussa, ennen sen nimeä, kerrotaan minkä tyyppistä tietoa aliohjelma paluttaa. Koska tämä aliohjelma ei palauta mitään arvoa, tyypin kohdalle tulee vain sana void. Aliohjelman nimen jälkeen tulee sulut, joiden väliin tulee mahdolliset parametrit (joita tässä ei ole yhtään). Nyt meillä on tyhjä aliohjelma, jonne haluaisimme siirtää kaikki kentän luomiseen liittyvät koodirivit. 2. Aliohjelman kutsuminen Aliohjelma ei itsessään tee mitään ennen kuin sitä kutsutaan jostakin. Aliohjelman kutsuminen tarkoittaa, että tietokonetta käsketään suorittamaan aliohjelmaan kuuluvat koodirivit. Mistä voisimme kutsua tuota aliohjelmaa? Tietysti Begin-aliohjelmasta, jota olemme edellisissä vaiheissa tehneet. Tuo aliohjelmahan suoritetaan ensimmäisenä kun peli käynnistetään. Siirrä kentän luontiin liittyvät rivit Begin:ista aliohjelmaan LuoKentta alla olevan kuvan osoittamalla tavalla. (Ctrl+X leikkaa valitun tekstin ja Ctrl+V liitää sen kursorin kohdalle. Katso tarvittaessa tarkemmat?ohjeet tekstin editointiin). Huomaa, että omassa koodissasi rivit saattavat olla hieman eri järjestyksessä kuin kuvassa. Pallon liikuttamiseen liittyvät kaksi riviä (vektorin luominen ja pallon töytäisy) ja lopetusnapin tekevä rivi jäävät Begin-aliohjelmaan ja kaikki muut rivit siirretään uuteen LuoKentta-aliohjelmaan. Kirjoitetaan sitten aliohjelmakutsu. Aliohjelman kutsu on käsky tietokoneelle käydä suorittamassa aliohjelmalle kuuluvat koodirivit. Kutsu tapahtuu yksinkertaisesti kirjoittamalla aliohjelman nimi, jonka jälkeen tulee sulut ja sulkujen sisään mahdolliset parametrit (joita aliohjelmallamme ei ole yhtään) ja lopuksi puolipiste?;?. 2. Aliohjelman kutsuminen 2

Kirjoita siirrettyjen rivien tilalle aliohjelman LuoKentta kutsu kuten kuvassa: Koska kirjoitimme aliohjelmakutsun ennen rivejä, joilla luodaan vektori nimeltä impulssi ja sysätään pallo liikkeelle, LuoKentta-aliohjelman rivit suoritetaan ennen impulssin luomista ja pallon liikuttamista. Pelimme toiminta ei siis muutu oikeastaan millään tavalla. Jäsentelemme vain koodia pienempiin osiin. Pelissämme on vielä kuitenkin virhe. (Älä turhaan yritä ajaa peliä.) 3. Pallo attribuutiksi Koska nyt pallo luodaan aliohjelmassa LuoKentta, niin Begin-aliohjelma ei enää tunne sen nimistä muuttujaa. Tämä voidaan korjata siirtämällä pallo-muuttujan esittely aliohjelmien ulkopuolelle. Sitten kaikki aliohjelmat tunnistavat muuttujan. Aliohjelmien ulkopuolella esiteltyjä muuttujia kutsutaan ohjelmoinnissa attribuuteiksi. Attribuutteja tarvitaan esimerkiksi silloin, kun johonkin olioon tarvitsee päästä käsiksi koko pelin ajan eikä pelkästään oliota luotaessa. Lisää koodiisi seuraavassa vihreällä merkitty osa: public class Pong : PhysicsGame PhysicsObject pallo; LuoKentta(); Koska muuttuja pallo on jo esitelty attribuutissa, sitä ei pidä enää esitellä uudestaan aliohjelman LuoKentta sisällä. Pyyhi pallon luovan rivin alusta pois sana PhysicsObject: PhysicsObject pallo = new PhysicsObject(40.0, 40.0); 3. Pallo attribuutiksi 3

Add(pallo); Level.Background.Color = Color.Black; Camera.ZoomToLevel(); Nyt uusi fysiikkaolio sijoitetaan siihen palloon, jonka äsken lisäsimme koodin alkuun. Näillä toimenpiteillä pallo-olioon päästään käsiksi kaikista aliohjelmista. 4. Mailan lisääminen kenttään Lisätään kenttään maila. Haluaisimme, että maila on paikallaan pysyvä eli staattinen vaikka pallo törmäilee siihen. Staattisen eli paikallaan pysyvän fysiikkaolion luominen tapahtuu aliohjelmakutsulla PhysicsObject.CreateStaticObject. Lisää vihreällä merkityt rivit LuoKentta-aliohjelmaan: pallo = new PhysicsObject(40.0, 40.0); Add(pallo); PhysicsObject maila = PhysicsObject.CreateStaticObject(20.0, 100.0); maila.shape = Shape.Rectangle; maila.x = Level.Left + 20.0; maila.y = 0.0; maila.restitution = 1.0; Add(maila); Level.Background.Color = Color.Black; Camera.ZoomToLevel(); Pong-pelissä on maila sekä ruudun vasemmassa että oikeassa reunassa. Lisätään oikeanpuoleinen maila myöhemmin. Y-koordinaatin asetamme nollaksi, jotta maila menee pystysuunnassa ruudun keskelle. X-koordinaattia varten kysymme pelikentältä sen vasemman reunan x-koordinaatin (Level.Left) ja lisäämme siihen 20.0, jotta maila pysyy kentän rajojen sisällä. 4. Mailan lisääminen kenttään 4

Olisimmeko voineet sijoittaa x-koordinaattiin yksinkertaisesti jonkun arvon, esimerkiksi -300.0? Olisimme toki. Äsken käyttämämme tapa on kuitenkin siitä parempi, että maila tulee aina kentän vasempaan reunaan vaikka päättäisimme myöhemmin muuttaa kentän kokoa. Näin peli on helpommin muokattavissa. Laitamme myös mailalle Restitution-ominaisuuden arvoon 1.0, koska törmäykseen vaikuttaa kummankin törmäävän kappaleen ominaisuudet. Kun nyt käynnistät pelin, siinä näkyy pallo sekä yksi maila. 5. Pelin aloittaminen Kentän luomisen lisäksi pelissä on monia muita toimenpiteitä, jotka voisimme tehdä omina aliohjelminaan. Kun pelitilanne on muuten alustettu, voidaan aloittaa peli, joka tämän pelin tapauksessa tarkoittaa pallon laittamista liikkeelle. Tehdään aliohjelma, joka aloittaa pelin. Aliohjelmien keskinäisellä järjestyksellä ei sinänsä ole merkitystä, kunhan ne ovat toistensa ulkopuolella (eli muiden aliohjelmien aaltosulkujen ulkopuolella) mutta luokan (eli äärimmäisten aaltosulkujen) sisäpuolella. Lisää koodiisi uusi aliohjelma AloitaPeli: void AloitaPeli() Siirretään koodirivejä aliohjelmasta toiseen samoin kuin kentän luomisen yhteydessä. Siirrä pelin aloitukseen liittyvät rivit (Vector impulssi ja pallo.hit) Begin-aliohjelmasta AloitaPeliin: void AloitaPeli() Lisää Begin-aliohjelmaan siirrettyjen rivien tilalle AloitaPeli-aliohjelmakutsu: LuoKentta(); AloitaPeli(); Huomaa, että koodin voi jakaa aliohjelmiin monin eri tavoin, tämä on vain yksi tapa. 5. Pelin aloittaminen 5

6. Lopputulos Näiden muutosten jälkeen luokka Pong eli Pong-pelimme on tämän näköinen. Tiedoston alussa olevat using-lauseet eivät välttämättä näy koodissasi, sillä Visual Studio voi tarvittaessa piilottaa joitakin epäolennaisempia osia koodista. Huomaa että pallo saattaa kimmota seinästä oudolla kulmalla tai hidastua osuessaan mailaan. Et ole tehnyt mitään väärin, vaan vika on Jypelin käyttämässä fysiikkamoottorissa jota ei ole tarkoitettu tämän tyylisille peleille. Korjaus on tulossa Jypelin seuraavaan versioon, sitä odotellessasi löydät ensiavun ongelmaan?täältä. Montako aliohjelmaa koodissa on nyt? Näet vastauksen sivun lopusta, mutta mieti hetki ennen kuin katsot. Muista, että jokaisessa aliohjelmassa on aloittava aaltosulku sekä lopettava aaltosulku. using System; using System.Collections.Generic; using System.Linq; using System.Text; using Jypeli; using Jypeli.Assets; using Jypeli.Controls; using Jypeli.Effects; using Jypeli.Widgets; public class Pong : PhysicsGame PhysicsObject pallo; LuoKentta(); AloitaPeli(); pallo = new PhysicsObject(40.0, 40.0); Add(pallo); PhysicsObject maila = PhysicsObject.CreateStaticObject(20.0, 100.0); maila.shape = Shape.Rectangle; maila.x = Level.Left + 20.0; maila.y = 0.0; maila.restitution = 1.0; Add(maila); Level.BackgroundColor = Color.Black; Camera.ZoomToLevel(); 6. Lopputulos 6

void AloitaPeli() Vastaus kysymykseen: Koodissa on kolme aliohjelmaa. Ne on merkitty seuraavassa keltaisella värillä. Tämän lisäksi attribuutti pallo on merkattu sinisellä värillä. public class Pong : PhysicsGame PhysicsObject pallo; LuoKentta(); AloitaPeli(); pallo = new PhysicsObject(40.0, 40.0); Add(pallo); PhysicsObject maila = PhysicsObject.CreateStaticObject(20.0, 100.0); maila.shape = Shape.Rectangle; maila.x = Level.Left + 20.0; maila.y = 0.0; maila.restitution = 1.0; Add(maila); Level.Background.Color = Color.Black; Camera.ZoomToLevel(); void AloitaPeli() 6. Lopputulos 7

6. Lopputulos 8