wiki:TormaysTarkistukset
Last modified 16 months ago Last modified on 2016-10-07 08:49:10

Muilla kielillä:

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

  1. Törmäyksenkäsittely yhdelle tunnetulle oliolle
  2. Törmäys kahden tunnetun olion välillä
  3. Törmäys yhden tunnetun ja useamman samantyyppisen olion välillä
  4. Törmäykset muuntyyppisiin olioihin kuin PhysicsObject
  5. Valmiit törmäystapahtumat
    1. Olioiden tuhoaminen
    2. Räjähdykset
    3. Laskurin arvon muuttaminen
    4. Ääniefektin soittaminen
    5. Impulssi
    6. Olion koon muuttaminen

Kun kaksi fysiikkaoliota törmää toisiinsa, syntyy törmäystapahtuma. Nämä tapahtumat voidaan ottaa kiinni tapahtumankäsittelijöillä, joissa reagoidaan törmäykseen esimerkiksi tuhoamalla toinen olioista tai kasvattamalla pistelaskurin arvoa.

Törmäyksenkäsittely yhdelle tunnetulle oliolle

Aluksi tapahtumankäsittelijä täytyy asettaa seuraamaan tietyn olion törmäyksiä. Esimerkiksi jos pelissä on olio nimeltä pelaaja jonka törmäyksistä toisiin olioihin ollaan kiinnostuneita, voidaan pelaajan luomisen jälkeen sanoa:

AddCollisionHandler(pelaaja, PelaajaTormasi);

Aina kun pelaaja törmää johonkin, mihin tahansa, fysiikkaolioon pelikentällä, kutsutaan aliohjelmaa PelaajaTormasi.

Ennen kuin törmäyksenkäsittely toimii, tarvitaan aliohjelma joka käsittelee törmäyksen. Törmäyksen käsittelevälle aliohjelmalle tulee parametreina törmänneet kaksi oliota.

void PelaajaTormasi(PhysicsObject tormaaja, PhysicsObject kohde)
{
   MessageDisplay.Add("Pelaaja törmäsi!");
}

Näin joka kerran kun pelaaja törmää johonkin, suoritetaan aliohjelma JokuTormasi. Parametreista tormaaja viittaa tässä tapauksessa pelaajaan ja kohde olioon johon pelaaja törmäsi.

Törmäys kahden tunnetun olion välillä

Jos halutaan reagoida törmäykseen kahden tietyn olion välillä, voidaan käskeä

AddCollisionHandler(pelaaja1, pelaaja2, PelaajatTormaavat);

Törmäävät oliot ovat tässä tapauksessa pelaaja1 ja pelaaja2. Tapahtumankäsittelijä pelaajatTormaavat voidaan tehdä samaan tapaan kuin edellisessäkin esimerkissä.

void PelaajatTormaavat(PhysicsObject tormaaja, PhysicsObject kohde)
{
   MessageDisplay.Add("Bump!");
}

Törmäys yhden tunnetun ja useamman samantyyppisen olion välillä

Usein pelissä on yksi pelaaja ja useampia erityyppisiä olioita: vihollisia, aarteita, piikkiesteitä jne. Törmäyskäsittelyyn ei enää riitäkään tieto siitä että pelaaja törmää johonkin olioon tai pelaaja törmää tiettyyn yhteen olioon. Samantyyppisille olioille voidaan antaa yhteinen tagi, jolla olioryhmät voidaan erottaa toisistaan. Tagi on järkevintä asettaa samalla kun olio luodaan.

void LuoVihollinen(Vector paikka, double leveys, double korkeus)
{
   PhysicsObject vihollinen = new PhysicsObject(leveys, korkeus);
   vihollinen.Position = paikka;
   vihollinen.Tag = "pahis";
   Add(vihollinen);
}

void LuoHealthPotion(Vector paikka, double leveys, double korkeus)
{
   PhysicsObject pottu = new PhysicsObject( leveys, korkeus );
   pottu.Position = paikka;
   pottu.Tag = "health";
   Add(pottu);
}

Törmäyskäsittelijät voidaan luoda seuraavalla tavalla esim. pelaajan luomisen yhteydessä:

AddCollisionHandler(pelaaja, "pahis", PelaajaOsuu);
AddCollisionHandler(pelaaja, "health", PelaajaParantuu);

Olion ja tagin väliset tapahtumankäsittelijät voidaan tehdä seuraavaan tapaan:

void PelaajaOsuu(PhysicsObject pelaaja, PhysicsObject kohde)
{
   pelaajanTerveys--;

   if (pelaajanTerveys <= 0)
      pelaaja.Destroy();
}

void PelaajaParantuu(PhysicsObject pelaaja, PhysicsObject kohde)
{
   pelaajanTerveys++;
}

Tässä esimerkissä on oletettu, että kokonaislukumuuttuja pelaajanTerveys löytyy pelin attribuuteista.

public class OmaPeli : Game
{
   int pelaajanTerveys = 5;

   public override void Begin()
   {
       // jatkuu...

Törmäykset muuntyyppisiin olioihin kuin PhysicsObject

Pelissä voi olla muunkintyyppisiä olioita kuin PhysicsObject, esimerkiksi PlatformCharacter. Olion täytyy kuitenkin periytyä PhysicsObjectista, jotta sen törmäyksiä voidaan käsitellä. Mutta jos esimerkiksi PlatformCharacter-tyyppistä oliota käsitellään PhysicsObjectina, esimerkiksi sen Walk-metodia ei voi käyttää, sillä PhysicsObjectilla ei ole sellaista!

Tähän on olemassa kaksi keinoa. Yleisempi keino on muuttaa olion tyyppi halutuksi.

void Tormays(PhysicsObject tormaaja, PhysicsObject kohde)
{
   PlatformCharacter hahmo = tormaaja as PlatformCharacter;
   hahmo.Walk(Direction.Right);
}

Toinen, helpompi tapa on käyttää AddCollisionHandler-aliohjelman tyyppiparametrillista versiota:

AddCollisionHandler<PlatformCharacter, PhysicsObject>(pelaaja, HahmonTormays);

Tämä kertoo, että törmäyksenkäsittelijäaliohjelman HahmonTormays parametrit ovat tyyppiä PlatformCharacter (törmääjä) ja PhysicsObject (kohde). Nyt voidaan kirjoittaa törmäyksenkäsittelijä suoraan muotoon

void Tormays(PlatformCharacter tormaaja, PhysicsObject kohde)
{
   tormaaja.Walk(Direction.Right);
}

Huomaa, että jos yrität käyttää yo. aliohjelmaa tavalliselle, tyyppiparametrittomalle AddCollisionHandler-metodille, kääntäjä antaa siitä virheen.

void Tormays(PhysicsObject tormaaja, PhysicsObject kohde)
{
   PlatformCharacter hahmo = tormaaja as PlatformCharacter;
   hahmo.Walk(Direction.Right);
}

Valmiit törmäystapahtumat

CollisionHandler-luokka sisältää valmiita käsittelijöitä yleisimmille törmäystapahtumille.

Olioiden tuhoaminen

DestroyObject tuhoaa törmäävän olion.

AddCollisionHandler(pelaaja, vihollinen, CollisionHandler.DestroyObject);

DestroyTarget tuhoaa olion johon törmätään.

ase.ProjectileCollision = CollisionHandler.DestroyTarget;

DestroyBoth tuhoaa molemmat.

ase.ProjectileCollision = CollisionHandler.DestroyBoth;

Räjähdykset

ExplodeObject räjäyttää törmäävän olion. Se ottaa parametriksi räjähdyksen säteen ja totuusarvon siitä, tuhotaanko olio samalla.

AddCollisionHandler(pelaaja, vihollinen, CollisionHandler.ExplodeObject(100, true));

ExplodeObject toimii kuten ExplodeTarget, mutta se räjäyttää olion, johon törmätään.

AddCollisionHandler(salama, CollisionHandler.ExplodeTarget(150, false));

ExplodeBoth tekee räjähdyksen olioiden törmäyskohtaan ja valinnaisesti tuhoaa kummatkin oliot samalla.

AddCollisionHandler(salama, CollisionHandler.ExplodeBoth(200, true));

Jos pelissä on käytössä ExplosionSystem (ks. Efektit), voidaan käyttää AddEffect-käsittelijää. AddEffect ottaa parametrikseen räjähdysjärjestelmän ja käytettävien partikkelien määrän. AddEffect ei tuhoa olioita automaattisesti, mutta sekin onnistuu lisäämällä erillinen DestroyObject-käsittelijä.

AddCollisionHandler(pelaaja, vihollinen, CollisionHandler.AddEffectOnTarget(paukkupatteri, 40));
AddCollisionHandler(pelaaja, vihollinen, CollisionHandler.DestroyObject);
AddCollisionHandler(salama, CollisionHandler.AddEffectOnTarget(paukkupatteri, 80));

Laskurin arvon muuttaminen

Laskurin arvoa voidaan kasvattaa/vähentää käyttämällä AddMeterValue-törmäyksenkäsittelijää. Näin voidaan esimerkiksi antaa pelaajalle pisteitä kerättävistä esineistä tai vähentää terveyttä/elämiä viholliseen osumisesta.

AddCollisionHandler(pelaaja, "bonus", CollisionHandler.AddMeterValue(pisteet, 10));
AddCollisionHandler(pelaaja, "piikki", CollisionHandler.AddMeterValue(health, -1));

Tätä tapaa ei voida käyttää mikäli, pisteiden laskemisella on jotakin muita ehtoja kuin pelkkä törmääminen. Tällöin pistelaskuri pitää käsitellä normaalissa törmäystapahtumassa ja kirjoittaa sinne ehto ja kasvattaa laskuria normaalilla tavalla.

Ääniefektin soittaminen

Ääniefektin soittaminen törmäyksen yhteydessä onnistuu tapahtumankäsittelijällä PlaySound, jolle annetaan parametriksi ääniefektin nimi. Nimi on yleensä sama kun tiedoston nimi, mutta ilman tiedostopäätettä.

AddCollisionHandler(pelaaja, "tuli", CollisionHandler.PlaySound("tuskan_parahdus"));

Impulssi

HitObject lyö törmäävää oliota ja HitTarget oliota, johon törmätään. Molemmat ottavat parametrikseen vektorin, joka kertoo lyönnin suunnan ja voiman.

Vector ylos = new Vector(200, 0);
AddCollisionHandler(pelaaja, "trampoliini", CollisionHandler.HitObject(ylos));

Olion koon muuttaminen

Olion kokoa on mahdollista muuttaa törmäyksessä IncreaseObjectSize ja IncreaseTargetSize -käsittelijöillä. Ensimmäinen muuttaa törmääjän kokoa ja jälkimmäinen sen olion, johon törmätään. Molemmat ottavat parametrikseen leveyden ja korkeuden muutoksen (siinä järjestyksessä). Muutos voi olla myös negatiivinen, jolloin olio pienenee.

AddCollisionHandler(pelaaja, "nakki", CollisionHandler.IncreaseObjectSize(10, 10));
AddCollisionHandler(kirves, CollisionHandler.IncreaseTargetSize(-5, 0));