Huom! Nämä wikisivut ovat osittain vielä työn alla, osa sisällöstä saattaa olla puutteellista. Ongelmakohtien viereen voit jättää kommentin, yliopiston käyttäjät myös pystyvät (ja saavat) muokata sivuja.

Jypelin käyttöohjeet » Liitokset

Jypelin käyttämä Farseerphysics-fysiikkakirjasto tarjoaa erilaisia liitoksia, joilla fysiikkaolioita voi liittää toisiinsa.

Jypelissä on toistaiseksi toteutettu muutama tapa liittää fysiikkaolioita toisiinsa.

1. Akseliliitos

Useimmin käytetty liitos on AxleJoint. Liitokselle on useita käyttötapoja.

1.1 Kahden olion kiinnittäminen toisiinsa

Akseliliitoksella voidaan kiinnittää kaksi oliota toisiinsa niin, että kun ne liikkuvat, niiden etäisyys pysyy vakiona. Tällainen liitos voidaan luoda antamalla AxleJoint-olion rakentajalle kaksi oliota ja piste ensimmäisen kappaleen koordinaateissa, jonka läpi akseli lyödään.

AxleJoint liitos = new AxleJoint(olio1, olio2, akselinPaikka);

Jos pistettä ei anneta erikseen, on se oletuksena kappaleiden välin keskipisteessä.

AxleJoint liitos = new AxleJoint(olio1, olio2);

Jos lisäksi halutaan, että oliot eivät välitä toistensa törmäyksistä, voidaan ne asettaa samaan törmäysryhmään:

olio1.CollisionIgnoreGroup = 1;
olio2.CollisionIgnoreGroup = 1;

Tällä ei tietenkään ole merkitystä, jos kappaleet ovat tarpeeksi kaukana toisistaan.

Liitos pitää vielä lisätä kenttään kaikkien muiden olioiden tapaan:

Add(liitos);
# liitos2

1.2 Liitoksen pehmeys

Liitokselle voidaan asettaa myös pehmeys, eli kuinka paljon liitos joustaa kappaleidein liikkuessa.

liitos.Softness = 0.5;

Suurempi arvo tarkoittaa pienempää joustamista. Hyvin suuren arvon käyttö voi johtaa epäfysikaalisiin ilmiöihin.

1.3 Liitoksen tuhoaminen

Liitoksen tuhoamiseen voidaan käyttää Jypelistä tuttua Destroy-metodia. Kun liitos on tuhottu, oliot pääsevät liikkumaan taas vapaasti.

liitos.Destroy();

2. WheelJoint

Liitos joka on erityisesti tarkoitettu ajoneuvojen renkaita varten. Sisältää sisäänrakennetun moottorin pyöritystä varten.

2.1 Kappaleiden liittäminen toisiinsa

Rengasliitos toimii melko samalla tavalla kuin akseliliitos, jonka pituudeksi olisi asetettu nolla. Liitos kiinnittää kappaleet toisiinsa niin, että liitospisteessä oleva moottori voi pyörittää niitä.

Oletuksena liitos tulee juuri siihen pisteeseen missä toisena annettu kappale on. Tässä tapauksessa renkaan keskipisteeseen:

WheelJoint moottori = new WheelJoint(auto, rengas);

Liitokselle voidaan myös antaa vaihtoehtoinen sijainti, jos keskipiste ei ole haluttu:

WheelJoint moottori = new WheelJoint(auto, rengas, new Vector(10,10));

Liitoksen ominaisuuksia:

Nimi Tyyppi Selitys
Axis Vector Akseli jonka suhteen liitos joustaa. Oletuksena Vector.One, eli joustaa joka suuntaan. Esimerkiksi Vector.UnitY tarkoittaa että joustaa ainoastaan pystysuunnassa.
DampingRatio double Liitoksen oskillaation vaimennuskerroin.
Softness double Kuinka helposti liitos joustaa.

Liitoksen moottorille on myös muutamia ominaisuuksia:

Nimi Tyyppi Selitys
MaxMotorTorque double Kuinka kovaa moottori vääntää, vaikuttaa esimerkiksi auton kiihtyvyyteen.
MotorSpeed double Kuinka nopeasti moottori yrittää pyöriä, radiaaneina sekunnissa. 2 * Math.PI = yksi kierros sekunnissa.
MotorEnabled bool Moottori päälle/pois. Pois päältä ollessa rengas pyörii vapaasti.

Lopuksi liitos pitää muistaa lisätä peliin:

Add(moottori);

2.2 Esimerkki

Esimerkki autosta, johon on liitetty kaksi pyörää:

# auto2

3. Rakenneolio

Rakenneolio eli PhysicsStructure voidaan koostaa kahdesta tai useammasta oliosta. Rakenneolio vastaa kaikkien sen osaolioiden liittämistä liitoksilla toisiinsa, mutta lisäksi koko rakennetta voi käskeä esimerkiksi liikkumaan, pyörimään tai muuttamaan väriään.

3.1 Rakenneolion luominen

Rakenteen luomiseen on kaksi vaihtoehtoa. Ensimmäinen näistä on kentällä valmiiksi olevien olioiden lisääminen siihen.

PhysicsObject p1 = new PhysicsObject(2 * 50.0, 2 * 50.0, Shape.Circle);
p1.X = 200;
p1.Y = 200 + 50;
Add(p1);

PhysicsObject p2 = new PhysicsObject(2 * 25.0, 2 * 25.0, Shape.Circle);
p2.X = 200;
p2.Y = 200 + p1.Y + 50 + 25;
Add(p1);

PhysicsObject p3 = new PhysicsObject(2 * 15.0, 2 * 15.0, Shape.Circle);
p3.X = 200;
p3.Y = 200 + p2.Y + 25 + 15;
Add(p1);

PhysicsStructure lumiukko = new PhysicsStructure( p1, p2, p3 );
Add(lumiukko); 

Toinen vaihtoehto on tehdä rakenne ensin ja vasta sitten lisätä fysiikkaoliot rakenteeseen. Huomaa kuitenkin, että tällä tavalla lisättäessä osaolioiden koordinaatit ovat suhteessa rakenneolion keskipisteeseen, eli esim. seuraava esimerkki vastaa täysin ylläolevaa, vaikka palloille asetetut koordinaatit poikkeavatkin edellisistä.

PhysicsStructure lumiukko = new PhysicsStructure();
lumiukko.X = 200;
lumiukko.Y = 200;
Add(lumiukko);

PhysicsObject p1 = new PhysicsObject(2 * 50.0, 2 * 50.0, Shape.Circle);
p1.X = 0;
p1.Y = 50;
lumiukko.Add(p1);

PhysicsObject p2 = new PhysicsObject(2 * 25.0, 2 * 25.0, Shape.Circle);
p2.X = 0;
p2.Y = p1.Y + 50 + 25;
lumiukko.Add(p2);

PhysicsObject p3 = new PhysicsObject(2 * 15.0, 2 * 15.0, Shape.Circle);
p3.X = 0;
p3.Y = p2.Y + 25 + 15;
lumiukko.Add(p3); 

3.2 Rakenteen liitosten pehmeys

Oletuksena rakenteen olioiden välisten liitosten pehmeys (Softness) on 0, jolloin oliot eivät pääse liikkumaan toistensa suhteen. Arvoa voi kuitenkin muuttaa, ja se vaikuttaa koko rakenteeseen. Yksittäisten liitosten pehmeyttä ei ole mahdollista säätää.

lumiukko.Softness = 3;

3.3 Rakenteet ja törmäysten käsittely

Rakenteille on myös mahdollista asettaa törmäyskäsittelijöitä. Näin saadaan törmäystapahtuma kun mikä tahansa rakenteen osista törmää.

void TeeLumiukko()
{
   // luodaan lumiukko...
   lumiukko.Collided += KasitteleLumiukonTormays;
}

void KasitteleLumiukonTormays(IPhysicsObject ukko, IPhysicsObject kohde)
{
   // törmäyksenkäsittelijä
}

3.4 Kuuluuko fysiikkaolio rakenteeseen

Jos halutaan tietää, mihin rakenteeseen tietty fysiikkaolio kuuluu, voidaan tiedustella sen ParentStructure-ominaisuutta.

if (olio.ParentStructure == ukko)
{
   // olio kuuluu ukkoon, tehdään jotain
}

ParentStructure on suora viite fysiikkarakenteeseen johon olio kuuluu. Jos olio ei kuulu mihinkään rakenteeseen, ParentStructure saa arvon null.

if (olio.ParentStructure != null)
{
   olio.ParentStructure.Hit(new Vector(100, 0));
}

Ylläoleva esimerkki ensin tarkistaa, kuuluuko olio johonkin rakenteeseen ja jos kuuluu, lyö koko rakennetta suuntaan (100, 0). Jos tarkistusta ei tehdä ja olio ei kuulu mihinkään rakenteeseen, ohjelma kaatuu NullPointerException-poikkeukseen (koska yritetään "lyödä tyhjää").

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.