Matopeli - vaihe 4

Tässä vaiheessa laitetaan mato liikkumaan nuolinäppäimillä.

Madon liikutus

Liiku aliohjelma työntää madon ensimmäistä palaa, eli päätä, haluttuun suuntaan.

Lisää itsellesi uusi aliohjelma Liiku.

void Liiku(Mato mato, Vector suunta)
{
    PhysicsObject paa = mato.Palat[0];
    paa.Push(mato.Nopeus * suunta);
}

Ohjaimien asettaminen

Laitetaan pelaaja liikkumaan nuolinäppäimillä. Voit halutessasi laittaa jotkin muut näppäimet.

Lisää AsetaOhjaimet aliohjelmaan vihreät rivit:

    void AsetaOhjaimet()
    {

        Keyboard.Listen(Key.Left, ButtonState.Down, Liiku, null, pelaaja, new Vector(-1, 0));
        Keyboard.Listen(Key.Right, ButtonState.Down, Liiku, null, pelaaja, new Vector(1, 0));
        Keyboard.Listen(Key.Up, ButtonState.Down, Liiku, null, pelaaja, new Vector(0, 1));
        Keyboard.Listen(Key.Down, ButtonState.Down, Liiku, null, pelaaja, new Vector(0, -1));

        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
    }

Kentän viimeistely

Matoa ei tällä hetkellä ilmesty peliin, koska LuoMato aliohjelmaa ei käytetä missään. Tehdään pelaajan luonti LuoKentta aliohjelmassa ja muutetaan kentän tausta mustaksi, luodaan seinät kenttään ja kohdistetaan kamera paremmin kentälle.

Lisää itsellesi LuoKentta aliohjelmaan vihreät rivit:

    void LuoKentta()
    {

        LuoMato("pelaaja1", new Vector(0, 0));

        Level.Background.Color = Color.Black;
        Level.CreateBorders();
        Camera.ZoomToLevel(80);

        Timer herkkuAjastin = new Timer();
        herkkuAjastin.Interval = 4;
        herkkuAjastin.Timeout += delegate { LuoHerkku(Level.GetRandomPosition()); };
        herkkuAjastin.Start();
    }

Koodi tällä hetkellä

Koodin pitäisi tällä hetkellä näyttää suurin piirtein tältä:

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;

    Mato pelaaja;

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

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

    void AsetaOhjaimet()
    {
        Keyboard.Listen(Key.Left, ButtonState.Down, Liiku, null,
            pelaaja, new Vector(-1, 0));
        Keyboard.Listen(Key.Right, ButtonState.Down, Liiku, null, pelaaja, new Vector(1, 0));
        Keyboard.Listen(Key.Up, ButtonState.Down, Liiku, null, pelaaja, new Vector(0, 1));
        Keyboard.Listen(Key.Down, ButtonState.Down, Liiku, null, pelaaja, new Vector(0, -1));

        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");
    }

    void LuoKentta()
    {
        LuoMato("pelaaja1", new Vector(0, 0));

        Level.Background.Color = Color.Black;
        Level.CreateBorders();
        Camera.ZoomToLevel(80);

        Timer herkkuAjastin = new Timer();
        herkkuAjastin.Interval = 4;
        herkkuAjastin.Timeout += delegate { LuoHerkku(Level.GetRandomPosition()); };
        herkkuAjastin.Start();
    }

    void LuoHerkku(Vector paikka)
    {
        PhysicsObject herkku = new PhysicsObject(10, 10, Shape.Circle);
        herkku.Position = paikka;
        herkku.IgnoresCollisionResponse = true;
        herkku.Tag = "herkku";
        herkku.MakeStatic();
        Add(herkku);
    }

    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();
    }

    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);
    }

    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);
            }
        }
    }

    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;
            }
        }
    }

    void Liiku(Mato mato, Vector suunta)
    {
        PhysicsObject paa = mato.Palat[0];
        paa.Push(mato.Nopeus * suunta);
    }
}

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