Etusivu | Pong | Omenasoturi
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ää mukaanlukienNopeus
- madon liikkumisnopeusTag
- Pelaajan oma tägiPaaKuva
- Kuva, joka madon pääpalalla tulee olemaanHantaKuva
- 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:
- Otetaan madon pala ja sitä edeltävä pala myöskin (
pala
jaedellinen
). - Lasketaan vektori, joka osoittaa kohti edeltävää palaa (
suunta
). - 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.
Siirry seuraavaan vaiheeseen
\(\large{\Large\Leftarrow}\textrm{ Edellinen vaihe}\) | \(\large{\textrm{Seuraava vaihe}\Large\Rightarrow}\)
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.