source: jaana_j/TaivaanMuna/Peli.cs @ 318

Revision 318, 10.5 KB checked in by jaaannja, 10 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 TaivaanMuna
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
60            aloitaUusiPeli();
61
62        }
63
64        void aloitaUusiPeli()
65        {
66            MessageDisplay.Clear();
67
68            kenttaNro = 0;
69
70            // ladataan kenttä
71            Level = seuraavaKentta();
72
73            // Laitetaan peliohje näyttöön
74            MessageDisplay.Add("Etsi koti linna!");
75            MessageDisplay.Add("Mutta varo tähtiä...");
76        }
77        #endregion
78
79
80        #region KentanLataus
81        Level seuraavaKentta()
82        {
83            pisteLaskuri.Reset();
84            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
85            MessageDisplay.Add("Kenttä " + kenttaNro);
86            Level seuraava = luoKentta();
87            lisaaNappaimet();
88            Camera.Follow(pelaaja1);
89            return seuraava;
90        }
91
92        Level luoKentta()
93        {
94            Level kentta = new Level(this, 2000, 1000);
95            kentta.CreateBorder();
96            kentta.Borders.Visible = false;
97            kentta.Background.CreateGradient(Color.White, Color.SkyBlue);
98
99            Platform alusta = new Platform(kentta.Width, 300, Color.White);
100            alusta.X = 0;
101            alusta.Y = kentta.Bottom - alusta.Height / 2;
102            kentta.Objects.Add(alusta);
103
104            /*lisaaPieniTaso(kentta, -200, -350);
105            lisaaPieniTaso(kentta, 0, -200);
106            lisaaPieniTaso(kentta, 400, -150);
107            lisaaPieniTaso(kentta, 500, 0);
108            lisaaPieniTaso(kentta, 400, 100);*/
109
110            for (int i = 0; i < 55; i++)
111            {
112                lisaaPieniTaso(kentta, 
113                               kentta.Left+RandomGen.NextDouble(0,kentta.Width), 
114                               alusta.Y+RandomGen.NextDouble(0,kentta.Height));
115            }
116
117            lisaaMaali(kentta);
118            lisaaPelaajat(kentta);
119           // lisaaTahdet(kentta);
120
121            int vihollistenMaara = kenttaNro;
122            lisaaViholliset(kentta, vihollistenMaara);
123
124            return kentta;
125        }
126
127        void lisaaPieniTaso(Level kentta, double x, double y)
128        {
129            Platform taso = new Platform(100, 30, Color.White);
130            taso.Texture = Content.Load<Texture2D>("Pilvi");
131            taso.X = x;
132            taso.Y = y;
133            kentta.Objects.Add(taso);
134           
135        }
136
137        void lisaaPelaajat(Level kentta)
138        {
139            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
140            pelaaja1.Texture = Content.Load<Texture2D>("Muna");
141            pelaaja1.X = 0;
142            pelaaja1.Y = kentta.Bottom + 120;
143
144            AddCollisionHandler(pelaaja1, osuiMaaliin);
145            AddCollisionHandler(pelaaja1, osuiPilveen);
146
147            kentta.Objects.Add(pelaaja1);
148        }
149       
150        //Keräilee Matosia... :)
151        void lisaatahdet(Level kentta)
152        {
153            for (int i = 0; i < 20; i++)
154            {
155                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(8));
156                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
157                tahti.Y = 400.0;
158                tahti.Restitution = 1.0;
159                tahti.Texture = Content.Load<Texture2D>("Mato");
160                AddCollisionHandler(tahti, keraa);
161                kentta.Objects.Add(tahti);
162
163            }
164        }
165
166        void lisaaMaali(Level kentta)
167        {
168            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(60));
169            maali.Tag = "maali";
170            maali.IgnoresCollisionResponse = true;
171            maali.X = 0;
172            maali.Y = 325;
173            maali.Texture = Content.Load<Texture2D>("maali");
174            kentta.Objects.Add(maali);
175        }
176
177        void lisaaViholliset(Level kentta, int kpl)
178        {
179            for (int i = 0; i < kpl; i++)
180            {
181                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(20));
182                vihollinen.Brain = new RandomMoverBrain();
183                vihollinen.X = maali.X;
184                vihollinen.Y = maali.Y;
185                vihollinen.IgnoresGravity = true;
186                vihollinen.Texture = Content.Load<Texture2D>("tahti");
187                AddCollisionHandler(vihollinen, tuuppaa);
188                kentta.Objects.Add(vihollinen);
189            }
190        }
191        #endregion
192
193
194        #region Nappaimet
195        // Lisää peliin kaikki näppäimet
196        void lisaaNappaimet()
197        {
198            ClearControls();
199            //Yleiset näppäimet
200            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
201
202            // Pelaajan näppäimet
203            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
204            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
205            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
206
207            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
208        }
209
210        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
211        {
212            //Yleiset näppäimet
213            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
214
215            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
216            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
217            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
218        }
219        // Näppäimiin liitetyt toiminnot alkavat tästä -->
220        bool liikuta(ControlEvent e)
221        {
222            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
223            Vector2D voima = e.Parameter1.ToVector2D();
224            hahmo.Walk(e.Time, voima);
225            return false;
226        }
227
228        bool hyppaa(ControlEvent e)
229        {
230            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
231            double voima = e.Parameter1.ToDouble();
232
233            if (hahmo.Jump(voima))
234            {
235                this.PlaySound("hyppays");
236            }
237            return false;
238        }
239
240        bool uusiPeli(ControlEvent e)
241        {
242            aloitaUusiPeli();
243            return true;
244        }
245        #endregion
246
247        #region Tapahtumat
248         //Kun osutaan maaliin
249        void osuiMaaliin(Collision collision)
250        {
251            if (collision.Other.Tag == "maali" && pisteLaskuri.Value>19)
252            {
253                maali.Texture = Content.Load<Texture2D>("maali");
254                this.PlaySound("maali");
255                int edellisenKentanPisteet = pisteLaskuri.Value;
256                Level = seuraavaKentta();
257                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
258            }
259        }
260
261        //Osui Pilveen
262        void osuiPilveen(Collision collision)
263        {
264            if (collision.Other is Platform && collision.Other.Color == Color.White) // Tarkistetaan ettei osuta maahan, koska maan ei tietenkään haluta häviävän
265            { 
266                //Pilvi häviää ja pelaaja ponnahtaa ylöspäin
267                collision.Other.Lifetime.IsExpired = true; //pilvi häviää
268                Vector2D hyppaysvoima = new Vector2D(0, 5000); //luodaan ponnahdusvektori
269                collision.Obj.Hit(hyppaysvoima); //annetaan pelaajalle ponnahdusvoima
270                //Miten tehtäsiin se, että pilvi ilmestyisi takaisin muutaman sekunnin päästä...?
271                pisteLaskuri.Value += 1;
272
273
274            }
275        }
276       
277        void keraa(Collision collision)
278        {
279            if (collision.Other.Equals(pelaaja1))
280            {
281                PhysicsObject tahti = collision.Obj;
282                tahti.Destroy();
283
284                this.PlaySound("kerays", -0.5, 0.5);
285               
286            }
287        }
288
289        // Haamu tuuppaa pelaajaa
290        void tuuppaa(Collision collision)
291        {
292            if (collision.Other is PlatformCharacter)
293            {
294                double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
295                double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
296
297                if (collision.Other == pelaaja1)
298                {
299                    // pieni värinä törmäyksestä
300                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
301                }
302                this.PlaySound("tuuppaus");
303                collision.Other.Hit(new Vector2D(luku1, luku2));
304            }
305        }
306        #endregion
307    }
308}
Note: See TracBrowser for help on using the repository browser.