Voimia ja kappaleiden sitominen toisiinsa

Jatkamme tässä aikaisempaa lumiukko-esimerkkiä. Viimeistään nyt pitää myös Jypeli olla asennettuna.

1. Lumiukko Riderilla

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.

09 Jun 24 (edited 10 Jun 24)
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.