source: juuso_m/Tasohyppely2/Peli.cs @ 426

Revision 426, 16.3 KB checked in by juosmikk, 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 Tasohyppely2
15{
16    // Juuson peli.
17    class Tasohyppely : PhysicsGame
18    {
19        #region Muuttujat
20
21        const double liikeVoima = 4000;
22        const double hyppyVoima = 4000;
23
24        Meter<int> pisteLaskuri;
25        ValueDisplay pisteNaytto;
26        HighScoreList lista;
27
28        PlatformCharacter pelaaja1;
29        PhysicsObject maali;
30
31        int kenttaNro; // monesko kenttä on menossa
32
33        #endregion
34
35        Weapon moottorisaha;
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            pisteNaytto.TextColor = Color.White;
55            pisteNaytto.ValueColor = Color.White;
56            Add(pisteNaytto);    // lisätään peliin
57            Camera.StayInLevel = true;
58
59            //Highscoret
60            lista = HighScoreList.LoadOrCreate(this, "topten.dat", 10);
61
62            // Asetetaan painovoima
63            Gravity = new Vector2D(0, -1000);
64
65            // Zoomataan lähemmäksi
66            Camera.ZoomFactor = 2.0;
67
68            //Song musiikki = Content.Load<Song>("One winged angel");
69            //MediaPlayer.Play(musiikki);
70
71
72            aloitaUusiPeli();
73
74
75
76        }
77
78        void aloitaUusiPeli()
79        {
80            MessageDisplay.Clear();
81
82            kenttaNro = 0;
83
84            // ladataan kenttä
85            Level = seuraavaKentta();
86
87            // Laitetaan peliohje näyttöön
88            MessageDisplay.Add("!");
89            MessageDisplay.Add("Varo Kuolleiden sarjamurhaajien henkiä... Jotka näyttävät muumien möröltä?!");
90        }
91        #endregion
92
93
94        #region KentanLataus
95        Level seuraavaKentta()
96        {
97            kenttaNro += 1; // lisätään kenttänumeroa yhdellä
98            MessageDisplay.Add("Taso " + kenttaNro);
99            Level seuraava = luoKentta();
100            lisaaNappaimet();
101            Camera.Follow(pelaaja1);
102            return seuraava;
103        }
104
105        Level luoKentta()
106        {
107            Level kentta = new Level(this, 8000, 1000);
108            kentta.CreateBorder();
109            kentta.Borders.Visible = false;
110            kentta.Background.CreateGradient(Color.White, Color.DarkBlue);
111            Lisaapalikat1(kentta);
112
113            Platform alusta = new Platform(kentta.Width, 300, Color.Green);
114            alusta.X = 0;
115            alusta.Y = kentta.Bottom - alusta.Height / 2 + 50;
116            kentta.Objects.Add(alusta);
117            alusta.TextureWrapSize = new Vector2D(5000, 1);
118            alusta.Texture = Content.Load<Texture2D>("lattia");
119            Tausta(kentta);
120            lisaaMaali(kentta);
121            lisaaPelaajat(kentta);
122
123
124            int vihollistenMaara = kenttaNro + 2;
125            lisaaViholliset(kentta, vihollistenMaara);
126
127
128
129            Timer ajastin = new Timer();
130            ajastin.Interval = 10;
131            ajastin.Trigger += new Timer.TriggerHandler(AikaVihollinen);
132            AddTimer(ajastin);
133            ajastin.Start();
134
135            return kentta;
136        }
137
138        void lisaaPieniTaso(Level kentta, double x, double y)
139        {
140            Platform taso = new Platform(100, 30, Color.Green);
141            taso.X = x;
142            taso.Y = y;
143            kentta.Objects.Add(taso);
144        }
145
146        void lisaaPelaajat(Level kentta)
147        {
148            pelaaja1 = new PlatformCharacter(4, Shapes.CreateCircle(20));
149            pelaaja1.Texture = Content.Load<Texture2D>("untitled");
150            pelaaja1.X = 0;
151            pelaaja1.Y = kentta.Bottom + 120;
152            pelaaja1.LinearDamping = 0.98;
153
154
155            AddCollisionHandler(pelaaja1, osuiMaaliin);
156            pelaaja1.HitpointsReachedZero += new EventHandler(TuhooPelaaja);
157
158            kentta.Objects.Add(pelaaja1);
159
160            LuoAse(kentta);
161            AsetaHealth();
162            TeeHealthMittari();
163        }
164
165
166        void lisaaMaali(Level kentta)
167        {
168            maali = PhysicsObject.CreateStaticObject(Shapes.CreateCircle(25));
169            maali.Tag = "maali";
170            maali.IgnoresCollisionResponse = true;
171            maali.X = 1500;
172            maali.Y = -350;
173            maali.Texture = Content.Load<Texture2D>("tahti");
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                LuoVihollinen(kentta, 1500, -400);
182            }
183        }
184        #endregion
185
186
187        #region Nappaimet
188        // Lisää peliin kaikki näppäimet
189        void lisaaNappaimet()
190        {
191            ClearControls();
192            //Yleiset näppäimet
193            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
194
195            // Pelaajan näppäimet
196            Controls.Listen(Keys.Left, ButtonPosition.Down, liikuta, "Liikkuu vasemmalle", pelaaja1, new Vector2D(-liikeVoima, 0));
197            Controls.Listen(Keys.Right, ButtonPosition.Down, liikuta, "Liikkuu oikealle", pelaaja1, new Vector2D(liikeVoima, 0));
198            Controls.Listen(Keys.Up, ButtonPosition.Pressed, hyppaa, "Hyppää", pelaaja1, hyppyVoima);
199            Controls.Listen(Keys.Space, ButtonPosition.Pressed, KaytaAse, "Käyttää asetta", pelaaja1);
200            lisaaGamePadNappaimet(PlayerIndex.One, pelaaja1);
201        }
202
203        void lisaaGamePadNappaimet(PlayerIndex pelaajaNro, PlatformCharacter pelaaja)
204        {
205            //Yleiset näppäimet
206            Controls.Listen(pelaajaNro, Buttons.Start, ButtonPosition.Pressed, uusiPeli, "Aloittaa uuden pelin");
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            Controls.Listen(pelaajaNro, Buttons.B, ButtonPosition.Pressed, KaytaAse, "Pelaaja käyttää asetta", pelaaja);
211            Controls.Listen(pelaajaNro, Buttons.RightTrigger, ButtonPosition.Pressed, KaytaAse, "aseen käyttö", pelaaja);
212            Controls.Listen(pelaajaNro, Buttons.RightTrigger, ButtonPosition.Pressed, hyppaa, "hyppy", pelaaja, hyppyVoima);
213            Controls.Listen(pelaajaNro, Buttons.LeftThumbstickLeft, ButtonPosition.Down, liikuta, "Pelaaja liikkuu vasemmalle", pelaaja, new Vector2D(-liikeVoima, 0));
214            Controls.Listen(pelaajaNro, Buttons.LeftThumbstickRight, ButtonPosition.Down, liikuta, "Pelaaja liikkuu oikealle", pelaaja, new Vector2D(liikeVoima, 0));
215        }
216
217        // Näppäimiin liitetyt toiminnot alkavat tästä -->
218        bool liikuta(ControlEvent e)
219        {
220            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
221            Vector2D voima = e.Parameter1.ToVector2D();
222            hahmo.Walk(e.Time, voima);
223            return false;
224        }
225        bool KaytaAse(ControlEvent e)
226        {
227            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
228            hahmo.Weapon.Use();
229            return false;
230        }
231
232
233        bool hyppaa(ControlEvent e)
234        {
235            PlatformCharacter hahmo = e.Parameter0 as PlatformCharacter;
236            double voima = e.Parameter1.ToDouble();
237
238            if (Math.Abs(hahmo.Velocity.Y) > 0.001) return false;
239
240            if (hahmo.Jump(voima))
241            {
242                this.PlaySound("hyppays");
243            }
244            return false;
245        }
246
247        bool uusiPeli(ControlEvent e)
248        {
249            aloitaUusiPeli();
250            TyhjennaLista();
251            lista.Hide();
252            return true;
253        }
254        #endregion
255
256
257        #region Tapahtumat
258        // Kun osutaan maaliin
259        void osuiMaaliin(Collision collision)
260        {
261            if (collision.Other.Tag == "maali")
262            {
263
264
265                this.PlaySound("maali");
266                int edellisenKentanPisteet = pisteLaskuri.Value;
267                pisteLaskuri.Value += 100;
268
269                MessageDisplay.Add("Pääsit läpi kentän " + kenttaNro + ". Pisteitä: " + edellisenKentanPisteet);
270
271                Level = seuraavaKentta();
272
273                if (kenttaNro >= 10)
274                {
275                    lista.Show(pisteLaskuri.Value);
276                    lista.ScreenList.ItemColor = Color.White;
277                    lista.ScreenList.BackGroundColor = Color.Black;
278                    lista.ScreenList.HighlightColor = Color.Red;
279                    lista.CongratulationText = "Onnistuit pakenemaan kirotusta talosta ja olet turvassa! Ansaitsit pisteillä {1} paikan {0} listalta. Syötä nimesi:";
280
281                }
282
283            }
284        }
285
286        // Kerää tähden ja antaa pisteen
287        void keraa(Collision collision)
288        {
289            if (collision.Other.Equals(pelaaja1))
290            {
291                PhysicsObject tahti = collision.Obj;
292                tahti.Destroy();
293
294                this.PlaySound("kerays", -0.5, 0.5);
295                pisteLaskuri.Value += 1;
296            }
297        }
298
299
300        // Haamu tuuppaa pelaajaa
301        void tuuppaa(Collision collision)
302        {
303            if (collision.Other is PlatformCharacter)
304            {
305                double luku1 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
306                double luku2 = RandomGen.NextIntRange(-10000, -8000, 8000, 10000);
307
308                if (collision.Other == pelaaja1)
309                {
310                    // pieni värinä törmäyksestä
311                    Controls.GameControllers[PlayerIndex.One].Vibrate(0.5, 0.5, 0.0, 0.0, 0.1);
312                }
313                this.PlaySound("tuuppaus");
314                collision.Other.Hit(new Vector2D(luku1, luku2));
315            }
316        }
317        #endregion
318
319        void AikaVihollinen(Timer sender)
320        {
321            int luku1 = RandomGen.NextInt((int)Level.Left, (int)Level.Right);
322            LuoVihollinen(Level, luku1, -400);
323        }
324
325        void LuoVihollinen(Level kentta, double x, double y)
326        {
327            MessageDisplay.Add("Uusi vihollinen on saapunut");
328            MessageDisplay.TextColor = Color.White;
329
330            PlatformCharacter vihollinen = new PlatformCharacter(100, Shapes.CreateCircle(30));
331            kentta.Objects.Add(vihollinen);
332            FollowerBrain brain = new VihollisenAivot();
333            brain.Target = pelaaja1;
334            vihollinen.Brain = brain;
335            brain.MovingSpeed = 50;
336
337            Bullet ammus = new Bullet();
338            ammus.Damage = new Damage(1);
339            Weapon ase = new AssaultRifle(ammus);
340            kentta.Objects.Add(ase);
341
342            ase.SetOwner(vihollinen, kentta);
343            ase.Equip();
344            ase.Size = new Vector2D(55, 20);
345
346            vihollinen.X = maali.X;
347            vihollinen.Y = maali.Y;
348            vihollinen.IgnoresGravity = false;
349            vihollinen.Weapon = ase;
350
351            vihollinen.Texture = Content.Load<Texture2D>("vihollinen2");
352
353            AddCollisionHandler(vihollinen, tuuppaa);
354            vihollinen.HitpointsReachedZero += new EventHandler(OlioPoistetaan);
355
356        }
357
358        void LuoAse(Level kentta)
359        {
360            moottorisaha = new Chainsaw();
361            moottorisaha.Position = pelaaja1.Position;
362
363            kentta.Objects.Add(moottorisaha);
364
365            moottorisaha.SetOwner(pelaaja1, Level);
366            moottorisaha.Equip();
367            pelaaja1.Weapon = moottorisaha;
368
369            moottorisaha.Size = new Vector2D(80, 50);
370        }
371
372        private void AsetaHealth()
373        {
374            pelaaja1.HitPoints = new Meter<int>(100, 0, 100);
375            pelaaja1.HitPoints.Reset();
376        }
377
378        void OlioPoistetaan(object sender, EventArgs e)
379        {
380            PlatformCharacter poistettava = sender as PlatformCharacter;
381
382            if (sender != null)
383            {
384                if (poistettava.Weapon != null)
385                {
386                    poistettava.Weapon.Destroy();
387                    Level.Objects.Remove(poistettava.Weapon);
388                    pisteLaskuri.Value += 10;
389                }
390                poistettava.Destroy();
391                Level.Objects.Remove(poistettava);
392            }
393        }
394
395        // Kerää tähden ja antaa pisteen
396        void ottaa(Collision collision)
397        {
398            if (collision.Other.Equals(pelaaja1))
399            {
400                PhysicsObject tahti = collision.Obj;
401                tahti.Destroy();
402
403                this.PlaySound("kerays", -0.5, 0.5);
404                pisteLaskuri.Value += 1;
405            }
406        }
407
408        void Lisaapalikat1(Level kentta)
409        {
410            //Platform p1 = new Platform(1000, 10000, Color.Black);
411            //p1.X = Level.Left;
412            //p1.Y = -420;
413            //kentta.Objects.Add(p1);
414
415            //Platform p2 = new Platform(50, 10, Color.DarkGreen);
416            //kentta.Objects.Add(p2);
417        }
418
419        void Tausta(Level kentta)
420        {
421            if (kenttaNro <= 5)
422            {
423                kentta.Background.Image = Content.Load<Texture2D>("Dark2");
424            }
425
426
427            if (kenttaNro >= 6)
428            {
429                kentta.Background.Image = Content.Load<Texture2D>("Dark");
430            }
431
432        }
433
434        void TeeHealthMittari()
435        {
436            BarGauge mittari = new BarGauge(this);
437            mittari.X = 0;
438            mittari.Angle = new Angle(270, true);
439            mittari.Y = -440;
440            mittari.BindTo(pelaaja1.HitPoints);
441            Add(mittari);
442        }
443
444        void TuhooPelaaja(object sender, EventArgs e)
445        {
446            if (pelaaja1.IsDestroyed()) return;
447
448            pelaaja1.Destroy();
449            moottorisaha.Destroy();
450            lista.Show(pisteLaskuri.Value);
451            lista.ScreenList.ItemColor = Color.White;
452            lista.ScreenList.BackGroundColor = Color.Black;
453            lista.ScreenList.HighlightColor = Color.Red;
454            lista.CongratulationText = "Voi ei! Sinä kuolit ja haamut lähtevät riivaamaan muita ihmisiä. Sait kuitenkin {1} pisteellä paikan {0} listalta. Syötä nimesi:";
455
456        }
457
458        void TyhjennaLista()
459        {
460            pisteLaskuri.Reset();
461        }
462    }
463
464    public class VihollisenAivot : FollowerBrain
465    {
466        DateTime viimeksiAmmuttu = DateTime.MinValue;
467
468        public override void OnUpdate(GameTime gameTime)
469        {
470            base.OnUpdate(gameTime);
471
472            if (viimeksiAmmuttu + TimeSpan.FromSeconds(0.01) > DateTime.Now) return;
473
474            viimeksiAmmuttu = DateTime.Now;
475
476            Ammu();
477        }
478
479        private void Ammu()
480        {
481            PlatformCharacter vihollinen = (Owner as PlatformCharacter);
482
483            double TargetCloseDistance = 140;
484
485            double distance = Vector2D.Distance(Owner.Position, Target.Position);
486            bool targetClose = Math.Abs(distance) < TargetCloseDistance;
487
488            if (Math.Abs(distance) < TargetCloseDistance)
489            {
490                Weapon ase = vihollinen.Weapon;
491                Projectile ammus = ase.Use();
492                ase.Angle = Angle.Radians((Target.Position - Owner.Position).Angle);
493
494                if (ammus != null)
495                {
496                    vihollinen.Game.Objects.Add(ammus);
497                }
498
499            }
500        }
501
502    }
503}
Note: See TracBrowser for help on using the repository browser.