source: nuutti_m/Tasohyppely2/Peli.cs @ 303

Revision 303, 11.1 KB checked in by nuvamikk, 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 Tasohyppely2
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        PlatformCharacter pelaaja2;
29        PhysicsObject maali;
30
31        Meter<int> LuoPisteLaskuri(double x, double y)
32        {
33            Meter<int> laskuri = new Meter<int>(0, 0, 10);
34            ValueDisplay naytto = new ValueDisplay(this);
35            naytto.BindTo(laskuri);
36            naytto.X = x;
37            naytto.Y = y;
38            naytto.ValueColor = Color.Black;
39            Add(naytto);
40            return laskuri;
41        }
42
43        Meter<int> pelaajan1Pisteet;
44        Meter<int> pelaajan2Pisteet;
45
46
47        int kenttaNro; // monesko kenttä on menossa
48
49        #endregion
50
51     
52        #region Alustukset
53        protected override void LoadContent()
54        {
55            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
56            kenttaNro = 0;
57
58            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
59
60
61            LisaaLaskurit();
62   
63           
64            // Asetetaan painovoima
65            Gravity = new Vector2D(0, -1000);
66
67            // Zoomataan lähemmäksi
68            Camera.ZoomFactor = 0.500;
69
70            aloitaUusiPeli();
71
72
73        }
74
75        void LisaaLaskurit()
76        {
77            pelaajan1Pisteet = LuoPisteLaskuri(Screen.Left + 100.0, Screen.Top - 100.0);
78            pelaajan2Pisteet = LuoPisteLaskuri(Screen.Right - 100.0, Screen.Top - 100.0);
79        }
80
81        void aloitaUusiPeli()
82        {
83            MessageDisplay.Clear();
84
85            kenttaNro = 0;
86
87            // ladataan kenttä
88            Level = seuraavaKentta();
89
90            // Laitetaan peliohje näyttöön
91            MessageDisplay.Add("Kerää enemmän tähtiä kuin toinen!");
92            MessageDisplay.Add("Mutta varo haamuja...");
93        }
94        #endregion
95
96
97        #region KentanLataus
98        Level seuraavaKentta()
99        {
100           
101            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
102            MessageDisplay.Add("Kenttä " + kenttaNro);
103            Level seuraava = luoKentta();
104            lisaaNappaimet();
105            Camera.Follow(pelaaja1);
106            return seuraava;
107        }
108
109        Level luoKentta()
110        {
111           
112
113            Level kentta = new Level(this, 2000, 1600);
114            kentta.CreateBorder();
115            kentta.Borders.Visible = false;
116            kentta.Background.CreateGradient(Color.White, Color.DarkGreen);
117
118            Platform alusta = new Platform(kentta.Width, 300, Color.DarkGreen);
119            alusta.X = 0;
120            alusta.Y = kentta.Bottom - alusta.Height / 2;
121            kentta.Objects.Add(alusta);
122
123            lisaaPieniTaso(kentta, -200, -250);
124            lisaaPieniTaso(kentta, 200, -350);
125            lisaaPieniTaso(kentta, 400, 150);
126            lisaaPieniTaso(kentta, 400, -150);
127            lisaaPieniTaso(kentta, 500, 0);
128            lisaaPieniTaso(kentta, -500, 0);
129            lisaaPieniTaso(kentta, -400, 100);
130            lisaaPieniTaso(kentta, 0, 100);
131            lisaaPieniTaso(kentta, -100, 400);
132            lisaaPieniTaso(kentta, 0, -250);
133            lisaaPieniTaso(kentta, -300, 250);
134            lisaaPieniTaso(kentta, 0, -500);
135            lisaaPieniTaso(kentta, 250, 500);
136            lisaaPieniTaso(kentta, 50, 100);
137            lisaaPieniTaso(kentta, 100, -650);
138
139            lisaaMaali(kentta);
140            lisaaPelaajat(kentta);
141            lisaaTahdet(kentta);
142
143            int vihollistenMaara = kenttaNro;
144            lisaaViholliset(kentta, vihollistenMaara);
145
146            return kentta;
147        }
148
149        void lisaaPieniTaso(Level kentta, double x, double y)
150        {
151            Platform taso = new Platform(100, 30, Color.DarkGreen);
152            taso.X = x;
153            taso.Y = y;
154            kentta.Objects.Add(taso);
155        }
156
157        void lisaaPelaajat(Level kentta)
158        {
159            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
160            pelaaja1.Texture = Content.Load<Texture2D>("norsu");
161            pelaaja1.X = 0;
162            pelaaja1.Y = kentta.Bottom + 120;
163
164            pelaaja2 = new PlatformCharacter(4, Shapes.CreateCircle(20));
165            pelaaja2.Texture = Content.Load<Texture2D>("norsu");
166            pelaaja2.X = 100;
167            pelaaja2.Y = kentta.Bottom + 120;
168
169     
170            kentta.Objects.Add(pelaaja1);
171            kentta.Objects.Add(pelaaja2);
172        }
173
174        void lisaaTahdet(Level kentta)
175        {
176            for (int i = 0; i < 100; i++)
177            {
178                PhysicsObject tahti = new PhysicsObject(0.005, Shapes.CreateCircle(12));
179                tahti.X = RandomGen.NextDouble(-475.0, 475.0);
180                tahti.Y = 400.0;
181                tahti.Restitution = 0.0;
182                tahti.Texture = Content.Load<Texture2D>("tahti");
183                AddCollisionHandler(tahti, keraa);
184                kentta.Objects.Add(tahti);
185
186            }
187        }
188
189        void lisaaMaali(Level kentta)
190        {
191            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
192            maali.Tag = "maali";
193            maali.IgnoresCollisionResponse = true;
194            maali.X = 0;
195            maali.Y = 325;
196            maali.Texture = Content.Load<Texture2D>("tahti");
197            kentta.Objects.Add(maali);
198        }
199
200        void lisaaViholliset(Level kentta, int kpl)
201        {
202            for (int i = 0; i < kpl; i++)
203            {
204                PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
205                vihollinen.Brain = new RandomMoverBrain();
206                vihollinen.X = maali.X;
207                vihollinen.Y = maali.Y;
208                vihollinen.IgnoresGravity = true;
209                vihollinen.Texture = Content.Load<Texture2D>("vihollinen");
210                AddCollisionHandler(vihollinen, tuuppaa);
211                kentta.Objects.Add(vihollinen);
212            }
213        }
214        #endregion
215
216
217        #region Nappaimet
218        // Lisää peliin kaikki näppäimet
219        void lisaaNappaimet()
220        {
221            ClearControls();
222            //Yleiset näppäimet
223            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
224
225            // Pelaajan näppäimet
226            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
227            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
228            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
229
230            Controls.Listen(Keys.A, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja2, new Vector2D(-liikeVoima, 0));
231            Controls.Listen(Keys.D, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja2, new Vector2D(liikeVoima, 0));
232            Controls.Listen(Keys.W, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja2, hyppyVoima);
233
234
235            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
236            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja2);
237        }
238
239        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
240        {
241            //Yleiset näppäimet
242            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
243
244            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
245            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
246            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
247        }
248
249        // Näppäimiin liitetyt toiminnot alkavat tästä -->
250        bool liikuta(ControlEvent e)
251        {
252            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
253            Vector2D voima = e.Parameter1.ToVector2D();
254            hahmo.Walk(e.Time, voima);
255            return false;
256        }
257
258        bool hyppaa(ControlEvent e)
259        {
260            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
261            double voima = e.Parameter1.ToDouble();
262
263            if (hahmo.Jump(voima))
264            {
265                this.PlaySound("hyppays");
266            }
267            return false;
268        }
269
270        bool uusiPeli(ControlEvent e)
271        {
272            aloitaUusiPeli();
273            return true;
274        }
275        #endregion
276
277
278        #region Tapahtumat
279        // Kun osutaan maaliin
280        void osuiMaaliin(Collision collision)
281        {
282            if (collision.Other.Tag == "maali")
283            {
284                this.PlaySound("maali");
285                int edellisenKentanPisteet = pisteLaskuri.Value;
286                Level = seuraavaKentta();
287                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
288            }
289        }
290
291        // Kerää tähden ja antaa pisteen
292        void keraa(Collision collision)
293        {
294            if (collision.Other.Equals(pelaaja1))
295            {
296                PhysicsObject tahti = collision.Obj;
297                tahti.Destroy();
298
299                this.PlaySound("kerays", -0.5, 0.5);
300               
301            }
302
303            if (collision.Other.Equals(pelaaja2))
304            {
305                PhysicsObject tahti = collision.Obj;
306                tahti.Destroy();
307
308                this.PlaySound("kerays", -0.5, 0.5);
309               
310            }
311        }
312
313
314        // Haamu tuuppaa pelaajaa
315        void tuuppaa(Collision collision)
316        {
317            if (collision.Other is PlatformCharacter)
318            {
319                double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
320                double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
321
322                if (collision.Other == pelaaja1)
323                {
324                    // pieni värinä törmäyksestä
325                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
326                }
327                if (collision.Other == pelaaja2)
328                {
329                    // pieni värinä törmäyksestä
330                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
331                }
332
333                this.PlaySound("tuuppaus");
334                collision.Other.Hit(new Vector2D(luku1, luku2));
335            }
336        }
337        #endregion
338    }
339}
Note: See TracBrowser for help on using the repository browser.