source: solja_l/SuuriKynttila/SuuriKynttila/Peli.cs @ 397

Revision 397, 13.7 KB checked in by sosolamm, 11 years ago (diff)
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 SuuriKynttila
15{
16    // Yksinkertainen tasohyppely.
17    class Tasohyppely : PhysicsGame
18    {
19        #region Muuttujat
20
21        const double liikeVoima = 3000;
22        const double hyppyVoima = 2000;
23
24        //Meter<int> pisteLaskuri;
25        //ValueDisplay pisteNaytto;
26
27        PlatformCharacter pelaaja1;
28        PlatformCharacter pelaaja2;
29        PhysicsObject maali;
30
31        //Timer ajastin;
32
33        int kenttaNro; // monesko kenttä on menossa
34        bool pelaajalla1onliekki=false;
35        bool pelaajalla2onliekki = false;
36
37        #endregion
38
39
40        #region Alustukset
41
42        protected override void Update(GameTime gameTime)
43        {
44            base.Update(gameTime);
45           
46            //double muutos = gameTime.ElapsedGameTime.Ticks * kameranNopeus;
47            double pelaajienEtaisyysY = Math.Abs(pelaaja1.Y - pelaaja2.Y);
48            if (pelaaja1.Y > pelaaja2.Y)
49            {
50                Camera.Position = new Vector2D(0, pelaaja1.Y - pelaajienEtaisyysY/2);
51            }
52            else
53            {
54                Camera.Position = new Vector2D(0, pelaaja2.Y - pelaajienEtaisyysY / 2);
55            }
56           
57
58        }           
59
60        protected override void LoadContent()
61        {
62            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
63            kenttaNro = 0;
64
65            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
66
67            // Luodaan pistelaskuri
68            //pisteLaskuri = new Meter<int>(0, 0, 1000000);
69
70            /* luodaan pistelaskunäyttö
71            pisteNaytto = new ValueDisplay(this);
72            pisteNaytto.Text = "Pisteitä: ";
73            pisteNaytto.X = Screen.RightSafe - 250;
74            pisteNaytto.Y = Screen.TopSafe - 50;
75            pisteNaytto.BindTo(pisteLaskuri);
76            Add(pisteNaytto);    // lisätään peliin*/
77
78            // Asetetaan painovoima
79            Gravity = new Vector2D(0, -1000);
80
81            // Zoomataan lähemmäksi
82            Camera.ZoomFactor = 1.7;
83           
84            aloitaUusiPeli();
85
86        }
87
88        void aloitaUusiPeli()
89        {
90            MessageDisplay.Clear();
91
92            kenttaNro = 0;
93
94            // ladataan kenttä
95            Level = seuraavaKentta();
96            Camera.StayInLevel = true;
97
98            // Laitetaan peliohje näyttöön
99            MessageDisplay.Add("Nappaa liekki ja sytytä Suuri Kynttilä ennen vastustajaasi!");
100            MessageDisplay.TextColor = Color.White;
101
102            pelaajalla1onliekki = false;
103            pelaajalla2onliekki = false;
104
105            //MessageDisplay.Add("Mutta varo haamuja...");
106
107        }
108        #endregion
109
110
111        #region KentanLataus
112        Level seuraavaKentta()
113        {
114            //pisteLaskuri.Reset();
115            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
116            MessageDisplay.Add("Kenttä " + kenttaNro);
117            Level seuraava = luoKentta();
118            lisaaNappaimet();
119
120            //Camera.Follow(pelaaja1);
121            Camera.Position = new Vector2D(0, -500);
122
123            return seuraava;
124        }
125
126        Level luoKentta()
127        {
128            Level kentta = new Level(this, 635, 1500);
129            kentta.CreateBorder();
130           
131            kentta.Borders.Visible = false;
132            kentta.Background.CreateGradient(Color.MediumSlateBlue, Color.Black);
133
134            Platform alusta = new Platform(kentta.Width, 50, Color.Sienna);
135            alusta.X = 0;
136            alusta.Y = kentta.Bottom - alusta.Height / 2;
137            kentta.Objects.Add(alusta);
138
139            lisaaPieniTaso(kentta, -320, -800, 5, 1000);
140            lisaaPieniTaso(kentta, 320, -800, 5, 1000);
141
142            lisaaPieniTaso(kentta, 0, -700, 60, 20);
143            lisaaPieniTaso(kentta, 200, -600, 100, 20);
144            lisaaPieniTaso(kentta, -200, -600, 100, 20);
145
146            lisaaPieniTaso(kentta, 10, -500, 80, 20);
147            lisaaPieniTaso(kentta, 225, -450, 20, 20);
148            lisaaPieniTaso(kentta, 250, -450, 20, 20);
149            lisaaPieniTaso(kentta, 150, -380, 50, 20);
150            lisaaPieniTaso(kentta, -180, -400, 70, 20);
151            lisaaPieniTaso(kentta, 50, -300, 100, 20);
152
153            lisaaPieniTaso(kentta, 200, -200, 100, 20);
154            lisaaPieniTaso(kentta, -100, -200, 100, 20);
155
156            lisaaPieniTaso(kentta, 50, -100, 100, 20);
157
158            lisaaPieniTaso(kentta, -250, 0, 80, 20);
159            lisaaPieniTaso(kentta, 200, 0, 80, 20);
160
161            lisaaPieniTaso(kentta, 0, 90, 80, 20);
162            lisaaPieniTaso(kentta, -140, 150, 80, 20);
163            lisaaPieniTaso(kentta, 40, 270, 80, 20);
164
165            lisaaPieniTaso(kentta, 240, 380, 100, 20);
166            lisaaPieniTaso(kentta, -140, 380, 100, 20);
167
168            lisaaPieniTaso(kentta, 55, 500, 150, 20);
169
170            lisaaMaali(kentta);
171            lisaaPelaajat(kentta);
172            lisaaTahdet(kentta);
173
174            //int vihollistenMaara = kenttaNro;
175            //lisaaViholliset(kentta, vihollistenMaara);
176
177            return kentta;
178        }
179
180        void lisaaPieniTaso(Level kentta, double x, double y, double w, double h)
181        {
182            Platform taso = new Platform(w, h, Color.Sienna);
183            taso.X = x;
184            taso.Y = y;
185            kentta.Objects.Add(taso);
186        }
187
188        void lisaaPelaajat(Level kentta)
189        {
190            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
191            pelaaja1.Texture = Content.Load<Texture2D>("pelaaja1_2");
192            pelaaja1.X = -295;
193            pelaaja1.Y = kentta.Bottom + 70;
194
195            //AddCollisionHandler(pelaaja1, osuiMaaliin);
196           
197            kentta.Objects.Add(pelaaja1);
198
199
200
201            pelaaja2 = new PlatformCharacter(4, Shapes.CreateCircle(20));
202            pelaaja2.Texture = Content.Load<Texture2D>("pelaaja2_2");
203            pelaaja2.X = 295;
204            pelaaja2.Y = kentta.Bottom + 70;
205
206            AddCollisionHandler(pelaaja2, vaihdaliekkia);
207
208            kentta.Objects.Add(pelaaja2);
209
210        }
211
212        void lisaaTahdet(Level kentta)
213        {
214            PhysicsObject tahti = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(40));
215
216            tahti.X = 0;
217            tahti.Y = -660.0;
218            tahti.Restitution = 0.0;
219            tahti.Color = Color.Orange;
220            tahti.Texture = Content.Load<Texture2D>("liekki");
221            AddCollisionHandler(tahti, keraa);
222            kentta.Objects.Add(tahti);
223
224        }
225
226        void lisaaMaali(Level kentta)
227        {
228            maali = PhysicsObject.CreateStaticObject(Shapes.CreateRectangle(50, 100));
229            maali.Tag = "maali";
230            maali.IgnoresCollisionResponse = true;
231            maali.X = 55;
232            maali.Y = 550;
233            maali.Texture = Content.Load<Texture2D>("kynttila");
234            kentta.Objects.Add(maali);
235            AddCollisionHandler(maali, osuttiinMaaliin);
236        }
237
238        #endregion
239
240
241        #region Nappaimet
242        // Lisää peliin kaikki näppäimet
243        void lisaaNappaimet()
244        {
245            ClearControls();
246            //Yleiset näppäimet
247            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
248
249            // Pelaajan näppäimet
250            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
251            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
252            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
253
254            Controls.Listen(Keys.A, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector2D(-liikeVoima, 0));
255            Controls.Listen(Keys.D, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja2, new Vector2D(liikeVoima, 0));
256            Controls.Listen(Keys.W, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja2, hyppyVoima);
257
258            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
259        }
260
261        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
262        {
263            //Yleiset näppäimet
264            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
265            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
266            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
267            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
268        }
269
270        // Näppäimiin liitetyt toiminnot alkavat tästä -->
271        bool liikuta(ControlEvent e)
272        {
273            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
274            Vector2D voima = e.Parameter1.ToVector2D();
275            hahmo.Walk(e.Time, voima);
276            return false;
277        }
278
279        bool hyppaa(ControlEvent e)
280        {
281            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
282            double voima = e.Parameter1.ToDouble();
283
284            if (hahmo.Jump(voima))
285            {
286                this.PlaySound("hyppays");
287            }
288            return false;
289        }
290
291        bool uusiPeli(ControlEvent e)
292        {
293            aloitaUusiPeli();
294            return true;
295        }
296        #endregion
297
298
299        #region Tapahtumat
300        // Kun osutaan maaliin
301        void osuttiinMaaliin(Collision collision)
302        {
303            /*if (collision.Other.Tag == "maali" && (pelaajalla1onliekki || pelaajalla2onliekki))
304            {
305                this.PlaySound("maali");
306                //int edellisenKentanPisteet = pisteLaskuri.Value;
307                //Level = seuraavaKentta();
308                //MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
309
310            }*/
311
312            // Onko se, joka tähän törmää tyypiltään PlatformCharacter && onko tällä liekki
313            if (collision.Other.Equals(pelaaja1))
314            {
315                if (pelaajalla1onliekki)
316                {
317                    MessageDisplay.Add("Pelaaja 1 saavutti maalin ja sytytti kynttilän!");
318                    MessageDisplay.Add("Paina enteriä aloittaaksesi uuden pelin.");
319                    MessageDisplay.TextColor = Color.White;
320                    pelaajalla1onliekki = false;
321
322                    maali.Destroy();
323
324                    maali = PhysicsObject.CreateStaticObject(Shapes.CreateRectangle(53, 180));
325                    maali.Tag = "maali";
326                    maali.IgnoresCollisionResponse = true;
327                    maali.X = 55;
328                    maali.Y = 575;
329                    maali.Texture = Content.Load<Texture2D>("kynttila2");
330                    Level.Objects.Add(maali);
331                    return;
332                }
333                return;
334            }
335
336            if (collision.Other.Equals(pelaaja2))
337            {
338                if (pelaajalla2onliekki)
339                {
340                    MessageDisplay.Add("Pelaaja 2 saavutti maalin ja sytytti kynttilän!");
341                    MessageDisplay.Add("Paina enteriä aloittaaksesi uuden pelin.");
342                    MessageDisplay.TextColor = Color.White;
343                    pelaajalla2onliekki = false;
344
345                    maali.Destroy();
346
347                    maali = PhysicsObject.CreateStaticObject(Shapes.CreateRectangle(53, 180));
348                    maali.Tag = "maali";
349                    maali.IgnoresCollisionResponse = true;
350                    maali.X = 55;
351                    maali.Y = 575;
352                    maali.Texture = Content.Load<Texture2D>("kynttila2");
353                    Level.Objects.Add(maali);
354
355                    return;
356                }
357                return;
358            }
359        }
360
361        // Kerää tähden ja antaa pisteen
362        void keraa(Collision collision)
363        {
364            if (collision.Other.Equals(pelaaja1))
365            {
366                PhysicsObject tahti = collision.Obj;
367                tahti.Destroy();
368                pelaajalla1onliekki = true;
369                this.PlaySound("kerays", -0.5, 0.5);
370                MessageDisplay.Add("Pelaaja 1 nappasi liekin!");
371                return;
372            }
373
374            if (collision.Other.Equals(pelaaja2))
375            {
376                PhysicsObject tahti = collision.Obj;
377                tahti.Destroy();
378                pelaajalla2onliekki = true;
379                this.PlaySound("kerays", -0.5, 0.5);
380                MessageDisplay.Add("Pelaaja 2 nappasi liekin!");
381                return;
382            }
383        }
384
385        void vaihdaliekkia(Collision collision)
386        {
387            if (collision.Other is PlatformCharacter)
388            {
389                if (collision.Other == pelaaja1 && (pelaajalla1onliekki || pelaajalla2onliekki))
390                {
391                    //palauta liekki alas
392
393                    pelaajalla1onliekki = false;
394                    pelaajalla2onliekki = false;
395
396                    lisaaTahdet(Level);
397
398                    MessageDisplay.Add("Liekki palautui takaisin alas!");
399                    MessageDisplay.TextColor = Color.White;
400                }
401            }
402        }
403
404        #endregion
405    }
406}
Note: See TracBrowser for help on using the repository browser.