Efektit¶
Jypelin efektit ovat partikkeliefektejä: yksi efekti koostuu suuresta joukosta pieniä kuvia eli partikkeleita, jotka syntyvät, liikkuvat ja häviävät kukin omaan tahtiinsa. Partikkeleita hallitsee efektijärjestelmä (ParticleSystem), jolle annetaan partikkelin kuva ja partikkelien enimmäismäärä. Jokainen efektityyppi on oma järjestelmänsä:
ExplosionSystemtekee räjähdyksiä.Flametekee liekin.Smoketekee savua.
Kaikilla järjestelmillä on samat ominaisuudet, joilla partikkelien elinaikaa, nopeutta, kokoa ja pyörimistä säädetään. Ominaisuudet on lueteltu kohdassa Räjähdyksen mukauttaminen, ja ne toimivat samalla tavalla kaikissa efekteissä.
Efektijärjestelmä lisätään peliin Add-metodilla kuten muutkin oliot. Räjähdyksen kaltainen kertaluonteinen efekti käynnistetään sen jälkeen erikseen AddEffect-metodilla. Liekki ja savu ovat sen sijaan jatkuvia efektejä, jotka alkavat näkyä heti, kun ne on lisätty peliin.
Kaikki efektit ovat nimiavaruudessa Jypeli.Effects, joten lisää kooditiedostosi alkuun seuraava using-rivi:
Räjähdys¶
Huomautus
Tämä on pelkkä näkyvä efekti. Jos räjähdyksen halutaan myös vaikuttavan fysiikkaan, käytä fysiikkaräjähdystä, ks. Räjähdykset.
Räjähdykset tehdään ExplosionSystem-järjestelmällä. Alla oleva koodi luo järjestelmän ja käynnistää sillä yhden räjähdyksen:
using System;
using System.Collections.Generic;
using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls;
using Jypeli.Effects;
using Jypeli.Widgets;
namespace ExplosionExample;
public class ExplosionExample : PhysicsGame
{
public override void Begin()
{
Level.BackgroundColor = Color.Black;
// Ensin alustetaan räjähdysjärjestelmä kuvalla ja
// partikkelien maksimimäärällä
int pMaxMaara = 200;
Image rajahdyskuva = LoadImage("Explosion.png");
ExplosionSystem rajahdys = new ExplosionSystem(rajahdyskuva, pMaxMaara);
rajahdys.MinVelocity = 20; // Muodostuvien hiukkasten miniminopeus
rajahdys.MinLifetime = 1; // Muodostuvien hiukkasten minimielinaika
rajahdys.MaxVelocity = 100; // Muodostuvien hiukkasten maksiminopeus
rajahdys.MaxLifetime = 3; // Muodostuvien hiukkasten maksimielinaika
// Lisätään järjestelmä peliin
Add(rajahdys);
double x = 0;
double y = 0;
int pMaara = 50;
// "Käynnistetään" räjähdys
rajahdys.AddEffect(x, y, pMaara);
}
}
Edellä oleva koodi antaisi seuraavanlaisen räjähdyksen:
Huomaa erityisesti seuraava rivi.
Tämä rivi lisää halutun efektin peliin, tässä tapauksessa räjähdyksen. Parametreista:
x- jay-parametrit kertovat efektin x- ja y-koordinaatit eli paikan.pMaara-parametri kertoo, kuinka monta partikkelia luotava efekti käyttää. Yhdellä järjestelmällä voidaan tehdä monta räjähdystä, ja kaikilla räjähdyksillä yhdessä on käytössä järjestelmänpMaxMaarakappaletta partikkeleita. Esim. jos tehdäänExplosionSystemrajahdys, jonka partikkeleiden maksimi on 50, ja lisätään 3 räjähdystä, joissa kussakin on 20 partikkelia, niin partikkelit "loppuvat kesken", ja silloin partikkeleita aletaan tuhota vanhemmasta päästä. (Eli ensin luodut partikkelit tuhotaan ensin.)
Räjähdyksen mukauttaminen¶
Räjähdyksellä on paljon ominaisuuksia, joilla voi muokata räjähdyksen ulkonäköä haluamakseen. Tässä niistä muutama.
| Ominaisuus | Tyyppi | Selitys |
|---|---|---|
MinLifetime |
double | Partikkelin lyhin mahdollinen elinaika sekunteina. |
MaxLifetime |
double | Partikkelin pisin mahdollinen elinaika sekunteina. |
MinVelocity |
double | Pienin nopeus, joka partikkelilla voi olla. |
MaxVelocity |
double | Suurin nopeus, joka partikkelilla voi olla. |
MinScale |
double | Pienin skaalaus, joka partikkelilla voi olla. Arvo 1 tarkoittaa, että partikkeli on kuvan kokoinen. |
MaxScale |
double | Suurin skaalaus, joka partikkelilla voi olla. |
MinRotationSpeed |
double | Pienin pyörimisnopeus, joka partikkelilla voi olla. |
MaxRotationSpeed |
double | Suurin pyörimisnopeus, joka partikkelilla voi olla. |
AlphaAmount |
double | Partikkelien läpinäkyvyys välillä 0.0–1.0. |
IgnoreWind |
bool | Jos true, tuuli ei vaikuta efektiin. |
Liekki¶
Liekkiefekti käyttää Flame-nimistä efektijärjestelmää. Liekin voisi esimerkiksi luoda seuraavalla tavalla:
using System;
using System.Collections.Generic;
using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls;
using Jypeli.Effects;
using Jypeli.Widgets;
namespace FlameExample;
public class FlameExample : PhysicsGame
{
public override void Begin()
{
Level.BackgroundColor = Color.Black;
Image kuva = LoadImage("Explosion.png");
Flame liekki = new Flame(kuva);
liekki.MaxAngleChange = 30; // Kuinka leveälle liekki leviää
Add(liekki);
}
}
Flame saa parametrinaan vain partikkelin kuvan. Partikkelien määrää ei anneta, eikä liekkiä käynnistetä erikseen AddEffect-metodilla, koska liekki on jatkuva efekti: se palaa heti, kun se on lisätty peliin.
Liekillä on samat muokkausmahdollisuudet kuin räjähdykselläkin. Joitain hyödyllisiä ominaisuuksia voi olla mm.
MaxAngleChange, joka määrittää, kuinka "leveälle" liekki leviää.MinLifetimejaMaxLifetime, kuinka korkealle liekki nousee.MinVelocityjaMaxVelocity, kuinka nopeasti liekin hiukkaset liikkuvat.
Savu¶
Valmiin savuefektin saa luotua Smoke-efektin avulla.
Savu käyttäytyy hyvin samalla tavalla kuin tuli, mutta sille Jypelistä löytyy valmis kuva.
Omasta kuvasta luotu savuefekti luodaan antamalla uudelle savulle parametrina kuva ja savun leveys.
Ulomman savuhiukkasen kuvan voi asettaa erikseen:
Savuefektillä on lisäksi monia samoja ominaisuuksia kuin muillakin efekteillä. Ominaisuuksien arvoja muuttamalla voi savusta muokata juuri mieleisensä.
Tuuli¶
Efektien käyttäytymiseen voi myös vaikuttaa tuulen avulla. Tuuli vaikuttaa ainoastaan efekteihin, ei mihinkään muuhun.
Tuulen asettaminen onnistuu samalla tavalla kuin painovoiman:
using System;
using System.Collections.Generic;
using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls;
using Jypeli.Effects;
using Jypeli.Widgets;
namespace WindExample;
public class WindExample : PhysicsGame
{
public override void Begin()
{
Level.BackgroundColor = Color.Black;
Image kuva = LoadImage("Explosion.png");
Flame liekki = new Flame(kuva);
liekki.MaxAngleChange = 30; // Kuinka leveälle liekki leviää
Add(liekki);
Smoke savu = new Smoke();
Add(savu);
savu.Position = new Vector(-150,0);
Wind = new Vector(15, 0);
}
}
Esimerkki tuulesta aiemman tuliefektin kanssa: