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 » Miten peliin saa aseita?

Jypeli sisältää valmiita aseita peleissä käytettäväksi.

Aseet on toimivat fysiikkapeleissä ja tasohyppelypeleissä. Yleensä ase on jollakin pelihahmolla.

Aseen voi lisätä mille tahansa fysiikkaoliolle (PhysicsObject) tai pelioliolle (GameObject).

Tasohyppelyhahmolle (PlatformCharacter) lisätty ase kääntyy automaattisesti hahmon rintamasuunnan mukaisesti.

Asetta ei tietenkään ole pakko lisätä hahmolle, vaan sen voi lisätä peliin Add-kutsulla kuten minkä tahansa muunkin peliolion. Huomaa kuitenkin, että aseet eivät ole fysiikkaolioita. Ne eivät siis itsenään voi törmätä mihinkään!

1. Aseen luominen ja lisääminen mille tahansa oliolle (esimerkiksi PhysicsObject-fysiikkaoliolle)

1.1 Ase attribuutiksi

public class Peli : PhysicsGame
{
    AssaultRifle pelaajan1Ase;

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

1.2 Aseen luominen

Aseen luominen kannattaa tehdä samassa paikassa missä luodaan asetta kantava olio. Tässä esimerkissä pelaaja1 voi olla vaikkapa fysiikkaolio.

pelaajan1Ase = new AssaultRifle(30, 10);

// Jos et halua ammusten määrän rajoitusta, vaan loputtomat panokset,
// niin älä lisää seuraavaa riviä ollenkaan:
pelaajan1Ase.Ammo.Value = 1000; // Ammusten määrä aluksi

// Kuinka monta laukasuta sekunnissa ase voi ampua
pelaajan1Ase.FireRate = 5;

// Mitä tapahtuu kun ammus osuu johonkin?
pelaajan1Ase.ProjectileCollision = AmmusOsui;

// Laitetaan ase samaan sijaintiin kuin pelaaja, eli se on silloin pelaajan keskellä.
pelaajaniAse.Position = pelaaja1.Position;

pelaaja1.Add(pelaajan1Ase);

Ase lisätään fysiikkaolio pelaaja1:n lapsiolioksi. Tämä tarkoittaa sitä, että ase liikkuu pelaajan mukana. Aseen sijaintia suhteessa pelaajaan voidaan muuttaa esimerkiksi asettamalla:

pelaajan1Ase.Position = pelaaja1.Position + new Vector(pelaaja1.Width / 2, 0);

Jolloin ase sijaitsee pelaajan oikeassa reunassa.

Vaihtoehtoisesti sijainti voidaan asettaa myös RelativePositionin avulla:

pelaajan1Ase.RelativePosition = new Vector(pelaaja1.Width / 2, 0);

Tämä voidaan tehdä vasta sen jälkeen, kun ase on lisätty pelaajalle! Tämä on yksi niitä harvoja tilanteita kappaleiden attribuuttien määrityksen suhteen, milloin rivien suoritusjärjestyksellä on merkitystä lopputulokseen.

1.3 Ammuksen törmäyksen käsittelevä aliohjelma

void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
{
    //ammus.Destroy();
}

1.4 Aseella ampuminen

Asetetaan näppäin, josta ase ampuu. Aseella voi ampua sen Shoot-metodia kutsumalla.

Ampumisesta kannattaa tehdä oma aliohjelma (Shoot-aliohjelman kutsua ei voi antaa suoraan näppäimen kuuntelijalle):

Sen aseen, jolla halutaan ampua, voi viedä parametrina AmmuAseella-aliohjelmalle.

Keyboard.Listen(Key.Space, ButtonState.Down, AmmuAseella, "Ammu", pelaajan1Ase);

Jos halutaan päästä käsiksi aseesta lähtevään ammukseen, vaikkapa ammuksen koon, kuvan tai eliniän muuttamista varten, Shoot-metodi palauttaa aina viimeksi ammutun ammuksen.

Shoot palauttaa null, jos aseesta ei lähdekään ammusta, jos vaikka ammukset ovat loppuneet tai aseella yritetään ampua liian nopeasti edellisen ampumisen jälkeen. Tarkastetaan myös tämä:

void AmmuAseella(AssaultRifle ase)
{
    PhysicsObject ammus = ase.Shoot();

    if (ammus != null)
    {
        //ammus.Size *= 3;
        //ammus.Image = ...
        //ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
    }
}

2. Aseen luominen ja lisääminen PlatformCharacter-tasohyppelyhahmolle

Aseen lisääminen tasohyppelyhahmolle menee muuten samalla tavalla, mutta aseen voi lisätä suoraan PlatformCharacterin Weapon-ominaisuuteen.

2.1 Aseen luominen

Aseen luominen kannattaa tehdä samassa paikassa missä luodaan asetta kantava tasohyppelyhahmo.

Uuden aseen voi sijoittaa suoraan tasohyppelyhahmon Weapon-ominaisuuden arvoksi. Tämän jälkeen aseeseen voi viitata Weapon-ominaisuuden avulla.

//pelaaja1 on PlatformCharacter-tyyppinen
pelaaja1.Weapon = new AssaultRifle(30, 10);

//Ammusten määrä aluksi:
pelaaja1.Weapon.Ammo.Value = 1000;

//Mitä tapahtuu kun ammus osuu johonkin?
pelaaja1.Weapon.ProjectileCollision = AmmusOsui;

2.2 Ammuksen törmäyksen käsittelevä aliohjelma

void AmmusOsui(PhysicsObject ammus, PhysicsObject kohde)
{
    //ammus.Destroy();
}

2.3 Aseella ampuminen

Asetetaan näppäin, josta ase ampuu. Aseella voi ampua sen Shoot-metodia kutsumalla.

Ampumisesta kannattaa tehdä oma aliohjelma (Shoot-aliohjelman kutsua ei voi antaa suoraan näppäimen kuuntelijalle).

Sen tasohyppelyhahmon, jonka aseella halutaan ampua, voi viedä aliohjelmalle parametrina.

Keyboard.Listen(Key.Space, ButtonState.Down, AmmuAseella, "Ammu", pelaaja1);

Jos halutaan päästä käsiksi aseesta lähtevään ammukseen, vaikkapa ammuksen koon, kuvan tai eliniän muuttamista varten, Shoot-metodi palauttaa aina viimeksi ammutun ammuksen.

Shoot palauttaa null, jos aseesta ei lähdekään ammusta, jos vaikka ammukset ovat loppuneet. Tarkastetaan myös tämä:

void AmmuAseella(PlatformCharacter pelaaja)
{
    PhysicsObject ammus = pelaaja.Weapon.Shoot();

    if(ammus != null)
    {
        //ammus.Size *= 3;
        //ammus.Image = ...
        //ammus.MaximumLifetime = TimeSpan.FromSeconds(2.0);
    }
}

3. Tähtääminen

Lyhyesti sanottuna asetta voi käännellä ja sillä voi tähdätä aseen kulmaa muuttamalla:

pyssy.Angle += Angle.FromDegrees(1);

Tarkempia ohjeita tähtäämiseen löytyy kuitenkin tähtäämissivulta.

4. Valmiit ampuma-aseet

Näillä voi rei'ittää viholliset tehokkaasti.

Jokainen ase sisältää mm. ammuslaskurin, oletuskuvan ja oletusäänen.

Jokaiselle aseelle voi määrittää ammusten törmäyksenkäsittelyn eli ProjectileCollision.

4.1 AssaultRifle - rynnäkkökivääri

Ampuu luoteja varsin tiheään.

AssaultRifle pyssy = new AssaultRifle(20, 5);
//pyssy.ProjectileCollision = AmmusOsui;

4.2 PlasmaCannon - plasmatykki

Image

PlasmaCannon plasmaTykki = new PlasmaCannon(20, 5);
//plasmaTykki.ProjectileCollision = AmmusOsui;

4.3 LaserGun - laserase

Laserase on (toistaiseksi) samannäköinen kuin plasmatykki. Ammus ja ääni on erilainen.

LaserGun laserAse = new LaserGun(20, 5);
//laserAse.ProjectileCollision = AmmusOsui;

4.4 Cannon - tykki

Tykki ampuu kuulia.

Cannon tykki = new Cannon(50, 10);
//tykki.ProjectileCollision = AmmusOsui;

4.5 Kaikille aseille yhteiset ominaisuudet

Kaikilla aseilla on paljon yhteisiä ominaisuuksia, joita muuttamalla voi aseista muokata erilaisia ja paremmin omaan peliin sopivia.

Ammusten määrä:

ase.Ammo.Value = 500;

//loputtomat ammukset:
ase.InfiniteAmmo = true;

Seuraavana piipussa olevan ammuksen nopeus:

ase.Power.Value = 2000; 

Kaikkien ammusten oletusnopeus:

ase.Power.DefaultValue = 2000; 

Tulinopeus eli montako laukausta enintään sekunnissa:

ase.FireRate = 5.0;

Painovoiman vaikutus:

ase.AmmoIgnoresGravity = false;

Räjähdysten vaikutus:

ase.AmmoIgnoresExplosions = true;

Ammusten osuminen aseen omistajaan:

ase.CanHitOwner = false;

Kuva:

ase.Image = aseenKuva;

//ei kuvaa:
ase.Image = null;

Ääni:

ase.AttackSound = aseenAani;

//ei ääntä:
ase.AttackSound = null;

Paikka:

Kun ase on lisätty jollekin oliolle, sen paikka määräytyy suhteessa aseen omistajaan.

Esimerkiksi jos aseen X-koordinaatin arvoksi asetetaan 10, tämä tarkoittaa että ase sijoittuu pelikentässä 10 yksikköä aseen omistajasta oikealle.

ase.X = 10.0;
ase.Y = -5.0;
# heitettavat

4.6 Kranaatti ja muut heitettävät oliot

Kranaatit ovat heitettäviä panoksia, jotka räjähtävät tietyn ajan kuluttua. Oletuksena tämä aika on kolme sekuntia.

Kranaatti luodaan antamalla sille parametrina säde:

Grenade kranaatti = new Grenade(4.0);

Kranaatti voidaan heittää valmiilla Throw-aliohjelmalla automaattisesti oikeaan suuntaan:

void HeitaKranaatti(PlatformCharacter pelaaja)
{
   Grenade kranu = new Grenade(4.0);
   pelaaja.Throw(kranu, Angle.FromDegrees(30), 10000);
}

Throw-aliohjelmaa voi käyttää myös minkä tahansa muun olion heittämiseen poispäin toisesta oliosta. Se toimii kuten Hit, paitsi että se lisää olion kentälle ja hoitaa heittovektorin laskemisen puolestasi.

Mitä tapahtuu kun räjähdys osuu johonkin? Se voidaan määrittää näin:

Suoritetaan aliohjelma KranaattiOsui jos räjähdys yltää johonkin, mihin tahansa olioon:

kranu.Explosion.ShockwaveReachesObject += KranaattiOsui;

Suoritetaan aliohjelma KranaattiOsui jos räjähdys yltää sellaiseen olioon, jolla on Tag-ominaisuutena "vihollinen":

kranu.Explosion.AddShockwaveHandler("vihollinen", KranaattiOsui);

Räjähdyksen osuman käsittelevä aliohjelma:

void KranaattiOsui(IPhysicsObject rajahdyksenKohde, Vector v)
{
    rajahdyksenKohde.Destroy();
}

4.7 Rypälekranaatti

Rypälekranaattia käytetään samaan tapaan kuin tavallista kranaattia. Erikoisuutena on se, että se hajoaa räjähtäessään useaksi pienemmäksi kranaatiksi. Nämä kranaatit voivat edelleen hajota useampaan osaan!

Rypälekranaatin luomisessa ensimmäinen parametri on säde ja toinen on luku, joka kertoo kuinka monta kertaa kranaatti hajoaa osiin. Tähän ei yleensä kannata laittaa kolmosta isompaa lukua, sillä pommien määrä voi kasvaa järkyttävän suureksi hyvin nopeasti!

ClusterGrenade kranaatti = new ClusterGrenade(4.0, 2);
Add(kranaatti);

Rypälekranaatille voi kertoa, kuinka moneen osaan se kerrallaan hajoaa seuraavasti:

kranaatti.NumberOfClusters = 4;

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