1. Taustatietoa näppäimistönkuuntelusta

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

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

1. Miten tehdään peliin toinen maila?

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

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

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

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

Jypelin käyttöohjeet» Ruutukentän luominen

Apuja ohjelmointiin» Yleisiä virheitä

Ohjelmoinnin jatkokurssi, kurssikoe

Jypelin käyttöohjeet» Ruutukentän luominen

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

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Alkuun HTML5 peliohjelmoinnissa

Olio-ohjelmointi Javalla

ITKP102 Ohjelmointi 1 (6 op)

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

ITKP102 Ohjelmointi 1 (6 op)

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

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

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

ITKP102 Ohjelmointi 1 (6 op)

Metodien tekeminen Javalla

Tasohyppelypeli. Piirrä grafiikat. Toteuta pelihahmon putoaminen ja alustalle jääminen:

Mikä yhteyssuhde on?

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

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

7. Oliot ja viitteet 7.1

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

1. Mitä tehdään ensiksi?

Scratch ohjeita. Perusteet

Javan perusteita. Janne Käki

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

Taulukot. Jukka Harju, Jukka Juslin

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

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Osa 7: Hahmojen ohjelmointi ja hienosäätö

Tekstinkäsittelyn jatko Error! Use the Home tab to apply Otsikko 1 to the text that you want to appear here. KSAO Liiketalous 1

ITKP102 Ohjelmointi 1 (6 op)

C# Windows ohjelmointi perusopas

C# olio-ohjelmointi perusopas

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Listarakenne (ArrayList-luokka)

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointi 2, välikoe

JUnit ja EasyMock (TilaustenKäsittely)

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

ISIS Draw (Windows versio 2.5)

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

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

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

Lupa opetuskäyttöön pyydettävä. Näppäimistö. Kohdistimen ohjausnäppäimistö. Funktionäppäimistö. Kirjoitusnäppäimistö

1 Tehtävän kuvaus ja analysointi

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

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

9. Periytyminen Javassa 9.1

7. Näytölle tulostaminen 7.1

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

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

Ohjelmoinnin perusteet, syksy 2006

Interaktiivinen tarinankerronta

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

Ampumahiihto. Hiihto. Pelihahmon piirtäminen. Jos tahdot animoida hiihtämisen, Peli muodostuu kahdesta erilaisesta osasta: ensin

Autotallin ovi - Tehtävänanto

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

Pikanäppäin Yhdistelmiä. Luku 6 Pikanäppäimet

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

Java-kielen perusteita

Testivetoinen ohjelmistokehitys

Olio-ohjelmointi Syntaksikokoelma

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmoinnin perusteet Y Python

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

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

15. Ohjelmoinnin tekniikkaa 15.1

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

UML ja luokkien väliset suhteet

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

Java-kielen perusteet

Taulukoiden käsittely Javalla

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

Texture Tekstuuri Peliolion päälle piirrettävä kuva. Update Päivittää Päivittää jotain, esimerkiksi pelin tilannetta.

Luokan sisällä on lista

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

Luokan muodostimet (Constructors)

PERUSLASKUJA. Kirjoita muuten sama, mutta ota välilyönti 4:n jälkeen 3/4 +5^2

Ohjelmointi Tunnilla 1 (5) Viikko 7 tuntitehtäviä: metodien tekeminen Javalla

Luokat ja oliot. Ville Sundberg

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

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

Racket ohjelmointia II. Tiina Partanen 2015

Eye Pal Solo. Käyttöohje

TEHTÄVIEN RATKAISUT. b) 105-kiloisella puolustajalla on yhtä suuri liikemäärä, jos nopeus on kgm 712 p m 105 kg

3.4 Liike-energiasta ja potentiaalienergiasta

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

"PLEXTALK Pocket" -verkkosoittimen pikaopas

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

Harjoitustyö: virtuaalikone

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Transkriptio:

Muilla kielillä: English Suomi Pong-peli, vaihe 5 Tämä on Pong-pelin tutoriaalin osa 5/7. Tämän vaiheen aikana Lisäämme peliin näppäimet Laitetaan mailat liikkumaan pelaajien ohjaamina Näin ohjelmaamme voi jo kutsua peliksi :). 1. Taustatietoa näppäimistönkuuntelusta Jos ymmärrät jo, kuinka näppäimistönkuuntelu toimii, voit hypätä kohtaan 2. Pelissämme on ollut alusta saakka nappi, josta pelin saa lopetettua. Lopetusnappi on asetettu Begin-aliohjelmassa. Pelin lopettamisen nappi on siis tehty siten, että näppäimistöltä kuunnellaan Esc-nappia, ja kun sitä painetaan, kutsutaan aliohjelmaa ConfirmExit: (Tätä ei tarvitse kirjoittaa uudestaan.) public override void Begin() LuoKentta(); AloitaPeli(); Muita näppäimiä saa asetettua vastaavalla tavalla. Omien näppäinten asettamista varten tutkitaan hieman tarkemmin, miten lopetusnappi on tehty. 1. Taustatietoa näppäimistönkuuntelusta 1

Aliohjelmaa Keyboard.Listen kutsumalla saadaan peli kuuntelemaan näppäimistön painalluksia. Listen-aliohjelmalle annetaan seuraavat parametrit: Ensimmäinen parametri kertoo mitä näppäintä kuunnellaan. Lopetusnapissa se on `Key.Escape` eli Esc-näppäin. Toinen parametri määrittää minkälaisia näppäinten tapahtumia halutaan kuunnella ja sillä on neljä mahdollista arvoa: ButtonState.Released: Näppäin on juuri vapautettu ButtonState.Pressed: Näppäin on juuri painettu alas ButtonState.Up: Näppäin on ylhäällä (vapautettuna) ButtonState.Down: Näppäin on alaspainettuna Kolmas parametri on sen aliohjelman nimi, jota kutsutaan kun näppäimen on siinä tilassa, mitä kuunnellaan. ConfirmExit on valmis aliohjelma, jota kutsumalla peli kysyy halutaanko se lopettaa. Kolmas parametri voi olla myös itse kirjoitettu aliohjelma. Neljäs parametri on ohjeteksti, joka voidaan näyttää pelaajalle pelin alussa. Tässä tarvitsee vain kertoa mitä tapahtuu kun näppäintä painetaan. Ohjetekstin tyyppi on string eli merkkijono eli tekstiä. Teksti kirjoitetaan lainausmerkeissä ". Tämän parametrin arvo voi olla myös null eli tyhjä. Lopuksi Listen-aliohjelmalle voi antaa lisääkin parametreja sen mukaan mitä pelissä tarvitaan. Nämä ylimääräiset parametrit välitetään näppäintä kuuntelevalle aliohjelmalle. 2. Ohjainten asettaminen Koska näppäinten asettaminen on uusi selkeä kokonaisuus, tehdään siitä oma aliohjelma. Lisää ohjelmakoodiin uusi aliohjelma nimeltä AsetaOhjaimet ja siirrä lopetusnapin tekevä rivi sinne: Lisää AsetaOhjaimet-aliohjelman kutsu Beginiin. Ohjaimet on loogista asettaa ennen kuin peli aloitetaan, joten kirjoita AsetaOhjaimet-aliohjelman kutsu LuoKentta ja AloitaPeli -aliohjelmien kutsujen väliin. Begin näyttää muutosten jälkeen tältä: public override void Begin() LuoKentta(); AsetaOhjaimet(); AloitaPeli(); 2. Ohjainten asettaminen 2

Pong-pelissä mailan ohjaamisen ideana on, että mailaa liikkuu ylös, kun jokin näppäin on pohjassa. Kun näppäin päästetään pohjasta, maila pysähtyy. Vaikka emme vielä tarkalleen tiedä miten saamme mailat liikkumaan, tehdään näppäimen kuuntelut toisen mailan liikuttamiseksi ylöspäin. Toivomme että toinen maila liikkuisi ylöspäin näppäimellä A. Kirjoita kaksi Listen-aliohjelman kutsua lisää AsetaOhjaimet-aliohjelmaan mailan liikuttamista varten: Keyboard.Listen(Key.A, ButtonState.Down, LiikutaMaila1Ylos, "Pelaaja 1: Liikuta mailaa ylös"); Keyboard.Listen(Key.A, ButtonState.Released, PysaytaMaila1, null); Kuunnellaan näppäintä `Key.A` eli A-näppäintä. Ensimmäisessä kutsussa kerrotaan aliohjelma (LiikutaMaila1Ylos), johon tullaan kun näppäin on pohjassa (ButtonState.Down). Toisessa kutsussa kerrotaan mitä tehdään (PysaytaMaila1), kun näppäin vapautetaan (ButtonState.Released). Emme ole vielä toteuttaneet tällaisia aliohjelmia, mutta mietitään sitä vasta seuraavaksi. 3. Aliohjelma mailan liikuttamiseksi Koska maila on fysiikkaolio, sen yhtenä ominaisuutena on nopeus (engl. velocity). Jos vain asetamme mailalle jonkin nopeuden, fysiikkapeli hoitaa mailan paikan muuttamisen. Nopeus esitetään vektorina. Vektorin x-arvo kertoo mailan nopeuden vaakasuunnassa ja y-arvo pystysuunnassa. Millaisia vektoreita siis tarvitsemme mailan liikuttamiseen ylös ja alas? Entä miten voisimme ilmaista mailan pysäyttämisen? Tarvitsemme kolme eri nopeusvektoria: Ylöspäin: nopeuden x-arvo nolla ja y-arvo positiivinen Alaspäin: nopeuden x-arvo nolla ja y-arvo negatiivinen Pysähtyminen: nopeuden x- ja y-arvot molemmat nolla eli nollavektori Koska lisäksi mailoja on kaksi, voisimme toteuttaa mailojen liikuttamisen kuudella eri aliohjelmaa: LiikutaMaila1Ylos, LiikutaMaila2Ylos, LiikutaMaila1Alas, LiikutaMaila2Alas, PysaytaMaila1 ja PysaytaMaila2. Tarkemmin ajateltuna kaikki aliohjelmat tekevät kuitenkin samaa asiaa: asettavat mailalle nopeuden. Erilaista on vain maila jolle nopeus asetetaan ja nopeuden suunta. 3. Aliohjelma mailan liikuttamiseksi 3

Viemällä liikutettavan mailan parametrina selviämme mailojen liikuttamisesta vain kolmella aliohjelmalla: LiikutaMailaaYlos, LiikutaMailaaAlas ja PysaytaMaila. Älä kirjoita alla olevia aliohjelmia itse. Kun jälleen tarkastellaan kolmea aliohjelmaamme, huomataan että jokaisessa edelleen toistuu vektorin luominen ja sen asettaminen mailalle nopeudeksi. Erilaista on vain millainen vektori nopeudeksi asetetaan. Jos myös nopeus vietäisiin parametrina, selviäisimme mailojen liikuttamisesta yhdellä ainoalla aliohjelmalla! Mailojen liikuttamisen voimme siis hoitaa kuuden aliohjelman sijaan yhdellä aliohjelmalla AsetaNopeus, jolle annetaan parametrina maila jota liikutetaan, ja mailan nopeuden vektori. Kirjoita siis aliohjelma AsetaNopeus ja sille alla oleva koodi: void AsetaNopeus(PhysicsObject maila, Vector nopeus) maila.velocity = nopeus; 3.1. Mailat ja vektorit attribuuteiksi Listen-aliohjelmalle voi antaa mitä tahansa omia parametrejä pakollisten parametrien jälkeen. Nämä parametrit toimitetaan näppäintä kuuntelevalle aliohjelmalle. Tehdään mailoille ja vektoreille muuttujat, jotka voimme antaa parametreina mailan liikuttamisesta vastaavalle aliohjelmalle. Jotta muuttujat näkyisivät AsetaOhjaimet-aliohjelmalle, tehdään niistäkin attribuutteja. Esittele luokan alussa uudet attribuutit, maila1 ja maila2 sekä luo uudet vektorit nopeusylos ja nopeusalas: public 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(); 3.1. Mailat ja vektorit attribuuteiksi 4

AsetaOhjaimet(); AloitaPeli(); 3.2. Mailojen sijoitus attribuutteihin Jotta luomamme mailat menevät attribuutteihin maila1 ja maila2, täytyy ne sijoittaa niihin. Muokkaa tätä varten LuoMaila-aliohjelmaa niin, että se palauttaa siellä luodun mailan: 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; Ennen muutosta aliohjelman nimen edessä oli sana void sen merkiksi, että aliohjelma ei palauta minkään tyyppistä tietoa. Koska nyt aliohjelma palauttaa mailan, joka on tyyppiä PhysicsObject, vaihdettiin se void:in tilalle. Aliohjelman loppuun lisättiin return-lause, joka palauttaa luodun mailan. Muokkaa LuoKentta-aliohjelmaa niin, että luodut mailat sijoitetaan muuttujiin maila1 ja maila2: 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; Add(pallo); maila1 = LuoMaila(Level.Left + 20.0, 0.0); maila2 = LuoMaila(Level.Right - 20.0, 0.0); Level.CreateBorders(1.0, false); Level.Background.Color = Color.Black; Camera.ZoomToLevel(); LuoMaila-aliohjelman tekemät mailat saadaan otettua talteen muuttujiin sen takia, että LuoMaila palauttaa tehdyn mailan. Ilman palauttamista maila kyllä tehtäisiin, mutta emme luomisen jälkeen pystyisi enää viittaamaan siihen millään tavalla. Nyt meillä on olemassa mailat maila1 ja maila2, jotka näkyvät kaikille aliohjelmille. 3.2. Mailojen sijoitus attribuutteihin 5

3.3. Maila liikkumaan ylöspäin Muuta lopuksi AsetaOhjaimet-aliohjelman Listen-kutsuja niin, että suoritetaan AsetaNopeus-aliohjelmaa ja viedään sille parametrina se maila, johon halutaan vaikuttaa, ja se vektori, joka halutaan mailalle asettaa nopeudeksi: Keyboard.Listen(Key.A, ButtonState.Down, AsetaNopeus, "Pelaaja 1: Liikuta mailaa ylös", maila Keyboard.Listen(Key.A, ButtonState.Released, AsetaNopeus, null, maila1, Vector.Zero); (Ellei pelisi toimi, yritä selvittää mistä vika johtuu, tai pyydä ohjaajaa auttamaan.) 4. Molempien mailojen liikuttaminen Molempien mailojen liikuttaminen voidaan nyt tehdä helposti vain lisäämällä Keyboard.Listen-kutsuja. Täydennä AsetaOhjaimet-aliohjelmaasi vielä seuraavat vihreällä merkityt Listen-kutsut. Keyboard.Listen(Key.A, ButtonState.Down, AsetaNopeus, "Pelaaja 1: Liikuta mailaa Keyboard.Listen(Key.A, ButtonState.Released, AsetaNopeus, null, Keyboard.Listen(Key.Z, ButtonState.Down, AsetaNopeus, "Pelaaja 1: Liikuta mailaa Keyboard.Listen(Key.Z, ButtonState.Released, AsetaNopeus, null, Keyboard.Listen(Key.Up, ButtonState.Down, AsetaNopeus, "Pelaaja 2: Liikuta mailaa Keyboard.Listen(Key.Up, ButtonState.Released, AsetaNopeus, null, Keyboard.Listen(Key.Down, ButtonState.Down, AsetaNopeus, "Pelaaja 2: Liikuta mailaa Keyboard.Listen(Key.Down, ButtonState.Released, AsetaNopeus, null, Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet"); Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli"); Kuten nyt nähdään, mailan ja nopeuden vieminen parametrina Keyboard.Listen-aliohjelmalle oli todella hyödyllistä, sillä voimme nyt helposti lisätä ohjauksen useammalle kuin yhdelle mailalle emmekä tarvitse ohjaamiseen kuin yhden aliohjelman. Kokeile miten pelisi toimii! 4. Molempien mailojen liikuttaminen 6

5. Lopputulos Kun mailojen ohjaaminen on mukana, näyttää koodi seuraavalta: 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; 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() 5. Lopputulos 7

Vector impulssi = new Vector(500.0, 0.0); pallo.hit(impulssi); 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"); void AsetaNopeus(PhysicsObject maila, Vector nopeus) maila.velocity = nopeus; 5. Lopputulos 8