Muilla kielillä: English Suomi Pong-peli, vaihe 6 Tässä vaiheessa parantelemme mailojen liikuttelua ja tutustumme if-lauseeseen. 1. Rajojen tarkistus Edellisessä oppaassa laitoimme mailat liikkumaan, mutta pieni puute mailojen liikuttamiseen jäi. Nimittäin mailaa voi liikutella ylös- ja alaspäin rajattomasti! Ei ole varmaankaan hyödyllistä eikä toivottavaa, että mailat voivat mennä pelikentän ulkopuolelle. Tämän korjaamiseksi mailaa pitäisi voida liikuttaa ylöspäin vain silloin, kun se ei ole mennyt kentän yläreunan yli. Vastaavasti alaspäin liikuttaminen pitäisi olla mahdollista vain, kun maila ei ole mennyt alarajan ali. 1.1. Yläreunan tarkistus Mietitään algoritmi eli ohje, jolla saisimme mailan pysymään kentän sisäpuolella. Käsitellään ongelmaa ensin vain kentän yläreunalle ja mietitään alareunaa myöhemmin. Pitäisi lisätä ohjelmakoodiin ehto, jonka mukaan: Jos maila on yläreunan yli, niin pysäytetään maila. Muuten liikutetaan mailaa normaalisti. Tällainen tietyllä ehdolla suoritettava koodi voidaan toteuttaa ohjelmoinnissa if-lauseella. If-lause muodostuu ehdosta, ja koodiriveistä jotka suoritetaan vain jos ehto on totta. If-lauseen perässä olevien aaltosulkujen väliin kirjoitetaan ne koodirivit, jotka halutaan suorittaa vain jos annettu ehto toteutuu. Lisää seuraava if-lause AsetaNopeus-aliohjelmaan: if (maila.top > Level.Top) Pong-peli, vaihe 6 1
Mailan ja kentän yläreunojen y-koordinaatit saadaan niiden Top-ominaisuudesta. Ehdossa katsotaan, onko mailan yläreuna kentän yläreunan yläpuolella: Jos on, niin pysäytetään maila ja return-lauseella tullaan pois aliohjelmasta. Jos ei, niin if-lauseen perässä olevien aaltosulkujen välissä olevia koodirivejä ei suoriteta vaan asetetaan mailalle nopeus normaaliin tapaan. Pysähtyykö maila yläreunaan? Taitaa kyllä pysähtyä, mutta... Miksi maila ei enää liiku kun se kerran saavuttaa yläreunan? Mieti hetki, ennen kuin jatkat eteenpäin. 1.2. Toinen yritys Mailat lopettivat liikkumisen, kun ne saavuttivat kentän yläreunan. Vaikka yritämme yläreunan saavuttamisen jälkeen liikuttaa mailaa alaspäin, mailan yläreuna on yhä kentän yläreunan yläpuolella. If-lauseemme ehto siis toteutuu yhä ja maila pysäytetään. Täytyy siis lisätä vielä yksi ehto edelliseen algoritmiimme: Jos nopeuden suunta on ylöspäin ja jos maila on yläreunan yli, niin pysäytetään maila. Muuten liikutetaan mailaa normaalisti. Lisätään toinen ehto samaan if-lauseeseen AsetaNopeus-aliohjelmaan: if ((nopeus.y > 0) && (maila.top > Level.Top)) Tässä käytettiin if-lauseessa merkintää (nopeus.y > 0) && (maila.top > Level.Top). Tässä merkit && voi lukea sanana "ja". 1.1. Yläreunan tarkistus 2
Ehdon voisi nyt lukea: "Nopeuden y-koordinaatti on suurempi kuin nolla JA mailan yläreunan y-koordinaatti on suurempi kuin kentän yläreunan y-koordinaatti". Täältä lisätietoa ehtolauseisiin liittyen. 2. Alareunan tarkistus Nyt kun mailan liikuttelu ylöspäin on kunnossa, tee sama alaspäin liikuttamiselle. Nyt vastaavasti tarkistetaan, onko suunta alaspäin ja onko mailan alareunan y-koordinaatti pienempi kuin kentän alareunan y-koordinaatti. AsetaNopeus näyttää muutosten jälkeen tältä: if ((nopeus.y < 0) && (maila.bottom < Level.Bottom)) if ((nopeus.y > 0) && (maila.top > Level.Top)) 3. XBox-ohjainten lisääminen (valinnainen) Jos haluat, voit lisätä ohjauksen XBox-360-ohjaimille seuraavasti. Muuten voit hypätä tutoriaalin seuraavaan vaiheeseen. XBox-ohjainten napit voidaan asettaa helposti käyttämällä samantapaista Listen-aliohjelmaa kuin näppäimistön nappien asettamisessa. Ainoa ero on, että tällä kertaa ei kutsuta Keyboard.Listen-aliohjelmaa vaan ControllerX.Listen-aliohjelmaa. (X:n paikalle ohjaimen numero: One, Two, Three tai Four), esimerkiksi ControllerOne.Listen kutsuu ohjainta, joka on asetettu ykkösohjaimeksi. ControllerOne.Listen ottaa ensimmäisenä parametrina XBox-ohjaimen napin, jota halutaan kuunnella, esimerkiksi Button.X tarkoittaa ohjaimen X-nappia. Tässä tapauksessa voidaan käyttää samaa AsetaNopeus-aliohjelmaa myös XBox-ohjaimille. Lisää XBox-ohjainten asetus samaan AsetaOhjaimet-aliohjelmaan: d AsetaOhjaimet() Keyboard.Listen( Key.A, ButtonState.Down, AsetaNopeus, "Pelaaja 1: Liikuta mailaa ylös", maila1, nopeusylos ) Keyboard.Listen( Key.A, ButtonState.Released, AsetaNopeus, null, maila1, Vector.Zero ); Keyboard.Listen( Key.Z, ButtonState.Down, AsetaNopeus, "Pelaaja 1: Liikuta mailaa alas", maila1, nopeusalas ) 1.2. Toinen yritys 3
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, nopeusylos Keyboard.Listen( Key.Up, ButtonState.Released, AsetaNopeus, null, maila2, Vector.Zero ); Keyboard.Listen( Key.Down, ButtonState.Down, AsetaNopeus, "Pelaaja 2: Liikuta mailaa alas", maila2, nopeusala 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, nopeusylos ControllerOne.Listen( Button.DPadUp, ButtonState.Released, AsetaNopeus, null, maila1, Vector.Zero ); ControllerOne.Listen( Button.DPadDown, ButtonState.Down, AsetaNopeus, "Liikuta mailaa alas", maila1, nopeusal ControllerOne.Listen( Button.DPadDown, ButtonState.Released, AsetaNopeus, null, maila1, Vector.Zero ); ControllerTwo.Listen( Button.DPadUp, ButtonState.Down, AsetaNopeus, "Liikuta mailaa ylös", maila2, nopeusylos ControllerTwo.Listen( Button.DPadUp, ButtonState.Released, AsetaNopeus, null, maila2, Vector.Zero ); ControllerTwo.Listen( Button.DPadDown, ButtonState.Down, AsetaNopeus, "Liikuta mailaa alas", maila2, nopeusal 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" ); 4. Lopputulos Tähän asti pelimme näyttää 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; public override void Begin() LuoKentta(); AsetaOhjaimet(); AloitaPeli(); void LuoKentta() pallo = new PhysicsObject(40.0, 40.0); pallo.shape = Shape.Circle; pallo.x = -200.0; 3. XBox-ohjainten lisääminen (valinnainen) 4
pallo.y = 0.0; pallo.restitution = 1.0; Add(pallo); maila1 = LuoMaila(Level.Left + 20.0, 0.0); maila2 = LuoMaila(Level.Right - 20.0, 0.0); Level.CreateBorders(1.0, false); 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; Add(maila); return maila; 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"); if ((nopeus.y < 0) && (maila.bottom < Level.Bottom)) 4. Lopputulos 5
if ((nopeus.y > 0) && (maila.top > Level.Top)) 4. Lopputulos 6