Matopeli - vaihe 3

Tässä vaiheessa luodaan mato ja sen palat.

Tämä vaihe on monimutkaisin, tai vähintäänkin pisin, mutta voit kysyä kerhon ohjaajilta, jos jokin kohta on epäselvä.

Madon luominen

Luokan ja attribuutien lisääminen

Luodaan matoa varten oma luokka, jolle säilötään kaikki matoon liittyvä tieto.

Madolla on seuraavat ominaisuudet

  • Palat - lista kaikista paloista, pää mukaanlukien
  • Nopeus - madon liikkumisnopeus
  • Tag - Pelaajan oma tägi
  • PaaKuva - Kuva, joka madon pääpalalla tulee olemaan
  • HantaKuva - Kuva, joka madon häntäpalalla tulee olemaan

Matopeliin lisätään myös pelaaja ja pelaajalle kuvat paaKuva1 ja hantaKuva1.

Harmaalla taustalla olevat koodit pitäisivät löytyä jo sinulta.

Lisää itsellesi oikeaan paikkaan vihreällä taustalla olevat koodit.

using System;
using System.Collections.Generic;
using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls;
using Jypeli.Effects;
using Jypeli.Widgets;

class Mato
{
    public List<PhysicsObject> Palat { get; set; } = new List<PhysicsObject>();

    public double Nopeus { get; set; }

    public string Tag { get; set; }

    public Image PaaKuva { get; set; }

    public Image HantaKuva { get; set; }
}

public class Matopeli : PhysicsGame
{

    const int ALKUPALOJA = 8; // Monestako palasta pelaajat koostuvat aluksi.

    Mato pelaaja;

    Image paaKuva1 = LoadImage("pelaaja1paa");
    Image hantaKuva1 = LoadImage("pelaaja1hanta");

    public override void Begin()
    {
        LuoKentta();
        AsetaOhjaimet();
    }

Madon luominen

Lisää itsellesi LuoMato aliohjelma luokan Matopeli sisälle.

LuoMato aliohjelmassa luodaan uusi Mato olio pelaajalle, jonka jälkeen luodaan madon pää ja häntäpalat. Häntäpaloja luodaan ALKUPALOJA vakion verran, joka on oletuksena 8, mutta voit vaihtaa sitä halutessasi.

Törmäyskäsittelijä tarkistaa törmättiinkö objektiin, jolla on täginä "herkku". Jos törmättiin, niin syödään herkku ja kasvatetaan hännän pituutta, muussa tapauksessa tuhotaan mato.

ajastin kutsuu LiikutaPaloja (kyseinen aliohjelma luodaan myöhemmin) kokoajan.

Huom! Koodi ei toimi vielä tuollaisenaan. Tarvitset myös aliohjelmat LisaaHantapala, TuhoaMato ja LiikutaPaloja, jotka löytyvät alempaa ohjeesta.

    void LuoMato(string tag, Vector paikka)
    {
        pelaaja = new Mato();
        pelaaja.PaaKuva = paaKuva1;
        pelaaja.HantaKuva = hantaKuva1;
        pelaaja.Tag = tag;
        pelaaja.Nopeus = 800;

        // Luodaan madon pää.
        PhysicsObject paa = new PhysicsObject(30, 30);
        paa.Position = paikka;
        paa.Image = pelaaja.PaaKuva;
        paa.MaxVelocity = 400;
        paa.Tag = pelaaja.Tag;
        Add(paa);
        pelaaja.Palat.Add(paa);

        // Lisätään häntäpalat.
        for (int i = 0; i < ALKUPALOJA; i++)
        {
            LisaaHantapala(pelaaja);
        }

        // Lisätään törmäyskäsittelijä madon pääpalalle.
        AddCollisionHandler(paa, delegate(PhysicsObject pala, PhysicsObject kohde)
        {
            if (kohde.Tag.ToString() == "herkku")
            {
                kohde.Destroy();
                LisaaHantapala(pelaaja);
            }
            else if (kohde.Tag.ToString() != tag)
            {
                TuhoaMato(pelaaja);
            }
        });

        // Luodaan ajastin, joka liikuttelee jatkuvasti madon häntäpaloja.
        Timer ajastin = new Timer();
        ajastin.Timeout += delegate { LiikutaPaloja(pelaaja); };
        ajastin.Interval = 0.01;
        ajastin.Start();
    }

Häntäpalojen luominen

LisaaHantapala luo uuden palan häntää viimeisimmän häntäpalan kohdalle.

    void LisaaHantapala(Mato mato)
    {
        PhysicsObject viimeinenPala = mato.Palat[mato.Palat.Count - 1];

        PhysicsObject uusiPala = new PhysicsObject(viimeinenPala.Width, viimeinenPala.Height);
        uusiPala.Position = viimeinenPala.Position;
        uusiPala.IgnoresCollisionResponse = true;
        uusiPala.LinearDamping = 0.1;
        uusiPala.Image = mato.HantaKuva;
        uusiPala.Tag = mato.Tag;
        Add(uusiPala);
        mato.Palat.Add(uusiPala);
    }

Häntäpalojen liikutus

LiikutaPaloja aliohjelma käy silmukassa läpi kaikki madon palat ja liikuttaa jokaisen palan kiinni edeltävään palaan ja pyörittää sen kohti edeltävää palaa myöskin. Tämän avulla mato pysyy kasassa.

Palan liikutus tapahtuu näin:

  1. Otetaan madon pala ja sitä edeltävä pala myöskin (pala ja edellinen).
  2. Lasketaan vektori, joka osoittaa kohti edeltävää palaa (suunta).
  3. Jos pala on liian kaukana, niin liikutetaan se kiinni edelliseen palaan ja käännetään sitä kohti.
    void LiikutaPaloja(Mato mato)
    {
        if (mato.Palat.Count == 0)
            return;

        PhysicsObject paa = mato.Palat[0];
        paa.Angle = paa.Velocity.Angle;

        for (int i = 1; i < mato.Palat.Count; i++)
        {
            PhysicsObject pala = mato.Palat[i];
            PhysicsObject edellinen = mato.Palat[i - 1];

            Vector suunta = edellinen.Position - pala.Position;
            if (suunta.Magnitude > pala.Width * 0.5)
            {
                pala.Position = edellinen.Position + suunta.Angle.GetVector() * -pala.Width * 0.5;
                pala.Angle = suunta.Angle;
            }
        }
    }

Madon tuhoutuminen

TuhoaMato siirtää kahdeksan palaa satunnaiseen uuteen aloituspaikkaan paikkaan (uusiPaikka vektori) ja tuhoaa ylimääräiset häntäpalat.

Tuhoutuneiden palojen kohdalle luodaan herkkuja, joita muut pelaajat voivat käydä syömässä.

    void TuhoaMato(Mato mato)
    {
        Vector uusiPaikka = Level.GetRandomFreePosition(20);
        PhysicsObject[] vanhatPalat = mato.Palat.ToArray();
        mato.Palat.Clear();

        for (int i = 0; i < vanhatPalat.Length; i++)
        {
            PhysicsObject pala = vanhatPalat[i];
            LuoHerkku(pala.Position);
            pala.Position = uusiPaikka;
            pala.Velocity = Vector.Zero;
            pala.Size = new Vector(30, 30);

            if (i >= ALKUPALOJA)
            {
                pala.Destroy();
            }
            else
            {
                mato.Palat.Add(pala);
            }
        }
    }

Huom! Mato ei tällä hetkellä vielä ilmesty peliin. Tämä korjataan seuraavassa vaiheessa.

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