source: renne_l/Zombi tasohyppely/Peli.cs @ 286

Revision 286, 11.1 KB checked in by rejulein, 11 years ago (diff)

Zombi tasohyppely

Line 
1using System;
2using Microsoft.Xna.Framework;
3using Microsoft.Xna.Framework.Graphics;
4using Microsoft.Xna.Framework.Input;
5using Microsoft.Xna.Framework.Media;
6
7using Physics2DDotNet;
8using AdvanceMath;
9using Jypeli;
10using Jypeli.ScreenObjects;
11using Jypeli.Assets;
12
13
14namespace Zombi_tasohyppely
15{
16    // Yksinkertainen tasohyppely.
17    class Tasohyppely : PhysicsGame
18    {
19        #region Muuttujat
20
21        const double liikeVoima = 4000;
22        const double hyppyVoima = 2500;
23
24        Meter<int> pisteLaskuri;
25        ValueDisplay pisteNaytto;
26
27        PlatformCharacter pelaaja1;
28        PhysicsObject maali;
29
30        int kenttaNro; // monesko kenttä on menossa
31
32        #endregion
33
34
35        #region Alustukset
36        protected override void LoadContent()
37        {
38            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
39            kenttaNro = 0;
40
41            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
42
43            // Luodaan pistelaskuri
44            pisteLaskuri = new Meter<int>(0, 0, 1000000);
45
46            // luodaan pistelaskunäyttö
47            pisteNaytto = new ValueDisplay(this);
48            pisteNaytto.Text = "Pisteitä: ";
49            pisteNaytto.X = Screen.RightSafe - 250;
50            pisteNaytto.Y = Screen.TopSafe - 50;
51            pisteNaytto.BindTo(pisteLaskuri);
52            Add(pisteNaytto);    // lisätään peliin
53
54            // Asetetaan painovoima
55            Gravity = new Vector2D(0, -1000);
56
57            // Zoomataan lähemmäksi
58            Camera.ZoomFactor = 2.0;
59            aikaLaskuri = new Meter<double>(30, 0, 30);  // aikaLaskurin oletuksena on 30 sekuntia, minimiarvona 0 sekuntia ja maksimiarvona 30 sekuntia
60            aikaNaytto = new ValueDisplay(this);         // luo uuden aikaNayton
61            aikaNaytto.Text = "Aikaa jäljellä: ";          // laitetaan näytöllä näkyvä teksti
62            aikaNaytto.TextColor = Color.Crimson;          // vaihdetaan tekstin väriä
63            aikaNaytto.FormatDouble(0, true);            // asetetaan näyttämään aika siten, ettei siinä näy yhtään (0) desimaalia
64            aikaNaytto.BindTo(aikaLaskuri);              // liitetään aikaNaytto aikaLaskuriin
65            aikaLaskuri.LowerLimit += new Meter<double>.OnLimitHandler(AikaLoppui);  // asetetaan tapahtuma, kun aikaLaskurin arvona on 0.
66            Add(aikaNaytto);                             
67            aloitaUusiPeli();
68
69        }
70        private void AikaLoppui(Meter<double> sender)
71        {
72            MessageDisplay.Add("Aika loppui...");  // näytetään viestinäytöllä teksti
73            // täydennä: mitä tapahtuu, kun aika loppui
74            aikaLaskuri.Reset();  // nollataan aikalaskuri oletusarvoonsa, joka oli 0.
75        }
76        protected override void OnUpdate(GameTime time)
77        {
78            aikaLaskuri.Value -= time.ElapsedGameTime.TotalSeconds;  // päivittää aikalaskuria siten, että arvosta vähennetään kulunut aika
79            base.OnUpdate(time);                                   // tämä rivi tarvitsee myös olla tässä. selitys: päivittää myös kantaluokan, josta peli on peritty.
80        }
81        Meter<double> aikaLaskuri;
82        ValueDisplay aikaNaytto;
83
84
85        void aloitaUusiPeli()
86        {
87            MessageDisplay.Clear();
88
89            kenttaNro = 0;
90
91            // ladataan kenttä
92            Level = seuraavaKentta();
93
94            // Laitetaan peliohje näyttöön
95            MessageDisplay.Add("Etsi iso tähti!");
96            MessageDisplay.Add("Mutta varo haamuja...");
97        }
98        #endregion
99
100
101        #region KentanLataus
102        Level seuraavaKentta()
103        {
104            pisteLaskuri.Reset();
105            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
106            MessageDisplay.Add("Kenttä " + kenttaNro);
107            Level seuraava = luoKentta();
108            lisaaNappaimet();
109            Camera.Follow(pelaaja1);
110            return seuraava;
111        }
112
113        Level luoKentta()
114        {
115            Level kentta = new Level(this, 2000, 1000);
116            kentta.CreateBorder();
117            kentta.Borders.Visible = false;
118            kentta.Background.CreateGradient(Color.White, Color.SkyBlue);
119
120            Platform alusta = new Platform(kentta.Width, 300, Color.LightGreen);
121            alusta.X = 0;
122            alusta.Y = kentta.Bottom - alusta.Height / 2;
123            kentta.Objects.Add(alusta);
124
125            lisaaPieniTaso(kentta, -200, -350);
126            lisaaPieniTaso(kentta, 0, -200);
127            lisaaPieniTaso(kentta, 400, -150);
128
129            lisaaPieniTaso(kentta, 500, 0);
130            lisaaPieniTaso(kentta, 400, 100);
131
132            lisaaMaali(kentta);
133            lisaaPelaajat(kentta);
134            lisaaTahdet(kentta);
135
136            int vihollistenMaara = kenttaNro;
137            lisaaViholliset(kentta, vihollistenMaara);
138
139            return kentta;
140        }
141
142        void lisaaPieniTaso(Level kentta, double x, double y)
143        {
144            Platform taso = new Platform(100, 30, Color.Green);
145            taso.X = x;
146            taso.Y = y;
147            kentta.Objects.Add(taso);
148        }
149
150        void lisaaPelaajat(Level kentta)
151        {
152            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
153            pelaaja1.Texture = Content.Load<Texture2D>("norsu");
154            pelaaja1.X = 0;
155            pelaaja1.Y = kentta.Bottom + 120;
156
157            AddCollisionHandler(pelaaja1, osuiMaaliin);
158
159            kentta.Objects.Add(pelaaja1);
160        }
161
162        void lisaaTahdet(Level kentta)
163        {
164            for (int i = 0; i < 20; i++)
165            {
166                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
167                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
168                tahti.Y = 400.0;
169                tahti.Restitution = 1.0;
170                tahti.Texture = Content.Load<Texture2D>("tahti");
171                AddCollisionHandler(tahti, keraa);
172                kentta.Objects.Add(tahti);
173
174            }
175        }
176
177        void lisaaMaali(Level kentta)
178        {
179            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
180            maali.Tag = "maali";
181            maali.IgnoresCollisionResponse = true;
182            maali.X = 0;
183            maali.Y = 325;
184            maali.Texture = Content.Load<Texture2D>("tahti");
185            kentta.Objects.Add(maali);
186        }
187
188        void lisaaViholliset(Level kentta, int kpl)
189        {
190            for (int i = 0; i < 6; i++)
191            {
192                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
193                vihollinen.Brain = new RandomMoverBrain();
194                vihollinen.X = maali.X;
195                vihollinen.Y = maali.Y;
196                vihollinen.IgnoresGravity = true;
197                vihollinen.Texture = Content.Load<Texture2D>("vihollinen");
198                AddCollisionHandler(vihollinen, alkuun);
199                kentta.Objects.Add(vihollinen);
200            }
201        }
202        #endregion
203        void alkuun(Collision collision )
204        {
205            if (collision.Other == pelaaja1)
206            {
207                pelaaja1.X = 0;
208                pelaaja1.Y = -430;
209            }
210        }
211        #region Nappaimet
212        // Lisää peliin kaikki näppäimet
213        void lisaaNappaimet()
214        {
215            ClearControls();
216            //Yleiset näppäimet
217            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
218
219            // Pelaajan näppäimet
220            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
221            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
222            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
223
224            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
225        }
226
227        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
228        {
229            //Yleiset näppäimet
230            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
231
232            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
233            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
234            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
235        }
236
237        // Näppäimiin liitetyt toiminnot alkavat tästä -->
238        bool liikuta(ControlEvent e)
239        {
240            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
241            Vector2D voima = e.Parameter1.ToVector2D();
242            hahmo.Walk(e.Time, voima);
243            return false;
244        }
245
246        bool hyppaa(ControlEvent e)
247        {
248            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
249            double voima = e.Parameter1.ToDouble();
250
251            if (hahmo.Jump(voima))
252            {
253                this.PlaySound("hyppays");
254            }
255            return false;
256        }
257
258        bool uusiPeli(ControlEvent e)
259        {
260            aloitaUusiPeli();
261            return true;
262        }
263        #endregion
264
265
266        #region Tapahtumat
267        // Kun osutaan maaliin
268        void osuiMaaliin(Collision collision)
269        {
270            if (collision.Other.Tag == "maali")
271            {
272                this.PlaySound("maali");
273                int edellisenKentanPisteet = pisteLaskuri.Value;
274                Level = seuraavaKentta();
275                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
276            }
277        }
278
279        // Kerää tähden ja antaa pisteen
280        void keraa(Collision collision)
281        {
282            if (collision.Other.Equals(pelaaja1))
283            {
284                PhysicsObject tahti = collision.Obj;
285                tahti.Destroy();
286
287                this.PlaySound("kerays", -0.5, 0.5);
288                pisteLaskuri.Value += 1;
289            }
290        }
291
292        // Haamu tuuppaa pelaajaa
293        void tuuppaa(Collision collision)
294        {
295            if (collision.Other is PlatformCharacter)
296            {
297                double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
298                double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
299
300                if (collision.Other == pelaaja1)
301                {
302                    // pieni värinä törmäyksestä
303                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
304                }
305                this.PlaySound("tuuppaus");
306                collision.Other.Hit(new Vector2D(luku1, luku2));
307            }
308        }
309        #endregion
310    }
311}
Note: See TracBrowser for help on using the repository browser.