wiki:VoimiaJaSitominen
Last modified 2 years ago Last modified on 2016-01-20 13:07:48

Voimia ja kappaleiden sitominen toisiinsa

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

1. Lumiukko Visual Studiolla

  • Lue myös sivu Solutioneista ja projekteista
  • Luo Visual Studiolla uusi fysiikka-peli -projekti nimelle Lumiukko. Katso esimerkki täältä
  • Kirjoita Lumiukko.cs tiedoston koodiksi:
    using Jypeli;
    
    public class Lumiukko : PhysicsGame
    {
        public override void Begin()
        {
            Camera.ZoomToLevel();
            Level.BackgroundColor = 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 toista palloista

3. Voimaa kuulaan

  • "lyödään" ylintä palloa sivulle
  • lisää rivi:
      p3.Hit(new Vector(80, 1));
    
  • käännä ja aja
  • kokeile erilaisia lyöntivoimia

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(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

  • nykyisellään lumiukko hajoaa jo ensimmäisestä "lyönnistä".
  • voit sitoa haluamasi kappaleet yhteen seuraavasti. Lisää Add(p3) -rivin jälkeen rivit:
            PhysicsStructure ukko = new PhysicsStructure(p1, p2, p3);
            ukko.Softness = 30;
            Add(ukko);
    
  • kokeile ajaa ja nyt ukon pitäisi olla yksi kokonaisuus.
  • kokeile erilaisilla Softness arvoilla.
  • kokeile eri pallojen lyömistä eri suuntiin