Muita tapahtumia¶
Jypelissä moni asia laukaisee tapahtuman (event), johon voi liittää oman
aliohjelman +=-merkinnällä. Ajastimen Timeout-tapahtuma ja törmäykset on
käsitelty omilla sivuillaan: Ajastimet ja
Törmäysten käsittely. Tällä sivulla on lueteltu eräitä
muita tapahtumia. Lista ei ole täydellinen: Jypelissä on tapahtumia myös
esimerkiksi aseilla, aivoilla, äänillä ja listoilla.
Käsittelijäksi annetaan aliohjelman nimi ilman sulkuja. Aliohjelman
parametrien pitää vastata tapahtuman muotoa. Useimmat tämän sivun tapahtumat
kutsuvat parametritonta void-aliohjelmaa; poikkeukset on mainittu erikseen.
Jos käsittelijälle pitää viedä omia parametreja, katso
Delegaatit.
Olion tuhoutuminen: Destroyed¶
Kun olio tuhotaan Destroy-metodilla, kutsutaan sen Destroyed-tapahtuman
käsittelijää. Tapahtuma on kaikilla peliolioilla, myös käyttöliittymän
komponenteilla kuten Label. Alla olevassa esimerkissä vihu lakkaa
heittelemästä esineitä, kun se tuhoutuu.
{
PhysicsObject vihu = new PhysicsObject(...);
// ...
Timer heittoajastin = new Timer();
heittoajastin.Interval = 2.0;
heittoajastin.Timeout += HeitaKappale;
vihu.Destroyed += heittoajastin.Stop;
}
Destroyed-tapahtuman käsittelijän tulee olla parametriton void-aliohjelma.
Jos tuhoutumisen yhteydessä on tarvetta tehdä monimutkaisempaa logiikkaa
(esimerkiksi kutsua parametrillista aliohjelmaa), kannattaa käyttää
delegate-avainsanaa.
Tapahtuma laukeaa myös silloin, kun olio tuhoutuu itsestään eliniän päätyttyä, ks. Elinikä.
Olion lisääminen peliin: AddedToGame¶
AddedToGame laukeaa, kun olio on lisätty peliin Add-aliohjelmalla. Sitä
tarvitaan lähinnä omissa oliotyypeissä: olion
rakentajassa olio ei ole vielä pelissä eikä sen paikkaa ole asetettu, joten
esimerkiksi ohjainten asettaminen tai osien lisääminen olion viereen tehdään
vasta tässä tapahtumassa. Alla vihu lisää itselleen kilven, kun se on lisätty peliin.
public class Vihu : PhysicsObject
{
public Vihu(double leveys, double korkeus)
: base(leveys, korkeus)
{
AddedToGame += LisaaKilpi;
}
void LisaaKilpi()
{
PhysicsObject kilpi = new PhysicsObject(Width, 10);
kilpi.Position = Position + new Vector(0, Height / 2);
Game.Add(kilpi);
}
}
Laajempia esimerkkejä: auton pyörät sivulla Liitokset ja ohjainten asettaminen sivulla Omat käyttöliittymäkomponentit.
Vastaavasti Removed laukeaa, kun olio poistetaan pelistä. Myös Destroy
poistaa olion, joten oliota tuhottaessa laukeavat sekä Destroyed että Removed.
Laskurin arvon muuttuminen: Changed¶
Laskurin (IntMeter, DoubleMeter) Changed-tapahtuma laukeaa aina, kun
laskurin arvo muuttuu. Käsittelijä saa parametreina vanhan ja uuden arvon,
IntMeter-laskurilla int-tyyppisinä ja DoubleMeter-laskurilla
double-tyyppisinä.
void PisteetMuuttuivat(int vanhaArvo, int uusiArvo)
{
if (uusiArvo > vanhaArvo)
{
MessageDisplay.Add("Piste!");
}
}
Ylä- ja alarajan saavuttamiselle on omat tapahtumat UpperLimit ja
LowerLimit, ja mille tahansa arvolle voi asettaa tapahtuman
AddTrigger-metodilla. Ne on kuvattu sivulla
Pistelaskuri.
Liukusäätimeen sidotun laskurin Changed-tapahtumaa käytetään sivulla
Liukusäätimet.
Napin painallus: Clicked¶
PushButton on painike, jonka Clicked-tapahtuma laukeaa, kun nappia
klikataan hiirellä. Napin paikan voi asettaa kuten muidenkin olioiden.
PushButton aloitusnappi = new PushButton("Aloita peli");
aloitusnappi.Y = 100;
aloitusnappi.Clicked += AloitaPeli;
Add(aloitusnappi);
Kokonainen alkuvalikko syntyy helpommin valmiilla luokalla, ks. Valikot.
Ikkunan sulkeutuminen: Closed¶
Kaikilla ikkunoilla (MessageWindow, InputWindow, MultiSelectWindow,
YesNoWindow, HighScoreWindow) on Closed-tapahtuma, joka laukeaa, kun
ikkuna sulkeutuu. Käsittelijä saa parametrina suljetun ikkunan. Alla
MessageWindow, joka on yksinkertainen ilmoitusikkuna tekstillä ja
OK-napilla, aloittaa pelin alusta sulkeuduttuaan.
MessageWindow ilmoitus = new MessageWindow("Peli päättyi!");
ilmoitus.Closed += AloitaAlusta;
Add(ilmoitus);
Kyllä/ei-ikkunalla on lisäksi tapahtumat Yes ja No, joiden käsittelijät
ovat parametrittomia. Alla peli suljetaan, jos pelaaja vastaa kyllä.
Kysymysikkunan TextEntered-tapahtuma on sivulla
Tekstin kysyminen pelaajalta ja
parhaiden pisteiden ikkunan Closed-tapahtuman käyttö sivulla
Parhaat pisteet.
Pelin aloittamisesta alusta kerrotaan sivulla
Pelin aloittaminen alusta.
Animaation loppuminen: Played¶
Kun animaatio on toistettu annetun määrän kertoja, laukeaa sen
Played-tapahtuma. Esimerkiksi räjähdysanimaation jälkeen olio voidaan
tuhota.
vihu.Animation = new Animation(rajahdysKuvat);
vihu.Animation.Played += vihu.Destroy;
vihu.Animation.Start(1);
Animaation luominen ja Start-metodi on kuvattu sivulla
Animaatio.
Pelin sulkeminen: Exiting¶
Pelin Exiting-tapahtuma laukeaa, kun peli suljetaan. Siihen voi liittää
esimerkiksi pisteiden tallennuksen, jolloin tallennus tapahtuu riippumatta
siitä, miten peli lopetettiin.
Käsittelijän poistaminen¶
Käsittelijän voi poistaa -=-merkinnällä, jolloin tapahtuma ei enää kutsu
sitä.
Delegaattina (delegate { ... }) annettua käsittelijää ei voi poistaa, koska
sillä ei ole nimeä. Jos käsittelijä pitää voida poistaa, tee siitä nimetty
aliohjelma.
Esimerkki: pallo tuhoutuu klikkaamalla¶
Peli näyttää pallon, joka tuhoutuu hiirellä klikkaamalla. Tuhoutuminen
laukaisee Destroyed-tapahtuman, jonka käsittelijä avaa ilmoitusikkunan.
Ikkunan sulkeminen laukaisee Closed-tapahtuman, jonka käsittelijä aloittaa
pelin alusta. Ajonappi näyttää vain pelin alkutilanteen, joten klikkausta
kannattaa kokeilla omalla koneella.
using Jypeli;
public class Peli : PhysicsGame
{
public override void Begin()
{
Mouse.IsCursorVisible = true;
PhysicsObject pallo = new PhysicsObject(100, 100, Shape.Circle);
pallo.Color = Color.Red;
pallo.Destroyed += PalloTuhoutui;
Add(pallo);
Mouse.ListenOn(pallo, MouseButton.Left, ButtonState.Pressed, pallo.Destroy, "Tuhoa pallo");
MessageDisplay.Add("Klikkaa palloa.");
}
void PalloTuhoutui()
{
MessageWindow ikkuna = new MessageWindow("Pallo tuhoutui. Sulje ikkuna, niin peli alkaa alusta.");
ikkuna.Closed += AloitaAlusta;
Add(ikkuna);
}
void AloitaAlusta(Window ikkuna)
{
ClearAll();
Begin();
}
}
Mouse.ListenOn kuuntelee hiiren painallusta vain pallon päällä, ks.
Hiiren kuunteleminen vain tietyille peliolioille.