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

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

1. Taustatietoa näppäimistönkuuntelusta

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

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

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

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

Jypelin käyttöohjeet» Ruutukentän luominen

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

Apuja ohjelmointiin» Yleisiä virheitä

ITKP102 Ohjelmointi 1 (6 op)

Jypelin käyttöohjeet» Ruutukentän luominen

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Olio-ohjelmointi Javalla

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Javan perusteita. Janne Käki

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Sisältö. 2. Taulukot. Yleistä. Yleistä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmointi 2 / 2010 Välikoe / 26.3

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

ITKP102 Ohjelmointi 1 (6 op)

Sisältö. 22. Taulukot. Yleistä. Yleistä

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

Mikä yhteyssuhde on?

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

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

Metodien tekeminen Javalla

XNA grafiikka laajennus opas. Paavo Räisänen. Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa.

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

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

Ohjelmoinnin jatkokurssi, kurssikoe

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

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

Alkuun HTML5 peliohjelmoinnissa

Racket ohjelmointia II. Tiina Partanen 2015

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

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

1. Omat operaatiot 1.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

7. Oliot ja viitteet 7.1

Ohjelmoinnin perusteet Y Python

C# Windows ohjelmointi perusopas

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Olio-ohjelmointi Syntaksikokoelma

7. Näytölle tulostaminen 7.1

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

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Luokan sisällä on lista

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

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

Matopeli C#:lla. Aram Abdulla Hassan. Ammattiopisto Tavastia. Opinnäytetyö

9. Periytyminen Javassa 9.1

Listarakenne (ArrayList-luokka)

Racket ohjelmointia osa 2. Tiina Partanen Lielahden koulu 2014

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

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

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

Luokan muodostimet (Constructors)

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

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

14. Poikkeukset 14.1

Ohjelmoinnin perusteet, kurssikoe

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

C# olio-ohjelmointi perusopas

Java kahdessa tunnissa. Jyry Suvilehto

Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Java-kielen perusteet

13. Loogiset operaatiot 13.1

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

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

17. Javan omat luokat 17.1

19. Olio-ohjelmointia Javalla 19.1

Tietorakenteet (syksy 2013)

UML ja luokkien väliset suhteet

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Olio-ohjelmointi 2. välikoe HYV5SN

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

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

1 Tehtävän kuvaus ja analysointi

Rajapinta (interface)

Java-kielen perusteet

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

YHTEYSSUHDE (assosiation)

Ohjelmoinnin peruskurssi Y1

Oliot viestivät metodeja kutsuen

Java-kielen perusteita

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

14. Poikkeukset 14.1

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Transkriptio:

Muilla kielillä: English Suomi Pong-peli, vaihe 7 Tässä vaiheessa lisäämme peliin pistelaskun. Pong-pelissä pelaaja saa pisteen kun pallo ohittaa toisen pelaajan mailan. 1. Aliohjelmakutsu laskureita varten Pisteiden laskemiseksi tarvitsemme jonkinlaisen laskurin, jossa pitää yllä pelaajan pisteitä. Laskureiden luominen olisi yksi kokonaisuus pelin alustamisessa, joten tehdään siitä oma aliohjelma. Lisää aliohjelman LisaaLaskurit kutsu Beginiin: public override void Begin() LuoKentta(); AsetaOhjaimet(); LisaaLaskurit(); AloitaPeli(); Lisää tässä vaiheessa "tyhjä" aliohjelma LisaaLaskurit, jotta koodi saadaan toimivaksi ja virheet pois: void LisaaLaskurit() //... 2. Laskurin luominen Laskureita tulee peliin kaksi, yksi kummallekin pelaajalle. Koska molemmat laskurit luodaan arvatenkin lähes samalla tavalla, kannattaa laskurin luomisesta tehdä aliohjelma. Pong-peli, vaihe 7 1

Kirjoita uusi aliohjelma LuoPisteLaskuri: IntMeter LuoPisteLaskuri() IntMeter laskuri = new IntMeter(0); laskuri.maxvalue = 10; return laskuri; Aliohjelman paluuarvon tyyppi on IntMeter, mikä tarkoittaa laskuria joka laskee kokonaisluvuilla (kokonaisluvun tyyppi on int). Laskurin konstruktorille (new IntMeter...) annetaan parametrina laskurin oletusarvo, mikä pistelaskun ollessa kyseessä on luonnollisesti nolla. Laskurille voi asettaa maksimiarvon (MaxValue), jonka jälkeen laskuri lopettaa pisteiden laskemisen. Se voi olla vaikkapa kymmenen. Pisteiden laskemiseen riittäisi toki pelkkä kokonaisluku, mutta IntMeter-tyyppiä käyttämällä päästään helpommalla kun pisteitä halutaan esittää ruudulla, kuten kohta nähdään. 3. Pisteiden esittäminen Pelkkä IntMeter-olio ei vielä näytä pisteitä, vaan ainoastaan säilyttää lukuarvon muistissa. Pisteiden esittämiseksi ruudulla tarvitaan vielä tekstikenttiä eli Labeleita. Tehdään pistelaskurin arvon näyttävä Label laskurin ohessa. Koska pelaajien laskurit tulevat eri kohtaan ruutua, viedään jälleen koordinaatit parametrina aliohjelmalle. Muokkaa LuoPisteLaskuri-aliohjelmaa: IntMeter LuoPisteLaskuri(double x, double y) IntMeter laskuri = new IntMeter(0); laskuri.maxvalue = 10; Label naytto = new Label(); naytto.bindto(laskuri); naytto.x = x; naytto.y = y; naytto.textcolor = Color.White; naytto.bordercolor = Level.Background.Color; naytto.color = Level.Background.Color; Add(naytto); return laskuri; Tekstikenttä sidotaan näyttämään laskurin arvoa kutsulla naytto.bindto(laskuri). Näin ruudulle päivittyy automaattisesti laskurin arvo, vaikka sitä jossain kohtaa muutetaan. 2. Laskurin luominen 2

Näytön väri asetetaan valkoiseksi, että se erottuu taustasta (naytto.textcolor = Color.White). 4. Laskureiden lisääminen peliin Koska laskureihin täytyy päästä käsiksi kohta, kun pisteitä lasketaan, tehdään niistä attribuutteja. Pohdittavaa: Miksei näyttöjä tarvitse lisätä attribuuteiksi? Lisää attribuutteihin IntMeter-tyyppiset muuttujat pelaajan1pisteet ja pelaajan2pisteet: public class Pong : PhysicsGame Vector nopeusylos = new Vector(0, 200); Vector nopeusalas = new Vector(0, -200); PhysicsObject pallo; PhysicsObject maila1; PhysicsObject maila2; IntMeter pelaajan1pisteet; IntMeter pelaajan2pisteet; public override void Begin() LuoKentta(); AsetaOhjaimet(); LisaaLaskurit(); AloitaPeli(); //... Meillä on jo tyhjä aliohjelma laskureiden luomiseksi. Lisää aliohjelmaan LisaaLaskurit laskureita luovan aliohjelman kutsuminen ja luotujen laskureiden sijoittaminen muuttujiin: void LisaaLaskurit() pelaajan1pisteet = LuoPisteLaskuri(Screen.Left + 100.0, Screen.Top - 100.0); pelaajan2pisteet = LuoPisteLaskuri(Screen.Right - 100.0, Screen.Top - 100.0); LuoPisteLaskuri-aliohjelmassa ensimmäinen parametri oli x-koordinaatti ja toinen y-koordinaatti. Näytölle lisättävien olioiden paikka ilmoitetaan ruudun, ei kentän, koordinaateissa. Laskureiden x-koordinaatit on laskettu käyttäen hyväksi ruudun vasemman ja oikean reunan x-koordinaatteja (Screen.Left ja Screen.Right). Y-koordinaatti lasketaan ruudun yläreunasta (Screen.Top) lukien. Kun nyt ajat ohjelman, pitäisi ruudun yläreunassa näkyä kaksi laskuria, jotka näyttävät arvoa 0. 3. Pisteiden esittäminen 3

5. Törmäyksen käsittely Jotta voisimme kasvattaa pisteitä, täytyisi tietää milloin pallo ohittaa jommankumman mailan. Tämä onnistuu siten, että tarkkaillaan sitä kun pallo osuu kentän vasempaan tai oikeaan reunaan. Törmäyksiin reagoimista varten Jypeli-kirjastossa on aliohjelma nimeltä AddCollisionHandler. AddCollisionHandler ottaa kaksi parametria: fysiikkaolio, jonka törmäyksiä kuunnellaan aliohjelma, jota kutsutaan kun olio törmää johonkin Lisää seuraavanlainen kutsu LuoKentta-aliohjelmaan, sen jälkeen kun pallo on luotu ja lisätty tasoon: AddCollisionHandler(pallo, KasittelePallonTormays); Aliohjelman, jossa törmäys käsitellään, täytyy olla aina seuraavanlainen: Paluuarvo on void (eli ei palauteta mitään). Parametreina on kaksi PhysicsObject-luokan oliota. Ensimmäinen parametri on se olio jonka törmäyksiä kuunnellaan, eli törmääjä (meillä se on siis pallo). Toinen parametri on törmäyksen kohde, jota ei vielä tunneta. Aliohjelman voi toki nimetä vapaasti, kunhan sama nimi annetaan parametrina AddCollisionHandler-kutsussa. Lisää siis seuraavanlainen aliohjelma: void KasittelePallonTormays(PhysicsObject pallo, PhysicsObject kohde) Kun törmäyksen käsittelevään aliohjelmaan tullaan, tiedetään vasta että pallo on törmännyt johonkin. Jotta selviää mihin se on törmännyt täytyy tehdä hiukan vertailua. Törmäys vasempaan reunaan selviää tarkastamalla onko törmäyksen kohde ja vasen reuna yksi ja sama olio. Miten tämä onnistuisi? Jotta vertailu olisi helppo suorittaa, meidän olisi hyvä saada kentän vasen reuna johonkin muuttujaan. Muutetaan koodia niin, että luodaan kenttään reunat yksitellen eikä kaikkia kerralla. Pyyhi LuoKentta-aliohjelmasta seuraava rivi: Level.CreateBorders(1.0, false); Tilalle kirjoita ensin vasemman reunan luonti tähän tapaan: 5. Törmäyksen käsittely 4

PhysicsObject vasenreuna = Level.CreateLeftBorder(); vasenreuna.restitution = 1.0; vasenreuna.isvisible = false; Reunan ominaisuudet täytyy nyt muuttaa halutuiksi jälkikäteen. Tee vasemman reunan luonnin perään samalla tavalla oikea reuna (CreateRightBorder), alareuna (CreateBottomBorder) ja yläreuna (CreateTopBorder). KasittelePallonTormays-aliohjelmassa voimme nyt tutkia onko törmäyksen kohde sama olio kuin muuttuja vasenreuna tai oikeareuna. Kun vertaillaan onko kaksi asiaa samaa, käytetään ==-merkintää. Jos pallo osuu oikeaan reunaan, kasvatetaan pelaajan 1 pistelaskurin arvoa (pelaajan1pisteet.value). Laskureiden arvo on niiden Value-ominaisuudessa. Vastaavasti vasen reuna. Lisää tarkistukset KasittelePallonTormays-aliohjelmaan: void KasittelePallonTormays(PhysicsObject pallo, PhysicsObject kohde) if (kohde == oikeareuna) pelaajan1pisteet.value += 1; else if (kohde == vasenreuna) pelaajan2pisteet.value += 1; Merkintä += tarkoittaa, että merkinnän vasemmalla puolella olevaan arvoon lisätään se mitä on merkinnän oikealla puolella. Toisen if-lauseen edessä sana else (suom. muuten) tarkoittaa sitä, että else-sanan jälkeen tuleva if-lause suoritetaan vain, jos sitä edeltävän if-lauseen ehto oli epätosi. Noista kahdesta if-lauseesta ei siis koskaan suoriteta molempia samalla kertaa. On myös hyvin mahdollista, että kumpaakaan niistä ei suoriteta, jos vaikkapa pallo osuu mailaan. Jotta oikeaan ja vasempaan reunaan päästään käsiksi KasittelePallonTormays-aliohjelmassa, ne täytyy taas lisätä attribuuttien joukkoon, josta ne näkyvät kaikille aliohjelmille. Tee vielä seuraavat muutokset: public class Pong : PhysicsGame Vector nopeusylos = new Vector(0, 200); Vector nopeusalas = new Vector(0, -200); 5. Törmäyksen käsittely 5

PhysicsObject pallo; PhysicsObject maila1; PhysicsObject maila2; PhysicsObject vasenreuna; PhysicsObject oikeareuna; IntMeter pelaajan1pisteet; IntMeter pelaajan2pisteet; //... void LuoKentta() pallo = new PhysicsObject(40.0, 40.0); pallo.shape = Shapes.Circle; pallo.x = -200.0; pallo.y = 0.0; pallo.restitution = 1.0; Add(pallo); AddCollisionHandler(pallo, KasittelePallonTormays); maila1 = LuoMaila(Level.Left + 20.0, 0.0); maila2 = LuoMaila(Level.Right - 20.0, 0.0); PhysicsObject vasenreuna = Level.CreateLeftBorder(); vasenreuna.restitution = 1.0; vasenreuna.isvisible = false; PhysicsObject oikeareuna = Level.CreateRightBorder(); oikeareuna.restitution = 1.0; oikeareuna.isvisible = false; PhysicsObject ylareuna = Level.CreateTopBorder(); ylareuna.restitution = 1.0; ylareuna.isvisible = false; PhysicsObject alareuna = Level.CreateBottomBorder(); alareuna.restitution = 1.0; alareuna.isvisible = false; Level.Background.Color = Color.Black; Camera.ZoomToLevel(); //... 6. Hienosäätöä Pallo ei ehkä nyt käyttäydy aivan toivomallamme tavalla. Voit yrittää hienosäätää pelin pelattavuutta esimerkiksi pallon ominaisuuksia muuttamalla. Tutki mitä tekevät sen KineticFriction ja CanRotate ominaisuudet ja kokeile muuttaa niitä. Vaikuttaako pelikokemukseen? Jos pallo myös hidastuu mielestäsi ärsyttävästi, voit kokeilla fysiikan bugien korjausta?tämän kikan avulla. 6. Hienosäätöä 6

7. Lopputulos Pong-pelin koodi kaikkine mailoineen ja pistelaskuineen näyttää nyt suunnilleen tältä: ing System; ing System.Collections.Generic; ing System.Linq; ing System.Text; ing Jypeli; ing Jypeli.Assets; ing Jypeli.Controls; ing Jypeli.Effects; ing Jypeli.Widgets; blic class Pong : PhysicsGame Vector nopeusylos = new Vector(0, 200); Vector nopeusalas = new Vector(0, -200); PhysicsObject pallo; PhysicsObject maila1; PhysicsObject maila2; PhysicsObject vasenreuna; PhysicsObject oikeareuna; IntMeter pelaajan1pisteet; IntMeter pelaajan2pisteet; public override void Begin() LuoKentta(); AsetaOhjaimet(); LisaaLaskurit(); AloitaPeli(); void LuoKentta() pallo = new PhysicsObject(40.0, 40.0); pallo.shape = Shape.Circle; pallo.x = -200.0; pallo.y = 0.0; pallo.restitution = 1.0; pallo.kineticfriction = 0.0; pallo.momentofinertia = Double.PositiveInfinity; Add(pallo); AddCollisionHandler(pallo, KasittelePallonTormays); maila1 = LuoMaila(Level.Left + 20.0, 0.0); maila2 = LuoMaila(Level.Right - 20.0, 0.0); vasenreuna = Level.CreateLeftBorder(); vasenreuna.restitution = 1.0; vasenreuna.kineticfriction = 0.0; vasenreuna.isvisible = false; oikeareuna = Level.CreateRightBorder(); oikeareuna.restitution = 1.0; oikeareuna.kineticfriction = 0.0; 7. Lopputulos 7

oikeareuna.isvisible = false; PhysicsObject ylareuna = Level.CreateTopBorder(); ylareuna.restitution = 1.0; ylareuna.kineticfriction = 0.0; ylareuna.isvisible = false; PhysicsObject alareuna = Level.CreateBottomBorder(); alareuna.restitution = 1.0; alareuna.isvisible = false; alareuna.kineticfriction = 0.0; Level.BackgroundColor = Color.Black; Camera.ZoomToLevel(); PhysicsObject LuoMaila(double x, double y) PhysicsObject maila = PhysicsObject.CreateStaticObject(20.0, 100.0); maila.shape = Shape.Rectangle; maila.x = x; maila.y = y; maila.restitution = 1.0; maila.kineticfriction = 0.0; Add(maila); return maila; void LisaaLaskurit() pelaajan1pisteet = LuoPisteLaskuri(Screen.Left + 100.0, Screen.Top - 100.0); pelaajan2pisteet = LuoPisteLaskuri(Screen.Right - 100.0, Screen.Top - 100.0); IntMeter LuoPisteLaskuri(double x, double y) IntMeter laskuri = new IntMeter(0); laskuri.maxvalue = 10; Label naytto = new Label(); naytto.bindto(laskuri); naytto.x = x; naytto.y = y; naytto.textcolor = Color.White; naytto.bordercolor = Level.BackgroundColor; naytto.color = Level.BackgroundColor; Add(naytto); return laskuri; void KasittelePallonTormays(PhysicsObject pallo, PhysicsObject kohde) if (kohde == oikeareuna) pelaajan1pisteet.value += 1; else if (kohde == vasenreuna) pelaajan2pisteet.value += 1; 7. Lopputulos 8

void AloitaPeli() Vector impulssi = new Vector(500.0, 0.0); pallo.hit(impulssi); void AsetaOhjaimet() Keyboard.Listen(Key.A, ButtonState.Down, AsetaNopeus, "Pelaaja 1: Liikuta mailaa ylös", maila1, nopeusyl Keyboard.Listen(Key.A, ButtonState.Released, AsetaNopeus, null, maila1, Vector.Zero); Keyboard.Listen(Key.Z, ButtonState.Down, AsetaNopeus, "Pelaaja 1: Liikuta mailaa alas", maila1, nopeusal Keyboard.Listen(Key.Z, ButtonState.Released, AsetaNopeus, null, maila1, Vector.Zero); Keyboard.Listen(Key.Up, ButtonState.Down, AsetaNopeus, "Pelaaja 2: Liikuta mailaa ylös", maila2, nopeusy Keyboard.Listen(Key.Up, ButtonState.Released, AsetaNopeus, null, maila2, Vector.Zero); Keyboard.Listen(Key.Down, ButtonState.Down, AsetaNopeus, "Pelaaja 2: Liikuta mailaa alas", maila2, nopeu Keyboard.Listen(Key.Down, ButtonState.Released, AsetaNopeus, null, maila2, Vector.Zero); Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet"); Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); ControllerOne.Listen(Button.DPadUp, ButtonState.Down, AsetaNopeus, "Liikuta mailaa ylös", maila1, nopeus ControllerOne.Listen(Button.DPadUp, ButtonState.Released, AsetaNopeus, null, maila1, Vector.Zero); ControllerOne.Listen(Button.DPadDown, ButtonState.Down, AsetaNopeus, "Liikuta mailaa alas", maila1, nope ControllerOne.Listen(Button.DPadDown, ButtonState.Released, AsetaNopeus, null, maila1, Vector.Zero); ControllerTwo.Listen(Button.DPadUp, ButtonState.Down, AsetaNopeus, "Liikuta mailaa ylös", maila2, nopeus ControllerTwo.Listen(Button.DPadUp, ButtonState.Released, AsetaNopeus, null, maila2, Vector.Zero); ControllerTwo.Listen(Button.DPadDown, ButtonState.Down, AsetaNopeus, "Liikuta mailaa alas", maila2, nope ControllerTwo.Listen(Button.DPadDown, ButtonState.Released, AsetaNopeus, null, maila2, Vector.Zero); ControllerOne.Listen(Button.Back, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); ControllerTwo.Listen(Button.Back, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); void AsetaNopeus(PhysicsObject maila, Vector nopeus) if ((nopeus.y < 0) && (maila.bottom < Level.Bottom)) maila.velocity = Vector.Zero; return; if ((nopeus.y > 0) && (maila.top > Level.Top)) maila.velocity = Vector.Zero; return; maila.velocity = nopeus; 7. Lopputulos 9