Voimia ja kappaleiden sitominen toisiinsa
Jatkamme tässä aikaisempaa lumiukko-esimerkkiä. Viimeistään nyt pitää myös Jypeli olla asennettuna.
1. Lumiukko Riderilla
- Lue myös sivu Solutioneista ja projekteista
- Luo Riderilla uusi fysiikka-peli -projekti nimelle Lumiukko. Katso esimerkki täältä
- Kirjoita Lumiukko.cs tiedoston koodiksi:
Miksi saan virheilmoituksen "Program does not contain a static 'Main' method suitable for an entry point" Kun tämän esimerkin koodin ajaa sellaisenaan
edit: Ongelma ratkesi, ohjelma vaati alkuun blokin: public static void Main() { using (Pukkailu peli = new Pukkailu()) { peli.Run(); } }
Jos projektissa ei ole Ohjelma.cs-tiedostoa, voi korjata tuolla tavalla.
—using Jypeli;
namespace Lumiukko;
public class Lumiukko : PhysicsGame
{
public override void Begin()
{
Camera.ZoomToLevel();
Level.Background.Color = Color.Black;
PhysicsObject p1 = new PhysicsObject(2 * 100.0, 2 * 100.0, Shape.Circle);
p1.Y = Level.Bottom + 200.0;
Add(p1);
PhysicsObject p2 = new PhysicsObject(2 * 50.0, 2 * 50.0, Shape.Circle);
p2.Y = p1.Y + 100 + 50;
Add(p2);
PhysicsObject p3 = new PhysicsObject(2 * 30.0, 2 * 30.0, Shape.Circle);
p3.Y = p2.Y + 50 + 30;
Add(p3);
Gravity = new Vector(0, -400);
}
}
- aja peli
- ongelmana on se, että ukko putoaa pois kuvasta.
2. Reunat peliin
- lisätään aluksi reunat peliin, niin kappaleet eivät pääse pois pelialueelta
- lisää Begin-metodin loppuun rivi
Level.CreateBorders();
- nyt kukin lumipallon osa on oma kokonaisuutensa ja käyttäytyy fysiikan lakien mukaisesti pompaten alareunasta ja toisista palloista.
3. Voimaa kuulaan
- "lyödään" ylintä palloa sivulle
- lisää rivi:
p3.Hit(new Vector(80, 1));
- käännä ja aja
- Ylin pallo liikkuu hitaasti oikealle, miksi?
- Muutetaan "lyönnin" voimaa lisäämällä kerroin vektoriin:
p3.Hit(25 * new Vector(80, 1));
- kokeile erilaisia lyöntivoimia ja -suuntia
4. Painovoiman suunnan vaihtaminen
- lisätään ohjelmaan vielä kello, jonka perusteella painovoima vaihtaa suuntaansa
- lisää Begin-metodin loppuun rivit:
Timer t = new Timer();
t.Interval = 5.0;
t.Timeout += VaihdaPainovoimaa;
t.Start();
Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu");
Keyboard.Listen(Key.F1, ButtonState.Pressed,
ShowControlHelp, "Näytä näppäinohjeet");
- viimeiset kaksi riviä eivät liity kelloon, vaan sen ansiosta Esc näppäintä painamalla poistutaan ohjelmasta ja F1 näppäimellä näytetään avustus
- lisää vielä Begin-metodin loppusulun } perään pari tyhjää riviä ja uusi VaihdaPainovoimaa-metodi:
private void VaihdaPainovoimaa()
{
Gravity = Vector.FromLengthAndAngle(Gravity.Magnitude,
Gravity.Angle + Angle.FromDegrees(90.0));
}
- eli nyt 5.0 sekunnin välein käydään suorittamassa VaihdaPainovoimaa-metodi, joka muodostaa uuden painovoimavektorin, jolla on sama voiman suuruus kuin aikaisemminkin (Gravity.Magnitude) mutta painovoimavektorin suunta kasvaa 90 asteella. Eli ohjelman aluksi painovoima vaikuttaa alaspäin, sitten 5 sekunnin kuluttua 90 astetta vastapäivään kierrettynä, eli "vetää" oikealle seinälle, seuraavan 5 sekunnin kuluttua ylöspäin, sitten vasemmalle ja lopulta taas alaspäin.
- aja ohjelmaa muutama "kierros". Kokeile painaa F1 ja sitten myöhemmin Esc.
5. Nappulat tekemään muutakin
- lisätään vielä niin, että nuoli-ylös näppäimellä saadaan keskipallo "potkaistua" ylöspäin.
- lisää edellisen Keyboard.Listen rivin perään:
Keyboard.Listen(Key.Up, ButtonState.Pressed, LyoPalloa, "Lyö keskipalloa ylöspäin",p2,new Vector(0,1000));
- lisää VaihdaPainovoimaa-metodin perään (siis }-sulun jälkeen) uusi metodi LyoPalloa:
private void LyoPalloa(PhysicsObject pallo, Vector suunta)
{
pallo.Hit(pallo.Mass * suunta);
}
- nyt siis joka kerta nuoli ylös -näppäintä painettaessa kutsutaan metodia LyoPalloa ja sille viedään parametriksi pallon p2 viite sekä ylöspäin osoittava voimavektori.
- aja ja kokeile nuoli ylös -näppäintä.
- keksi miten lisätään "lyönti" vasemmalle, oikealla ja alas?
- entä miten voitaisiin lyödä muita palloja? (vinkki, esim. A-näppäimeen voi viitata nimellä Key.A)
6. Kappaleiden sitominen toisiinsa
- nyt lumiukko kostuu kolmesta toisistaan irrallisista pallosta, joten lumiukko hajoaa heti.
- voit sitoa haluamasi kappaleet yhteen seuraavasti. Lisää Add(p3) -rivin jälkeen rivit:
PhysicsStructure ukko = new PhysicsStructure(p1, p2, p3);
Add(ukko);
Vaihda kohdan 5 rivi
Keyboard.Listen(Key.Up, ButtonState.Pressed, LyoPalloa, "Lyö keskipalloa ylöspäin", p2, new Vector(0,1000));
seuraavanlaiseksi:
Keyboard.Listen(Key.Up, ButtonState.Pressed, LyoUkkoa, "Lyö lumiukkoa ylöspäin", ukko, new Vector(0,1000));
Lisää ohjelmaan vielä uusi aliohjelma LyoUkkoa:
private void LyoUkkoa(PhysicsStructure ukko, Vector suunta)
{
ukko.Hit(ukko.Mass * suunta);
}
- kokeile ajaa ja nyt ukon pitäisi olla yksi kokonaisuus.
- kokeile eri pallojen lyömistä eri suuntiin
These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.