source: joonas_v/PakoKoulusta/Peli.cs @ 439

Revision 439, 11.7 KB checked in by jovivavi, 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 PakoKoulusta
15{
16    // Yksinkertainen tasohyppely.
17    class Tasohyppely : PhysicsGame
18    {
19        #region Muuttujat
20
21        const double liikeVoima = 4000;
22        const double hyppyVoima = 1650;
23
24        //Meter<int> pisteLaskuri;
25        //ValueDisplay pisteNaytto;
26        Timer aikaLaskuri;
27        ValueDisplay aikaNaytto;
28
29        PlatformCharacter pelaaja1;
30
31
32        int kenttaNro; // monesko kenttä on menossa
33
34        #endregion
35
36
37        #region Alustukset
38        protected override void LoadContent()
39        {
40            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
41            kenttaNro = 0;
42
43            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
44
45            // Luodaan pistelaskuri
46            //pisteLaskuri = new Meter<int>(0, 0, 1000000);
47
48            // luodaan pistelaskunäyttö
49            //pisteNaytto = new ValueDisplay(this);
50            //pisteNaytto.Text = "Pisteitä: ";
51            //pisteNaytto.X = Screen.RightSafe - 250;
52            //pisteNaytto.Y = Screen.TopSafe - 50;
53            //pisteNaytto.BindTo(pisteLaskuri);
54            //Add(pisteNaytto);    // lisätään peliin
55
56            aikaLaskuri = new Timer();
57            aikaLaskuri.Interval = 60;
58            aikaLaskuri.Trigger += new Timer.TriggerHandler(aikaLoppui);
59            AddTimer(aikaLaskuri);
60            aikaLaskuri.Start();
61
62            aikaNaytto = new ValueDisplay(this);
63            aikaNaytto.Text = "Aika:";
64            aikaNaytto.TextColor = Color.Black;
65            aikaNaytto.FormatDouble(0, true);
66            aikaNaytto.X = Screen.RightSafe - 250;
67            aikaNaytto.Y = Screen.TopSafe - 50;
68            aikaNaytto.BindTo(aikaLaskuri.SecondCounter);
69            Add(aikaNaytto);
70
71
72
73            // Asetetaan painovoima
74            Gravity = new Vector2D(0, -870);
75
76            // Zoomataan lähemmäksi
77            Camera.ZoomFactor = 1.6;
78
79            aloitaUusiPeli();
80
81        }
82
83        void aloitaUusiPeli()
84        {
85            MessageDisplay.Clear();
86
87            kenttaNro = 0;
88
89            // ladataan kenttä
90            Level = seuraavaKentta();
91
92            // Laitetaan peliohje näyttöön
93            MessageDisplay.Add("Karkasit koulusta!");
94            MessageDisplay.Add("Älä törmää tai jäät kiinni...");
95            MessageDisplay.Add("Jos et löydä piilopaikkaan 60 sekunnissa, jäät kiinni.");
96        }
97        #endregion
98
99
100        #region KentanLataus
101        Level seuraavaKentta()
102        {
103            aikaLaskuri.Reset();
104            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
105            MessageDisplay.Add("Pako " + kenttaNro);
106            Level seuraava = luoKentta();
107            lisaaNappaimet();
108            Camera.Follow(pelaaja1);
109            return seuraava;
110        }
111
112        Level luoKentta()
113        {
114            Level kentta = new Level(this, 9000, 1000);
115            kentta.CreateBorder();
116            kentta.Borders.Visible = false;
117            kentta.Background.CreateGradient(Color.White, Color.SkyBlue);
118            kentta.Background.Image = Content.Load<Texture2D>("tausta");
119            Platform alusta = new Platform(kentta.Width, 300, Color.Gray);
120            alusta.X = 0;
121            alusta.Y = kentta.Bottom - alusta.Height / 2;
122            kentta.Objects.Add(alusta);
123
124            lisaaMaali(kentta);
125            lisaaPelaajat(kentta);
126            lisaaPukki(kentta, -476);
127            lisaaAuto(kentta, -460);
128            lisaaKello(kentta);
129            lisaaRoskapontto(kentta);
130
131            int vihollistenMaara = kenttaNro;
132
133            return kentta;
134        }
135
136       
137
138        void lisaaPelaajat(Level kentta)
139        {
140            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(28));
141            pelaaja1.Texture = Content.Load<Texture2D>("skeittari");
142            pelaaja1.X = kentta.Left+405;
143            pelaaja1.Y = kentta.Bottom + 120;
144            /*Texture2D[] tekstuurit =
145            {
146                Content.Load<Texture2D>("skeittari")
147            };
148            AnimatedTexture kavelyTekstuuri = new AnimatedTexture(tekstuurit);*/
149            pelaaja1.RightWalkingTexture = new AnimatedTexture(Content.Load<Texture2D>("skeittari"));
150            pelaaja1.LeftWalkingTexture = Textures.Mirror(new AnimatedTexture(Content.Load<Texture2D>("skeittari")));
151
152            AddCollisionHandler(pelaaja1, osuiMaaliin);
153
154            kentta.Objects.Add(pelaaja1);
155        }
156
157       
158        void lisaaPukki(Level kentta, double y)
159        {
160            for (int i = 0; i < 5+(kenttaNro*3); i++)
161            {               
162                   
163                Texture2D tekstuuri = Content.Load<Texture2D>("pukki1");
164                PhysicsObject pukki = PhysicsObject.CreateStaticObject(Shapes.CreateFromTexture(tekstuuri, new Vector2D(50, 50), 100));
165                pukki.Texture = tekstuuri;
166                pukki.X = RandomGen.NextDouble(-4000.0, 4000.0);
167                pukki.Y = y;
168                kentta.Objects.Add(pukki);
169                AddCollisionHandler(pukki, osuiPukkiin);
170           
171            }
172        }
173        void lisaaAuto(Level kentta, double y)
174        {
175            for (int i = 0; i < 2+(kenttaNro*2); i++)
176            {
177                PhysicsObject auto = PhysicsObject.CreateStaticObject(Shapes.CreateRectangle(100, 80));
178                auto.X = RandomGen.NextDouble(-4000, 4000);
179                auto.Y=y;
180                auto.Texture = Content.Load<Texture2D>("auto");
181                kentta.Objects.Add(auto);
182                AddCollisionHandler(auto, osuiAutoon);               
183            }
184        }
185
186        void lisaaMaali(Level kentta)
187        {
188            Texture2D tekstuuri = Content.Load<Texture2D>("maali1");
189            PhysicsObject maali = PhysicsObject.CreateStaticObject(Shapes.CreateFromTexture(tekstuuri , new Vector2D(200, 200), 100));
190            maali.Tag = "maali";
191            maali.Texture = tekstuuri;
192            maali.IgnoresCollisionResponse = true;
193            maali.X = 4400;
194            maali.Y = -400;
195            //maali.Texture = Content.Load<Texture2D>("maali1");
196            kentta.Objects.Add(maali);
197        }
198        void lisaaKello(Level kentta)
199        {
200            for (int i = 0; i < 6-(kenttaNro); i++)
201            {
202                Texture2D tekstuuri = Content.Load<Texture2D>("kello");
203                PhysicsObject kello = new PhysicsObject(1, Shapes.CreateFromTexture(tekstuuri, new Vector2D(20, 20), 100));
204                kello.X = RandomGen.NextDouble(-4300, 4300);
205                kello.Y = -350;
206                kello.Texture = tekstuuri;
207                AddCollisionHandler(kello, keraaKello);
208                kentta.Objects.Add(kello);
209            }
210
211        }
212        void lisaaRoskapontto(Level kentta)
213        {
214            for (int i = 0; i < 5 + (kenttaNro*3); i++)
215            {
216                Texture2D tekstuuri = Content.Load<Texture2D>("roskapontto");
217                PhysicsObject roskapontto = PhysicsObject.CreateStaticObject(Shapes.CreateFromTexture(tekstuuri, new Vector2D(50, 50), 100));
218                roskapontto.X = RandomGen.NextDouble(-4000, 4000);
219                roskapontto.Y = -478;
220                roskapontto.Texture = tekstuuri;
221                AddCollisionHandler(roskapontto, osuiPonttoon);
222                kentta.Objects.Add(roskapontto);
223            }
224        }
225
226       
227        #endregion
228
229
230        #region Nappaimet
231        // Lisää peliin kaikki näppäimet
232        void lisaaNappaimet()
233        {
234            ClearControls();
235            //Yleiset näppäimet
236            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
237
238            // Pelaajan näppäimet
239            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
240            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
241            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
242
243            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
244        }
245
246        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
247        {
248            //Yleiset näppäimet
249            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
250
251            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
252            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
253            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
254        }
255
256        // Näppäimiin liitetyt toiminnot alkavat tästä -->
257        bool liikuta(ControlEvent e)
258        {
259            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
260            Vector2D voima = e.Parameter1.ToVector2D();
261            hahmo.Walk(e.Time, voima);
262            return false;
263        }
264
265        bool hyppaa(ControlEvent e)
266        {
267            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
268            double voima = e.Parameter1.ToDouble();
269
270            if (hahmo.Jump(voima))
271            {
272                this.PlaySound("hyppays");
273            }
274            return false;
275        }
276
277        bool uusiPeli(ControlEvent e)
278        {
279            aloitaUusiPeli();
280            return true;
281        }
282        #endregion
283
284
285        #region Tapahtumat
286        // Kun osutaan maaliin
287        void osuiMaaliin(Collision collision)
288        {
289            if (collision.Other.Tag == "maali")
290            {
291                this.PlaySound("maali");
292                double edellisenKentanAika = aikaLaskuri.CurrentTime;
293                Level = seuraavaKentta();
294                MessageDisplay.Add("Pääsit salaiseen piilopaikkaan " + ". Aikaa: " + edellisenKentanAika);
295            }
296        }
297        void osuiPukkiin(Collision c)
298        { 
299            if (c.Other == pelaaja1)
300            {
301                peliLoppu();
302            }
303        }
304
305        void peliLoppu()
306        {
307            pelaaja1.X = 50000;
308            pelaaja1.Visible = false;
309            MessageDisplay.Add("Kaaduit!");
310        }
311
312        void osuiAutoon(Collision e)
313        {
314            if (e.Other == pelaaja1)
315            {
316                if (pelaaja1.Bottom+3 > e.Obj.Top-3)
317                {
318                    return;
319                }
320                else
321                {
322                    peliLoppu();
323                }
324            }
325        }
326        void keraaKello(Collision d)
327        {
328            if (d.Other == pelaaja1)
329            {               
330                aikaLaskuri.CurrentTime -= 3;
331
332                //Aikalaskurin value vähenee
333                //Lifetime.IsExpired = true;
334                d.Obj.X = -50000;
335            }
336        }
337        void osuiPonttoon(Collision p)
338        {
339            if(p.Other == pelaaja1)
340            {
341                peliLoppu();
342            }
343        }
344        private void aikaLoppui(Timer sender)
345        {
346            MessageDisplay.Add(" Aika loppui. Jäit kiinni!");
347            pelaaja1.X = -50000;
348        }
349        #endregion
350    }
351}
Note: See TracBrowser for help on using the repository browser.