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

Revision 188, 16.5 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 = 2200;
22        const double hyppyVoima = 2300;
23
24        Meter<int> pisteLaskuri;
25        ValueDisplay pisteNaytto;
26
27        PlatformCharacter pelaaja1;
28        PhysicsObject maali;
29        Sword miekka;
30
31        int elamalaskuri;
32        int kenttaNro; // monesko kenttä on menossa
33
34        #endregion
35
36
37        #region Alustukset
38        protected override void LoadContent()
39        {
40            elamalaskuri = 5;
41           
42            // Asetetaan kentän numero nollaksi, jota kasvatetaan kentän latauksessa (aina siis vähintään 1)
43            kenttaNro = 0;
44
45            DrawPerimeter = false; // ei haluta piirtää kentän reunoja
46
47            // Luodaan pistelaskuri
48            pisteLaskuri = new Meter<int>(0, 0, 1000000);
49
50            // luodaan pistelaskunäyttö
51            pisteNaytto = new ValueDisplay(this);
52            pisteNaytto.Text = "Pisteitä: ";
53            pisteNaytto.X = Screen.RightSafe - 250;
54            pisteNaytto.Y = Screen.TopSafe - 50;
55            pisteNaytto.BindTo(pisteLaskuri);
56            Add(pisteNaytto);    // lisätään peliin
57
58            // Asetetaan painovoima
59            Gravity = new Vector2D(0, -1000);
60
61            // Zoomataan lähemmäksi
62            Camera.ZoomFactor = 1.5;
63
64            aloitaUusiPeli();
65
66        }
67
68        void aloitaUusiPeli()
69        {
70            MessageDisplay.Clear();
71            MessageDisplay.Add("Elämiä jäljellä: " + elamalaskuri.ToString());
72            kenttaNro = 0;
73
74            // ladataan kenttä
75            Level = seuraavaKentta();
76
77            // Laitetaan peliohje näyttöön
78            MessageDisplay.Add("Etsi iso tähti!");
79            MessageDisplay.Add("Mutta varo vihollisia...");
80
81            Song musiikki = Content.Load<Song>("taustamusiikki");
82            MediaPlayer.Play( musiikki );
83        }
84        #endregion
85
86
87        #region KentanLataus
88        Level seuraavaKentta()
89        {
90            pisteLaskuri.Reset();
91            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
92            MessageDisplay.Add("Kenttä " + kenttaNro);
93            Level seuraava = luoKentta();
94            lisaaNappaimet();
95            Camera.Follow(pelaaja1);
96            return seuraava;
97        }
98
99        Level luoKentta()
100        {
101            Level kentta = new Level(this, 6000, 350);
102            kentta.CreateBorder();
103            kentta.Borders.Visible = true;
104            kentta.Background.CreateGradient(Color.White, Color.SkyBlue);
105
106            Platform alusta = new Platform(kentta.Width, 100, Color.Brown);
107            alusta.X = 0;
108            alusta.Y = kentta.Bottom - alusta.Height / 2;
109            kentta.Objects.Add(alusta);
110
111            lisaaPieniTaso(kentta, -2800, 20);
112            lisaaPieniTaso(kentta, -2500, -50);
113            lisaaPieniTaso(kentta, -2420, -50);
114            lisaaPieniTaso(kentta, -2200, 0);
115            lisaaPieniTaso(kentta, -2000, -40);
116            lisaaPieniTaso(kentta, -1800, -70);
117            lisaaPieniTaso(kentta, -1200, 45);
118            lisaaPieniTaso(kentta, -1100, 45);
119            lisaaPieniTaso(kentta, -900, 0);
120
121            lisaaPieniTaso(kentta, -700, -40);
122            lisaaPieniTaso(kentta, -610, -40);
123            lisaaPieniTaso(kentta, -800, -145);
124            lisaaPieniTaso(kentta, -710, -145);
125            lisaaPieniTaso(kentta, -620, -145);
126            lisaaPieniTaso(kentta, -530, -145);
127            lisaaPieniTaso(kentta, -300, -30);
128            lisaaPieniTaso(kentta, -210, -30);
129            lisaaPieniTaso(kentta, -120, -30);
130            lisaaPieniTaso(kentta, 100, 20);
131            lisaaPieniTaso(kentta, 190, 20);
132            lisaaPieniTaso(kentta, 280, 20);
133
134            //LisaaTaso(kentta, -2800, 20, -2700, 10);
135
136            //LisaaTaso(kentta, -2500, 50, -2400, 25);
137
138            lisaaMaali(kentta);
139            lisaaPelaajat(kentta);           
140
141            //lisaaTahdet(kentta); //tämä rivi lisää paljon tähtiä ympäri kenttää
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            int leveys=100;
152            int korkeus=30;
153            Platform taso = new Platform(leveys, korkeus, Color.Green);
154            taso.X = x;
155            taso.Y = y;
156            kentta.Objects.Add(taso);
157            lisaaVihollinen(kentta, x, y, leveys);
158            lisaaTahtiaTasolle(kentta, x, y, leveys);
159        }
160
161        void LisaaTaso(Level kentta, double vasenx, double vaseny, double oikeax, double oikeay)
162        {
163            Platform taso = new Platform(oikeax - vasenx, vaseny - oikeay, Color.Green);
164            taso.X = vasenx;
165            taso.Y = vaseny;
166            kentta.Objects.Add(taso);           
167        }
168
169        void lisaaPelaajat(Level kentta)
170        {
171            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(30));
172           
173            pelaaja1.X = kentta.Left + 50;
174            pelaaja1.Y = kentta.Bottom + 29;
175            Texture2D[] tekstuurit =
176            {
177                Content.Load<Texture2D>("Bokku left"),
178                Content.Load<Texture2D>("Bokku walks left1"),
179                Content.Load<Texture2D>("Bokku left"),
180                Content.Load<Texture2D>("Bokku walks left2")
181            };
182            AnimatedTexture kavelyvasemmalle = new AnimatedTexture(tekstuurit);
183
184
185            Texture2D kavelyoikealle = Content.Load<Texture2D>("Bokku right");
186            Texture2D paikkavasemmalle = Content.Load<Texture2D>("Bokku left");
187            Texture2D paikkaoikealle = Content.Load<Texture2D>("Bokku right");
188
189            pelaaja1.LeftWalkingTexture = kavelyvasemmalle;
190            pelaaja1.RightWalkingTexture = Textures.Mirror (kavelyvasemmalle);
191            pelaaja1.LeftIdleTexture = new AnimatedTexture(paikkavasemmalle);
192            pelaaja1.RightIdleTexture = new AnimatedTexture(paikkaoikealle);
193            pelaaja1.AnimationPerPixel = 0.001;
194
195            kentta.Objects.Add(pelaaja1);
196
197            miekka = new Sword();
198            miekka.Size = new Vector2D(100, 20);
199            kentta.Objects.Add(miekka);
200
201            miekka.Position = pelaaja1.Position;
202            miekka.Anchor = pelaaja1.Position;
203            miekka.Mass = 0.1;
204            miekka.SetOwner(pelaaja1, kentta);
205            miekka.Equip();
206           
207
208            AddCollisionHandler(pelaaja1, osuiMaaliin);           
209        }
210
211        void lisaaTahtiaTasolle(Level kentta, double x, double y, int leveys)
212        {
213            for (int i = 0; i < 3; i++)
214            {
215                PhysicsObject tahti = new PhysicsObject(0.5, Shapes.CreateCircle(12));
216                tahti.X = RandomGen.NextDouble(x - (leveys / 2).ToDouble(), x + (leveys / 2).ToDouble());
217
218                tahti.IgnoresGravity = true;
219                tahti.IgnoresCollisionResponse = true;
220
221                tahti.Y = y + 20;
222                tahti.Restitution = 1.0;
223                tahti.Texture = Content.Load<Texture2D>("Star");
224                AddCollisionHandler(tahti, keraa);
225                kentta.Objects.Add(tahti);
226            }           
227        }
228
229        void lisaaTahdet(Level kentta)
230        {
231            for (int i = 0; i < 50; i++)
232            {
233                PhysicsObject tahti = new PhysicsObject(0.5, Shapes.CreateCircle(12));
234                tahti.X = RandomGen.NextDouble(kentta.Left, kentta.Right);
235
236                tahti.IgnoresGravity = true;
237                tahti.IgnoresCollisionResponse = true;
238
239                tahti.Y = kentta.Bottom + 20;
240                tahti.Restitution = 1.0;
241                tahti.Texture = Content.Load<Texture2D>("Star");
242                AddCollisionHandler(tahti, keraa);
243                kentta.Objects.Add(tahti);
244            }
245        }
246
247        void lisaaMaali(Level kentta)
248        {
249            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
250            maali.Tag = "maali";
251            maali.IgnoresCollisionResponse = true;
252            maali.X = kentta.Right - 50;
253            maali.Y = -130;
254            maali.Texture = Content.Load<Texture2D>("tahti");
255            kentta.Objects.Add(maali);
256        }
257
258        void lisaaVihollinen(Level kentta, double x, double y, int leveys)
259        {
260            PlatformCharacter vihollinen = new PlatformCharacter(50, Shapes.CreateCircle(30));
261            //vihollinen.Brain = new RandomMoverBrain();
262            vihollinen.X = x+55;
263            vihollinen.Y = y;
264            vihollinen.IgnoresGravity = false;
265            vihollinen.Texture = Content.Load<Texture2D>("Vihollinen3 right");
266            AddCollisionHandler(vihollinen, tuuppaa);
267            kentta.Objects.Add(vihollinen);
268        }
269
270        void lisaaViholliset(Level kentta, int kpl)
271        {           
272            for (int i = 0; i < 5; i++)
273            {
274                PlatformCharacter vihollinen = new PlatformCharacter(50, Shapes.CreateCircle(30));
275                //BattleObject vihollinen = new BattleObject(NameHelper.AutoNumber("vihollinen"), Shapes.CreateCircle(30), 50, 1);
276                vihollinen.Brain = new RandomMoverBrain();
277                vihollinen.X = -2000;
278                vihollinen.Y = -10;
279                vihollinen.Restitution = 1.0;
280                vihollinen.IgnoresGravity = false;
281                vihollinen.RightIdleTexture = new AnimatedTexture (Content.Load<Texture2D>("Vihollinen3 right"));
282                vihollinen.LeftIdleTexture = new AnimatedTexture(Textures.Mirror(Content.Load<Texture2D>("Vihollinen3 right")));
283
284                vihollinen.HitPoints.MaxValue = 1;
285                vihollinen.HitPoints.Value = 1;
286                vihollinen.HitpointsReachedZero += new EventHandler(vihollinen_HitpointsReachedZero);
287
288                AddCollisionHandler(vihollinen, tuuppaa);
289                kentta.Objects.Add(vihollinen);
290            }
291        }
292
293        void vihollinen_HitpointsReachedZero(object sender, EventArgs e)
294        {
295            PlatformCharacter vihollinen = sender as PlatformCharacter;
296            vihollinen.Lifetime.IsExpired = true;
297        }
298        #endregion
299
300
301        #region Nappaimet
302        // Lisää peliin kaikki näppäimet
303        void lisaaNappaimet()
304        {
305            //Yleiset näppäimet
306            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
307
308            // Pelaajan näppäimet
309            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
310            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
311            Controls.Listen(Keys.LeftAlt, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
312            Controls.Listen(Keys.LeftControl, ButtonPosition.Pressed, hyokkaa, "Hyökkää", pelaaja1);
313
314            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
315        }
316
317        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
318        {
319            //Yleiset näppäimet
320            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
321
322            Controls.Listen(pelaajaNro, Buttons.DPadLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
323            Controls.Listen(pelaajaNro, Buttons.DPadRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
324            Controls.Listen(pelaajaNro, Buttons.A, ButtonPosition.Pressed, hyppaa, "Pelaaja hyppää", pelaaja, hyppyVoima);
325            Controls.Listen(pelaajaNro, Buttons.X, ButtonPosition.Pressed, hyokkaa, "Pelaaja hyppää", pelaaja1);
326        }
327
328        // Näppäimiin liitetyt toiminnot alkavat tästä -->
329        bool liikuta(ControlEvent e)
330        {
331            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
332            Vector2D voima = e.Parameter1.ToVector2D();
333            hahmo.Walk(e.Time, voima);
334            return false;
335        }
336
337        bool hyppaa(ControlEvent e)
338        {
339            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
340            double voima = e.Parameter1.ToDouble();
341
342            if (hahmo.Jump(voima))
343            {
344                this.PlaySound("hyppays");
345            }
346            return false;
347        }
348
349        bool uusiPeli(ControlEvent e)
350        {
351            aloitaUusiPeli();
352            return true;
353        }
354        #endregion
355
356
357        #region Tapahtumat
358        // Kun osutaan maaliin
359        void osuiMaaliin(Collision collision)
360        {
361            if (collision.Other.Tag == "maali")
362            {
363                this.PlaySound("maali");
364                int edellisenKentanPisteet = pisteLaskuri.Value;
365                Level = seuraavaKentta();
366                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
367            }
368        }
369
370        // Kerää tähden ja antaa pisteen
371        void keraa(Collision collision)
372        {
373            if (collision.Other.Equals(pelaaja1))
374            {
375                PhysicsObject tahti = collision.Obj;
376                tahti.Lifetime.IsExpired = true;
377
378                this.PlaySound("kerays", -0.5, 0.5);
379                pisteLaskuri.Value += 1;
380            }
381        }
382
383        // Haamu tuuppaa pelaajaa
384        void tuuppaa(Collision collision)
385        {
386            if (collision.Other is PlatformCharacter)
387            {
388                double luku1 = RandomGen.NextIntRange(-1000, -800, 800, 1000);
389                double luku2 = RandomGen.NextIntRange(-1000, -800, 800, 1000);
390               
391
392                if (collision.Other == pelaaja1)
393                {
394                    if (collision.Other.Y > collision.Obj.Y)
395                    {
396                        BattleObject vihollinen = collision.Obj as BattleObject;
397                        vihollinen.Lifetime.IsExpired = true;
398                        this.PlaySound("maali");
399                        return;
400                    }
401                   
402                   
403
404                    // pieni värinä törmäyksestä
405                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
406                    elamalaskuri--;
407                    if (elamalaskuri < 1)
408                    {
409                        peliPaattyy();
410                    }                     
411                    else
412                    {
413                        MessageDisplay.Add("Elämiä jäljellä: " + elamalaskuri.ToString());
414                    } 
415                }
416                this.PlaySound("tuuppaus");
417                collision.Other.Hit(new Vector2D(luku1, luku2));
418                return;
419            }
420            if (collision.Other is MeleeWeapon)
421            {
422                MeleeWeapon ase = collision.Other as MeleeWeapon;
423
424                if (ase.Attacking)
425                {
426                    BattleObject vihollinen = collision.Obj as BattleObject;
427                    vihollinen.Lifetime.IsExpired = true;
428                    this.PlaySound("maali");
429                }
430            }
431        }
432
433        bool hyokkaa(ControlEvent e)
434        {           
435            miekka.Use();
436            //MessageDisplay.Add("Miekkaa käytetty");
437            if (miekka.CheckOverlap)
438            {
439                //MessageDisplay.Add("Miekka osuu johonkin");
440            }
441            return false;
442           
443        }
444
445        void peliPaattyy()
446        {
447            //this.Level.Clear();
448            this.Level = new Level(this);
449            PhysicsObject loppukuva = new PhysicsObject(0.5, Shapes.CreateCircle(40));
450            loppukuva.Texture = Content.Load<Texture2D>("Bokku dies");
451            this.Level.Objects.Add(loppukuva);
452            loppukuva.IgnoresGravity=true;
453            loppukuva.X = 0;
454            loppukuva.Y = 0;
455        }
456
457        #endregion
458    }
459}
Note: See TracBrowser for help on using the repository browser.