Changes between Version 27 and Version 28 of Pong/Vaihe7


Ignore:
Timestamp:
2012-06-20 12:43:18 (7 years ago)
Author:
juiitamm
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Pong/Vaihe7

    v27 v28  
    157157void LisaaLaskurit() 
    158158{ 
    159     pelaajan1Pisteet = LuoPisteLaskuri( Screen.Left + 100.0, Screen.Top - 100.0 ); 
    160     pelaajan2Pisteet = LuoPisteLaskuri( Screen.Right - 100.0, Screen.Top - 100.0 ); 
     159    pelaajan1Pisteet = LuoPisteLaskuri(Screen.Left + 100.0, Screen.Top - 100.0); 
     160    pelaajan2Pisteet = LuoPisteLaskuri(Screen.Right - 100.0, Screen.Top - 100.0); 
    161161} 
    162162}}} 
     
    191191 [[Image(source:/trunk/help_symbols/does_not_work_yet.png, nolink)]] 
    192192 
    193 Aliohjelman, jossa törmäys käsitellään, '''täytyy olla''' aina seuraavanlainen: Paluuarvo on `void` (eli ei palauteta mitään) ja 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.  
     193Aliohjelman, jossa törmäys käsitellään, '''täytyy olla''' aina seuraavanlainen:  
     194 * Paluuarvo on `void` (eli ei palauteta mitään). 
     195 * Parametreina on kaksi `PhysicsObject`-luokan oliota.  
     196  * Ensimmäinen parametri on se olio jonka törmäyksiä kuunnellaan, eli törmääjä (meillä se on siis pallo).  
     197  * Toinen parametri on törmäyksen kohde, jota ei vielä tunneta.  
    194198 
    195199Aliohjelman voi toki nimetä vapaasti, kunhan sama nimi annetaan parametrina `AddCollisionHandler`-kutsussa. 
     200 
     201'''Lisää''' siis seuraavanlainen aliohjelma: 
    196202{{{ 
    197203#!C# 
    198204void KasittelePallonTormays(PhysicsObject pallo, PhysicsObject kohde) 
    199205{ 
    200 } 
    201 }}} 
    202  
    203 __Kun törmäyksen käsittelevään aliohjelmaan tullaan, tiedetään vasta että pallo on törmännyt '''johonkin'''__. 
    204  
    205 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? 
    206  
    207 Jotta vertailu olisi helppo suorittaa, meidän täytyy taas hiukan muuttaa aiempaa koodia. Kun aiemmin loimme kenttään kaikki reunat kutsumalla `Level.CreateBorders`-aliohjelmaa, emme saaneet paluuarvona minkäänlaista viittausta luotuihin reunoihin. Jokaiselle reunalle on kuitenkin olemassa oma aliohjelma, joka luo sen. Lisäksi nuo aliohjelmat palauttavat luodun olion, jonka voimme vaikkapa sijoittaa johonkin muuttujaan. Esimerkiksi pelkkä vasen reuna luodaan aliohjelmakutsulla `Level.CreateLeftBorder`. Tämä aliohjelma ei ota vastaan parametreja.  
    208  
    209 Etsi `LuoKentta`-aliohjelmasta seuraava rivi: 
    210 {{{ 
    211 #!C# 
    212 Level.CreateBorders( 1.0, false ); 
    213 }}} 
    214  
    215 '''Korvataan''' tämä rivi. Sen paikalle luodaan reunat uudestaan yksitellen. Tehdään ensin vasen reuna tähän tapaan: 
    216  
     206 
     207} 
     208}}} 
     209 
     210Kun törmäyksen käsittelevään aliohjelmaan tullaan, tiedetään vasta että pallo on törmännyt '''johonkin'''. 
     211 
     212Jotta selviää mihin se on törmännyt täytyy tehdä hiukan vertailua.  
     213 
     214Törmäys vasempaan reunaan selviää tarkastamalla onko törmäyksen kohde ja vasen reuna yksi ja sama olio. Miten tämä onnistuisi? 
     215 
     216Jotta vertailu olisi helppo suorittaa, meidän olisi hyvä saada kentän vasen reuna johonkin muuttujaan. 
     217 
     218Muutetaan koodia niin, että luodaan kenttään reunat yksitellen eikä kaikkia kerralla. 
     219 
     220'''Pyyhi''' `LuoKentta`-aliohjelmasta seuraava rivi: 
     221{{{ 
     222#!C# 
     223Level.CreateBorders(1.0, false); 
     224}}} 
     225 
     226'''Tilalle kirjoita''' ensin vasemman reunan luonti tähän tapaan: 
    217227{{{ 
    218228#!C# 
     
    222232}}} 
    223233 
    224 Aliohjelma `CreateLeftBorder` ei ota vastaan parametreja kuten `CreateBorders`, joten reunan ominaisuudet täytyy muuttaa halutuiksi jälkikäteen. `CreateLeftBorder`:in paluuarvona on luotu reunaolio. Koska reuna on tyyppiä `PhysicsObject`, sijoitetaan `CreateLeftBorder`:in palauttama olio sen tyyppiseen muuttujaan nimeltä vasenReuna. Muuttujan avulla reunan ominaisuuksia voidaan muuttaa. 
    225  
    226 '''Tee''' vasemman reunan luonnin perään '''samalla tavalla''' oikea reuna (`CreateRightBorder`), alareuna (`CreateBottomBorder`) ja yläreuna (`CreateTopBorder`). 
    227  
    228 Nyt törmäyksen kohteen tarkistaminen on helppoa. Voidaan tehdä yksinkertainen yhtäsuuruusvertailu `==`-merkintää käyttäen (Muista, yhtäsuuruus on C#:ssa kaksi `=`-merkkiä!) kuten tässä:  
    229 {{{ 
    230 #!C# 
    231 if ( kohde == vasenReuna ) 
    232 { 
    233     // ... 
    234 } 
    235 }}} 
    236  
    237 Kun törmäyksen kohde on tiedossa, on pisteiden kasvattaminen helppoa. Jos pallo osuu oikeaan reunaan, kasvatetaan pelaajan 1 pisteitä yhdellä. `IntMeter`-tyyppisen laskurin sisältämään arvoon pääsee käsiksi sen `Value`-ominaisuuden kautta. 
    238  
    239 Vasempaan reunaan törmäys käsitellään samaan tapaan, nyt vain kasvatetaan pelaajan 2 pisteitä. Näin törmäyksen käsittelystä saadaan seuraavan näköinen: 
    240  
    241 {{{ 
    242 #!C# 
    243 void KasittelePallonTormays( PhysicsObject pallo, PhysicsObject kohde ) 
    244 { 
    245     if ( kohde == oikeaReuna ) 
     234Reunan ominaisuudet täytyy nyt muuttaa halutuiksi jälkikäteen. 
     235 
     236'''Tee''' vasemman reunan luonnin perään '''samalla tavalla''' 
     237 * '''oikea reuna''' (`CreateRightBorder`),  
     238 * '''alareuna''' (`CreateBottomBorder`) ja  
     239 * '''yläreuna''' (`CreateTopBorder`). 
     240 
     241`KasittelePallonTormays`-aliohjelmassa voimme nyt tutkia onko törmäyksen kohde sama olio kuin muuttuja `vasenReuna` tai `oikeaReuna`. 
     242 
     243Kun vertaillaan onko kaksi asiaa samaa, käytetään `==`-merkintää. 
     244 
     245Jos pallo osuu oikeaan reunaan, kasvatetaan pelaajan 1 pistelaskurin arvoa (`pelaajan1Pisteet.Value`). Laskureiden arvo on niiden `Value`-ominaisuudessa. Vastaavasti vasen reuna. 
     246 
     247'''Lisää''' tarkistukset `KasittelePallonTormays`-aliohjelmaan: 
     248{{{ 
     249#!C# 
     250void KasittelePallonTormays(PhysicsObject pallo, PhysicsObject kohde) 
     251{ 
     252    if (kohde == oikeaReuna) 
    246253    { 
    247254        pelaajan1Pisteet.Value += 1; 
    248255    } 
    249     else if ( kohde == vasenReuna ) 
     256    else if (kohde == vasenReuna) 
    250257    { 
    251258        pelaajan2Pisteet.Value += 1; 
     
    254261}}} 
    255262 
    256 Äskeisessä koodissa tuli vastaan vielä yksi uusi asia: toisen `if`-lauseen edessä on sana `else` (suom. muuten).  
    257  
    258 Tämä tarkoittaa sitä, että `else`-sanan jälkeen tuleva `if`-lause suoritetaan vain, jos sitä edeltävän `if`-lauseen ehto oli epätosi. Tässä tapauksessa `else` ei ole aivan välttämätön, sillä jos pallo osuu kentän oikeaan reunaan, ei se voi samalla osua vasempaan reunaan. 
     263Merkintä `+=` tarkoittaa, että merkinnän vasemmalla puolella olevaan arvoon lisätään se mitä on merkinnän oikealla puolella. 
     264 
     265Toisen `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.  
    259266 
    260267Noista 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. 
     
    262269 [[Image(source:/trunk/help_symbols/does_not_work_yet.png, nolink)]] 
    263270 
    264 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 siis vielä seuraavat muutokset: 
    265  
    266 {{{ 
    267 #!html 
    268 <div style="margin: 0px 0px 0px 5%; color: black; background-color: #EEEEEE; border-width: 2px"> 
     271Jotta 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. 
     272 
     273'''Tee''' vielä seuraavat muutokset: 
     274{{{ 
     275#!html 
     276<div style="margin: 0px; color: black; background-color: #F7F7F7; border: 2px solid #D7D7D7;"> 
    269277<pre style="margin: 0px; padding: 0px;"> 
    270278public class Peli : PhysicsGame 
     
    303311 
    304312</pre> 
    305 <pre style="background-color: #BBFFBB; margin: 0px; padding: 0px;"> 
    306         vasenReuna = Level.CreateLeftBorder(); 
    307 </pre> 
    308 <pre style="margin: 0px; padding: 0px;"> 
     313<pre style="background-color: #f55; margin: 0px; padding: 0px; width: 175px"> 
     314        PhysicsObject   
     315</pre> 
     316<pre style="margin-top: -1.2em; padding: 0px;"> 
     317                      vasenReuna = Level.CreateLeftBorder(); 
    309318        vasenReuna.Restitution = 1.0; 
    310319        vasenReuna.IsVisible = false; 
    311320</pre> 
    312 <pre style="background-color: #BBFFBB; margin: 0px; padding: 0px;"> 
    313         oikeaReuna = Level.CreateRightBorder(); 
    314 </pre> 
    315 <pre style="margin: 0px; padding: 0px;"> 
     321<pre style="background-color: #f55; margin: 0px; padding: 0px; width: 175px"> 
     322        PhysicsObject </pre> 
     323</pre> 
     324<pre style="margin-top: -1.2em; padding: 0px;"> 
     325                      oikeaReuna = Level.CreateRightBorder(); 
    316326        oikeaReuna.Restitution = 1.0; 
    317327        oikeaReuna.IsVisible = false; 
     
    342352Pong-pelin koodi kaikkine mailoineen ja pistelaskuineen näyttää nyt suunnilleen tältä: 
    343353 
     354{{{ 
     355#!html 
     356</div> 
     357}}} 
     358 
    344359[[Include(source:/trunk/esimerkit/Pong/Vaihe7/Pong.cs, svn:mime-type=text/plain;svn:eol-style=native;)]] 
    345360 
    346361 
    347 {{{ 
    348 #!html 
    349 </div> 
    350 }}} 
    351  
    352362---- 
    353363