source: 2009/solja_l/SuuriKynttila/SuuriKynttila/Peli.cs @ 6440

Revision 416, 13.8 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            Camera.ZoomToLevel(Level, this);
98            Camera.Move(new Vector2D(0,-20));
99
100            // Laitetaan peliohje näyttöön
101            MessageDisplay.Add("Nappaa liekki ja sytytä Suuri Kynttilä ennen vastustajaasi!");
102            MessageDisplay.TextColor = Color.White;
103
104            pelaajalla1onliekki = false;
105            pelaajalla2onliekki = false;
106
107            //MessageDisplay.Add("Mutta varo haamuja...");
108
109        }
110        #endregion
111
112
113        #region KentanLataus
114        Level seuraavaKentta()
115        {
116            //pisteLaskuri.Reset();
117            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
118            MessageDisplay.Add("Kenttä " + kenttaNro);
119            Level seuraava = luoKentta();
120            lisaaNappaimet();
121
122            //Camera.Follow(pelaaja1);
123            Camera.Position = new Vector2D(0, -500);
124
125            return seuraava;
126        }
127
128        Level luoKentta()
129        {
130            Level kentta = new Level(this, 635, 1500);
131            kentta.CreateBorder();
132           
133            kentta.Borders.Visible = false;
134            kentta.Background.CreateGradient(Color.MediumSlateBlue, Color.Black);
135
136            Platform alusta = new Platform(kentta.Width, 50, Color.Sienna);
137            alusta.X = 0;
138            alusta.Y = kentta.Bottom - alusta.Height / 2;
139            kentta.Objects.Add(alusta);
140
141            lisaaPieniTaso(kentta, 0, -700, 60, 20);
142            lisaaPieniTaso(kentta, 200, -600, 100, 20);
143            lisaaPieniTaso(kentta, -200, -600, 100, 20);
144
145            lisaaPieniTaso(kentta, 10, -500, 80, 20);
146            lisaaPieniTaso(kentta, 225, -450, 20, 20);
147            lisaaPieniTaso(kentta, 250, -450, 20, 20);
148            lisaaPieniTaso(kentta, 150, -380, 50, 20);
149            lisaaPieniTaso(kentta, -180, -400, 70, 20);
150            lisaaPieniTaso(kentta, 50, -300, 100, 20);
151
152            lisaaPieniTaso(kentta, 200, -200, 100, 20);
153            lisaaPieniTaso(kentta, -100, -200, 100, 20);
154
155            lisaaPieniTaso(kentta, 50, -100, 100, 20);
156
157            lisaaPieniTaso(kentta, -250, 0, 80, 20);
158            lisaaPieniTaso(kentta, 200, 0, 80, 20);
159
160            lisaaPieniTaso(kentta, 0, 90, 80, 20);
161            lisaaPieniTaso(kentta, -140, 150, 80, 20);
162            lisaaPieniTaso(kentta, 40, 270, 80, 20);
163
164            lisaaPieniTaso(kentta, 240, 380, 100, 20);
165            lisaaPieniTaso(kentta, -140, 380, 100, 20);
166
167            lisaaPieniTaso(kentta, 55, 500, 150, 20);
168
169            lisaaMaali(kentta);
170            lisaaPelaajat(kentta);
171            lisaaTahdet(kentta);
172
173            //int vihollistenMaara = kenttaNro;
174            //lisaaViholliset(kentta, vihollistenMaara);
175
176            return kentta;
177        }
178
179        void lisaaPieniTaso(Level kentta, double x, double y, double w, double h)
180        {
181            Platform taso = new Platform(w, h, Color.Sienna);
182            taso.X = x;
183            taso.Y = y;
184            kentta.Objects.Add(taso);
185        }
186
187        void lisaaPelaajat(Level kentta)
188        {
189            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
190            pelaaja1.Texture = Content.Load<Texture2D>("pelaaja2_2");
191            pelaaja1.X = -295;
192            pelaaja1.Y = kentta.Bottom + 70;
193
194            //AddCollisionHandler(pelaaja1, osuiMaaliin);
195           
196            kentta.Objects.Add(pelaaja1);
197
198
199
200            pelaaja2 = new PlatformCharacter(4, Shapes.CreateCircle(20));
201            pelaaja2.Texture = Content.Load<Texture2D>("pelaaja1_2");
202            pelaaja2.X = 295;
203            pelaaja2.Y = kentta.Bottom + 70;
204
205            AddCollisionHandler(pelaaja2, vaihdaliekkia);
206
207            kentta.Objects.Add(pelaaja2);
208
209        }
210
211        void lisaaTahdet(Level kentta)
212        {
213            PhysicsObject tahti = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(40));
214
215            tahti.X = 0;
216            tahti.Y = -660.0;
217            tahti.Restitution = 0.0;
218            tahti.Color = Color.Orange;
219            tahti.Texture = Content.Load<Texture2D>("liekki");
220            AddCollisionHandler(tahti, keraa);
221            kentta.Objects.Add(tahti);
222
223        }
224
225        void lisaaMaali(Level kentta)
226        {
227            maali = PhysicsObject.CreateStaticObject(Shapes.CreateRectangle(50, 100));
228            maali.Tag = "maali";
229            maali.IgnoresCollisionResponse = true;
230            maali.X = 55;
231            maali.Y = 550;
232            maali.Texture = Content.Load<Texture2D>("kynttila");
233            kentta.Objects.Add(maali);
234            AddCollisionHandler(maali, osuttiinMaaliin);
235        }
236
237        #endregion
238
239
240        #region Nappaimet
241        // Lisää peliin kaikki näppäimet
242        void lisaaNappaimet()
243        {
244            ClearControls();
245            //Yleiset näppäimet
246            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
247
248            // Pelaajan näppäimet
249            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
250            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
251            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
252
253            Controls.Listen(Keys.A, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector2D(-liikeVoima, 0));
254            Controls.Listen(Keys.D, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja2, new Vector2D(liikeVoima, 0));
255            Controls.Listen(Keys.W, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja2, hyppyVoima);
256
257            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
258        }
259
260        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
261        {
262            //Yleiset näppäimet
263            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
264            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
265            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
266            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
267        }
268
269        // Näppäimiin liitetyt toiminnot alkavat tästä -->
270        bool liikuta(ControlEvent e)
271        {
272            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
273            Vector2D voima = e.Parameter1.ToVector2D();
274            hahmo.Walk(e.Time, voima);
275            return false;
276        }
277
278        bool hyppaa(ControlEvent e)
279        {
280            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
281            double voima = e.Parameter1.ToDouble();
282
283            if (hahmo.Jump(voima))
284            {
285                this.PlaySound("hyppays");
286            }
287            return false;
288        }
289
290        bool uusiPeli(ControlEvent e)
291        {
292            aloitaUusiPeli();
293            return true;
294        }
295        #endregion
296
297
298        #region Tapahtumat
299        // Kun osutaan maaliin
300        void osuttiinMaaliin(Collision collision)
301        {
302            /*if (collision.Other.Tag == "maali" && (pelaajalla1onliekki || pelaajalla2onliekki))
303            {
304                this.PlaySound("maali");
305                //int edellisenKentanPisteet = pisteLaskuri.Value;
306                //Level = seuraavaKentta();
307                //MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
308
309            }*/
310
311            // Onko se, joka tähän törmää tyypiltään PlatformCharacter && onko tällä liekki
312            if (collision.Other.Equals(pelaaja1))
313            {
314                if (pelaajalla1onliekki)
315                {
316                    MessageDisplay.Add("Punainen pelaaja saavutti maalin ja sytytti kynttilän!");
317                    MessageDisplay.Add("Paina enteriä aloittaaksesi uuden pelin.");
318                    MessageDisplay.TextColor = Color.White;
319                    pelaajalla1onliekki = false;
320
321                    maali.Destroy();
322
323                    maali = PhysicsObject.CreateStaticObject(Shapes.CreateRectangle(53, 180));
324                    maali.Tag = "maali";
325                    maali.IgnoresCollisionResponse = true;
326                    maali.X = 55;
327                    maali.Y = 575;
328                    maali.Texture = Content.Load<Texture2D>("kynttila2");
329                    Level.Objects.Add(maali);
330                    return;
331                }
332                return;
333            }
334
335            if (collision.Other.Equals(pelaaja2))
336            {
337                if (pelaajalla2onliekki)
338                {
339                    MessageDisplay.Add("Sininen pelaaja saavutti maalin ja sytytti kynttilän!");
340                    MessageDisplay.Add("Paina enteriä aloittaaksesi uuden pelin.");
341                    MessageDisplay.TextColor = Color.White;
342                    pelaajalla2onliekki = false;
343
344                    maali.Destroy();
345
346                    maali = PhysicsObject.CreateStaticObject(Shapes.CreateRectangle(53, 180));
347                    maali.Tag = "maali";
348                    maali.IgnoresCollisionResponse = true;
349                    maali.X = 55;
350                    maali.Y = 575;
351                    maali.Texture = Content.Load<Texture2D>("kynttila2");
352                    Level.Objects.Add(maali);
353
354                    return;
355                }
356                return;
357            }
358        }
359
360        // Kerää tähden ja antaa pisteen
361        void keraa(Collision collision)
362        {
363            if (collision.Other.Equals(pelaaja1) && !pelaajalla2onliekki)
364            {
365                PhysicsObject tahti = collision.Obj;
366                tahti.Destroy();
367                pelaajalla1onliekki = true;
368                this.PlaySound("kerays", -0.5, 0.5);
369                MessageDisplay.Add("Punainen pelaaja nappasi liekin!");
370                return;
371            }
372
373            if (collision.Other.Equals(pelaaja2) && !pelaajalla1onliekki)
374            {
375                PhysicsObject tahti = collision.Obj;
376                tahti.Destroy();
377                pelaajalla2onliekki = true;
378                this.PlaySound("kerays", -0.5, 0.5);
379                MessageDisplay.Add("Sininen pelaaja nappasi liekin!");
380                return;
381            }
382        }
383
384        void vaihdaliekkia(Collision collision)
385        {
386            if (collision.Other is PlatformCharacter)
387            {
388                if (collision.Other == pelaaja1 && (pelaajalla1onliekki || pelaajalla2onliekki))
389                {
390                    //palauta liekki alas
391
392                    pelaajalla1onliekki = false;
393                    pelaajalla2onliekki = false;
394
395                    lisaaTahdet(Level);
396
397                    MessageDisplay.Add("Liekki palasi takaisin alas!");
398                    MessageDisplay.TextColor = Color.White;
399                }
400            }
401        }
402
403        #endregion
404    }
405}
Note: See TracBrowser for help on using the repository browser.