source: 2009/aki_p/Voimien Bokku/Peli.cs @ 6433

Revision 188, 9.3 KB checked in by akeepylv, 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 Voimien_Bokku
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 iso tähti!");
75            MessageDisplay.Add("Mutta varo haamuja...");
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, 6000, 1000);
95            kentta.CreateBorder();
96            kentta.Borders.Visible = true;
97            kentta.Background.CreateGradient(Color.White, Color.SkyBlue);
98
99            Platform alusta = new Platform(kentta.Width, 300, Color.Brown);
100            alusta.X = 0;
101            alusta.Y = kentta.Bottom - alusta.Height / 2;
102            kentta.Objects.Add(alusta);
103
104            lisaaPieniTaso(kentta, -2950, -400);
105            lisaaPieniTaso(kentta, -100, -350);
106            lisaaPieniTaso(kentta, 0, -350);
107            lisaaPieniTaso(kentta, 100, -350);
108            lisaaPieniTaso(kentta, 400, -350);
109            lisaaPieniTaso(kentta, 100, -220); 
110
111            lisaaPieniTaso(kentta, 500, 0);
112            lisaaPieniTaso(kentta, 400, 100);
113
114            lisaaMaali(kentta);
115            lisaaPelaajat(kentta);
116            lisaaTahdet(kentta);
117
118            int vihollistenMaara = kenttaNro;
119            lisaaViholliset(kentta, vihollistenMaara);
120
121            return kentta;
122        }
123
124        void lisaaPieniTaso(Level kentta, double x, double y)
125        {
126            Platform taso = new Platform(200, 30, Color.Green);
127            taso.X = x;
128            taso.Y = y;
129            kentta.Objects.Add(taso);
130        }
131
132        void lisaaPelaajat(Level kentta)
133        {
134            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(15));
135           
136            pelaaja1.X = 0;
137            pelaaja1.Y = kentta.Bottom + 120;
138
139            AddCollisionHandler(pelaaja1, osuiMaaliin);
140
141            kentta.Objects.Add(pelaaja1);
142        }
143
144        void lisaaTahdet(Level kentta)
145        {
146            for (int i = 0; i < 100; i++)
147            {
148                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
149                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
150                tahti.Y = 400.0;
151                tahti.Restitution = 1.0;
152                tahti.Texture = Content.Load<Texture2D>("tahti");
153                AddCollisionHandler(tahti, keraa);
154                kentta.Objects.Add(tahti);
155
156            }
157        }
158
159        void lisaaMaali(Level kentta)
160        {
161            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
162            maali.Tag = "maali";
163            maali.IgnoresCollisionResponse = true;
164            maali.X = 0;
165            maali.Y = 325;
166            maali.Texture = Content.Load<Texture2D>("tahti");
167            kentta.Objects.Add(maali);
168        }
169
170        void lisaaViholliset(Level kentta, int kpl)
171        {
172            for (int i = 0; i < kpl; i++)
173            {
174                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
175                vihollinen.Brain = new RandomMoverBrain();
176                vihollinen.X = maali.X;
177                vihollinen.Y = maali.Y;
178                vihollinen.IgnoresGravity = false;
179                vihollinen.Texture = Content.Load<Texture2D>("vihollinen");
180                AddCollisionHandler(vihollinen, tuuppaa);
181                kentta.Objects.Add(vihollinen);
182            }
183        }
184        #endregion
185
186
187        #region Nappaimet
188        // Lisää peliin kaikki näppäimet
189        void lisaaNappaimet()
190        {
191            //Yleiset näppäimet
192            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
193
194            // Pelaajan näppäimet
195            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
196            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
197            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
198
199            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
200        }
201
202        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
203        {
204            //Yleiset näppäimet
205            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
206
207            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
208            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
209            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
210        }
211
212        // Näppäimiin liitetyt toiminnot alkavat tästä -->
213        bool liikuta(ControlEvent e)
214        {
215            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
216            Vector2D voima = e.Parameter1.ToVector2D();
217            hahmo.Walk(e.Time, voima);
218            return false;
219        }
220
221        bool hyppaa(ControlEvent e)
222        {
223            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
224            double voima = e.Parameter1.ToDouble();
225
226            if (hahmo.Jump(voima))
227            {
228                this.PlaySound("hyppays");
229            }
230            return false;
231        }
232
233        bool uusiPeli(ControlEvent e)
234        {
235            aloitaUusiPeli();
236            return true;
237        }
238        #endregion
239
240
241        #region Tapahtumat
242        // Kun osutaan maaliin
243        void osuiMaaliin(Collision collision)
244        {
245            if (collision.Other.Tag == "maali")
246            {
247                this.PlaySound("maali");
248                int edellisenKentanPisteet = pisteLaskuri.Value;
249                Level = seuraavaKentta();
250                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
251            }
252        }
253
254        // Kerää tähden ja antaa pisteen
255        void keraa(Collision collision)
256        {
257            if (collision.Other.Equals(pelaaja1))
258            {
259                PhysicsObject tahti = collision.Obj;
260                tahti.Lifetime.IsExpired = true;
261
262                this.PlaySound("kerays", -0.5, 0.5);
263                pisteLaskuri.Value += 1;
264            }
265        }
266
267        // Haamu tuuppaa pelaajaa
268        void tuuppaa(Collision collision)
269        {
270            if (collision.Other is PlatformCharacter)
271            {
272                double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
273                double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
274
275                if (collision.Other == pelaaja1)
276                {
277                    // pieni värinä törmäyksestä
278                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
279                }
280                this.PlaySound("tuuppaus");
281                collision.Other.Hit(new Vector2D(luku1, luku2));
282            }
283        }
284        #endregion
285    }
286}
Note: See TracBrowser for help on using the repository browser.