Hyppää sisältöön

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.

vihu.Destroyed += delegate { MessageDisplay.Add("Vihu tuhoutui!"); };

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ä.

IntMeter pisteet = new IntMeter(0);
pisteet.Changed += PisteetMuuttuivat;
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);
void AloitaAlusta(Window ikkuna)
{
    ClearAll();
    Begin();
}

Kyllä/ei-ikkunalla on lisäksi tapahtumat Yes ja No, joiden käsittelijät ovat parametrittomia. Alla peli suljetaan, jos pelaaja vastaa kyllä.

YesNoWindow kysymys = new YesNoWindow("Lopetetaanko peli?");
kysymys.Yes += Exit;
Add(kysymys);

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.

public override void Begin()
{
    Exiting += TallennaPisteet;
    // ...
}
void TallennaPisteet()
{
    DataStorage.Save<ScoreList>(topLista, "pisteet.xml");
}

Käsittelijän poistaminen

Käsittelijän voi poistaa -=-merkinnällä, jolloin tapahtuma ei enää kutsu sitä.

vihu.Destroyed -= heittoajastin.Stop;

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.