Changes between Version 14 and Version 15 of Pong/Vaihe7


Ignore:
Timestamp:
2010-07-02 15:19:59 (9 years ago)
Author:
juiitamm
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Pong/Vaihe7

    v14 v15  
    100100<pre style="margin: 0px; padding: 0px;"> 
    101101public class Peli : PhysicsGame 
    102 { 
     102{     
     103    Vector nopeusYlos = new Vector( 0, 200 ); 
     104    Vector nopeusAlas = new Vector( 0, -200 ); 
     105 
    103106    PhysicsObject pallo; 
    104107    PhysicsObject maila1; 
    105108    PhysicsObject maila2; 
    106  
    107     Vector nopeusYlos = new Vector( 0, 200 ); 
    108     Vector nopeusAlas = new Vector( 0, -200 ); 
    109109 
    110110</pre> 
     
    151151Jotta voisimme kasvattaa pisteitä, täytyisi tietää milloin pallo ohittaa jommankumman mailan. Tämä onnistuu siten, että tarkkaillaan sitä kun pallo osuu johonkin. Jos pallo osuu kentän vasempaan tai oikeaan reunaan (reunathan lisättiin kenttään aikaisemmin), voidaan kasvattaa toisen pelaajan pisteitä. 
    152152 
    153 Törmäyksiin reagoimista varten kirjastossa on aliohjelma nimeltä `AddCollisionHandler`. Se ottaa kaksi parametria: fysiikkaolio, jonka törmäyksiin halutaan reagoida sekä aliohjelma, jota kutsutaan olion törmätessä. Lisää seuraavanlainen kutsu `LuoKentta`-aliohjelmaan, sen jälkeen kun pallo on luotu ja lisätty tasoon: 
    154  
     153Törmäyksiin reagoimista varten kirjastossa on aliohjelma nimeltä `AddCollisionHandler`. Se ottaa kaksi parametria: __fysiikkaolio__, jonka törmäyksiin halutaan reagoida sekä __aliohjelma__, jota kutsutaan olion törmätessä.  
     154 
     155Lisää seuraavanlainen kutsu `LuoKentta`-aliohjelmaan, sen jälkeen kun pallo on luotu ja lisätty tasoon: 
    155156{{{ 
    156157#!C# 
     
    160161 [[Image(source:/trunk/help_symbols/does_not_work_yet.png, nolink)]] 
    161162 
    162 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. Aliohjelman voi toki nimetä vapaasti, kunhan sama nimi annetaan parametrina `AddCollisionHandler`-aliohjelmalle. 
    163  
     163Aliohjelman, 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.  
     164 
     165Aliohjelman voi toki nimetä vapaasti, kunhan sama nimi annetaan parametrina `AddCollisionHandler`-kutsussa. 
    164166{{{ 
    165167#!C# 
     
    169171}}} 
    170172 
    171 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? 
    172  
    173 Jotta vertailu olisi helppo suorittaa, meidän täytyy 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. Etsi `LuoKentta`-aliohjelmasta seuraava rivi ja pyyhi se: 
    174  
    175 {{{ 
    176 #!C# 
    177         void LuoKentta( ) 
    178         { 
    179             Level.CreateBorders( 1.0, false ); 
    180         } 
    181 }}} 
    182  
    183 Pyyhityn rivin paikalle luodaan reunat uudestaan yksitellen. Tehdään ensin vasen reuna tähän tapaan: 
    184  
    185 {{{ 
    186 #!C# 
    187         void LuoKentta( ) 
    188         { 
    189             PhysicsObject vasenReuna = Level.CreateLeftBorder(); 
    190             vasenReuna.Restitution = 1.0; 
    191             vasenReuna.IsVisible = false; 
    192         } 
     173__Kun törmäyksen käsittelevään aliohjelmaan tullaan, tiedetään vasta että pallo on törmännyt '''johonkin'''.__  
     174 
     175Jotta 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? 
     176 
     177Jotta 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.  
     178 
     179Etsi `LuoKentta`-aliohjelmasta seuraava rivi: 
     180{{{ 
     181#!C# 
     182        Level.CreateBorders( 1.0, false ); 
     183}}} 
     184 
     185'''Korvataan''' tämä rivi. Sen paikalle luodaan reunat uudestaan yksitellen. Tehdään ensin vasen reuna tähän tapaan: 
     186 
     187{{{ 
     188#!C# 
     189        PhysicsObject vasenReuna = Level.CreateLeftBorder(); 
     190        vasenReuna.Restitution = 1.0; 
     191        vasenReuna.IsVisible = false; 
    193192}}} 
    194193 
    195194Aliohjelma `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. 
    196195 
    197 Tee vasemman reunan luonnin perään samalla tavalla oikea reuna (`CreateRightBorder`), alareuna (`CreateBottomBorder`) ja yläreuna (`CreateTopBorder`). 
     196'''Tee''' vasemman reunan luonnin perään '''samalla tavalla''' oikea reuna (`CreateRightBorder`), alareuna (`CreateBottomBorder`) ja yläreuna (`CreateTopBorder`). 
    198197 
    199198Nyt 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ä:  
    200  
    201199{{{ 
    202200#!C# 
     
    226224}}} 
    227225 
    228 Äskeisessä koodissa tuli vastaan vielä yksi uusi asia: toisen if-lauseen edessä on sana `else` (suom. muuten). 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. 
     226Äskeisessä koodissa tuli vastaan vielä yksi uusi asia: toisen if-lauseen edessä on sana `else` (suom. muuten).  
     227 
     228Tä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. 
    229229 
    230230Noista 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. 
     
    240240public class Peli : PhysicsGame 
    241241{ 
     242    Vector nopeusYlos = new Vector( 0, 200 ); 
     243    Vector nopeusAlas = new Vector( 0, -200 ); 
     244 
    242245    PhysicsObject pallo; 
    243246    PhysicsObject maila1; 
     
    250253</pre> 
    251254<pre style="margin: 0px; padding: 0px;"> 
    252  
    253     Vector nopeusYlos = new Vector( 0, 200 ); 
    254     Vector nopeusAlas = new Vector( 0, -200 ); 
    255255 
    256256    IntMeter pelaajan1Pisteet;