source: 2009/arho_m/Avaruuspeli2/Peli.cs @ 6741

Revision 432, 17.9 KB checked in by armahlam, 11 years ago (diff)
Line 
1#region Usings
2using System;
3using System.Collections.Generic;
4using System.Linq;
5using Microsoft.Xna.Framework;
6using Microsoft.Xna.Framework.Audio;
7using Microsoft.Xna.Framework.Content;
8using Microsoft.Xna.Framework.Graphics;
9using Microsoft.Xna.Framework.Input;
10using Microsoft.Xna.Framework.Media;
11using Jypeli;
12using Jypeli.ScreenObjects;
13using Jypeli.Assets;
14using AdvanceMath;
15using Physics2DDotNet;
16using Physics2DDotNet.Shapes;
17#endregion
18
19namespace Avaruuspeli2
20{
21    public class Peli : PhysicsGame
22    {
23        #region Muuttujat
24
25        BattleObject pelaaja1;
26        const int PELAAJAN_HP = 800;
27        PlasmaCannon ase;
28
29        BarGauge hitpointNaytto;
30        BarGauge pisteNaytto;
31
32        double vaikeustaso = 0;
33
34        int total_pisteet = 0;
35        Meter<int> cur_pisteet;
36
37        HighScoreList highscores;
38
39        #endregion
40
41        #region Alustukset
42        protected override void LoadContent()
43        {
44            MessageDisplay.MessageTimeInSeconds = int.MaxValue;
45            alustaHighscores();
46            alustaNaytot();
47            lataaUusiKentta();
48        }
49
50        private void alustaNaytot()
51        {
52            // viestinäytön tekstin väriksi valkoinen
53            MessageDisplay.TextColor = Color.White;
54
55            // luodaan elämänäyttö
56            hitpointNaytto = new BarGauge(this);
57            hitpointNaytto.Size = new Vector2D(15, 300);
58            hitpointNaytto.Angle = Angle.Radians(Math.PI / 2);
59            hitpointNaytto.ValueColor = Color.LightGreen;
60            hitpointNaytto.BackColor = Color.DarkRed;
61            hitpointNaytto.Max = PELAAJAN_HP;
62            hitpointNaytto.Position = new Vector2D(Screen.RightSafe - 300, Screen.BottomSafe + 100);
63            Add(hitpointNaytto);
64           
65            pisteNaytto = new BarGauge(this);
66            pisteNaytto.Size = new Vector2D(15, 300);
67            pisteNaytto.Angle = Angle.Degrees(270);
68            pisteNaytto.ValueColor = Color.White;
69            pisteNaytto.BackColor = Color.SteelBlue;
70            pisteNaytto.Max = vaikeustaso * 100;
71            pisteNaytto.Position = new Vector2D(Screen.LeftSafe + 300, Screen.BottomSafe + 100);
72            Add(pisteNaytto);
73        }
74
75        void alustaHighscores()
76        {
77            highscores = HighScoreList.LoadOrCreate(this, "topten.dat", 10);
78            highscores.ScreenList.ItemColor = Color.White;
79            highscores.ScreenList.BackGroundColor = Color.DarkBlue;
80            highscores.ScreenList.HighlightColor = Color.LightBlue;
81            highscores.ScreenInput.QueryText.TextColor = Color.Black;
82            highscores.CongratulationText = "Tuli ja leimaus! Ansaitsit pisteillä {1} paikan {0} listalta. Syötä nimesi:";
83        }
84
85        #endregion
86
87        #region KentänLataus
88        private void lataaUusiKentta()
89        {
90            highscores.Hide();
91            ClearPhysics();
92            ClearTimers();
93            MessageDisplay.Clear();
94
95            Gravity = new Vector2D(-240, 0);
96            vaikeustaso += 0.5;
97            Level = luoKentta();
98
99            lisaaNappaimet();
100            Camera.Follow(pelaaja1);
101            asetaAjastimet();
102
103            lisaaPisteMittari();
104            MessageDisplay.Add("Taso " + vaikeustaso);
105
106           
107        }
108
109        void lisaaPisteMittari()
110        {
111            cur_pisteet = new Meter<int>(0, 0, (int)(vaikeustaso*100));
112            pisteNaytto.Max = vaikeustaso * 100;
113            pisteNaytto.BindTo(cur_pisteet);
114        }
115
116        Level luoKentta()
117        {
118            Level kentta = new Level(this, 800, 600);
119            kentta.CreateBorder();
120
121            kentta.BackgroundColor = Color.Black;
122            kentta.LeftBorder.Color = Color.Black;
123            kentta.RightBorder.Color = Color.Black;
124            kentta.TopBorder.Color = Color.Black;
125            kentta.BottomBorder.Color = Color.Black;
126
127            Texture2D bgtex = Content.Load<Texture2D>("bgtex");
128            kentta.Background.Image = bgtex;
129
130            lisaaPelaajat(kentta);
131
132            return kentta;
133        }
134
135        private void lisaaPelaajat(Level kentta)
136        {
137            Texture2D pelaaja_tex = Content.Load<Texture2D>("pallo");
138            IShape pelaaja_shape = Shapes.CreateRectangle(pelaaja_tex.Width, pelaaja_tex.Height);
139            pelaaja1 = new BattleObject(pelaaja_shape, 15, PELAAJAN_HP);
140
141            pelaaja1.Texture = pelaaja_tex;
142
143            hitpointNaytto.BindTo(pelaaja1.HitPoints);
144            pelaaja1.HitpointsReachedZero += new EventHandler(rajahdys);
145
146            pelaaja1.MomentOfInertia = 8000;
147            pelaaja1.IgnoresGravity = true;
148            pelaaja1.KineticFriction = 1.0;
149            pelaaja1.Restitution = 1.0;
150
151            AddCollisionHandler(pelaaja1, tormays);
152            kentta.Objects.Add(pelaaja1);
153
154            // luodaan ase
155            Texture2D am_tex = Content.Load<Texture2D>("ammus");
156            IShape s = Shapes.CreateRectangle(am_tex.Width, am_tex.Height);
157            Projectile ammot = new Projectile("aaaaaa", s, 10.0);
158            ammot.Explosion = new Explosion(0);
159            ammot.Damage = new Damage(200);
160            ammot.ExplodeCondition = onkoPelaaja;
161            ammot.Texture = am_tex;
162            ammot.FuseTime = new Lifetime();
163            ammot.MomentOfInertia = double.PositiveInfinity;
164
165            ase = new PlasmaCannon(ammot);
166            ase.SetOwner(pelaaja1, kentta);
167            ase.Visible = true;
168            ase.Size = new Vector2D(0, 0);
169            ase.Color = Color.SteelBlue;
170            ase.FireRate = 6;
171            ase.Power = new Meter<double>(15000, 15000, 15000);
172            ase.IgnoresGravity = true;
173
174            kentta.Objects.Add(ase);
175        }
176
177        bool onkoPelaaja(Object obj)
178        {
179            PhysicsObject p = obj as PhysicsObject;
180
181            if (obj != pelaaja1 && p.Tag != "piste")
182                return true;
183
184            return false;
185        }
186
187        void asetaAjastimet()
188        {
189            // esteiden luominen
190            Timer tm = new Timer();
191            tm.Interval = 2.0 / vaikeustaso;
192            tm.Trigger += new Timer.TriggerHandler(spawnEste);
193            tm.Start();
194            AddTimer(tm);
195
196            // viholliset
197            Timer tm2 = new Timer();
198            tm2.Interval = 1.5 / vaikeustaso;
199            tm2.Trigger += new Timer.TriggerHandler(spawnVihu);
200            tm2.Start();
201            AddTimer(tm2);
202
203            // punaiset seinät
204            Timer tm4 = new Timer();
205            tm4.Interval = 8.0 / vaikeustaso;
206            tm4.Trigger += new Timer.TriggerHandler(spawnPysayttamatonEsine);
207            tm4.Start();
208            AddTimer(tm4);
209
210            /// punaiset isot seinät
211            Timer tm123 = new Timer();
212            tm123.Interval = 12.0 / vaikeustaso;
213            tm123.Trigger += new Timer.TriggerHandler(spawnSeina);
214            tm123.Start();
215            AddTimer(tm123);
216
217            // pisteet
218            Timer tmx = new Timer();
219            tmx.Interval = 5.0;
220            tmx.Trigger += new Timer.TriggerHandler(spawn_kerattava_pallo);
221            tmx.Start();
222            AddTimer(tmx);
223        }
224
225        #endregion
226
227        #region Näppäimet
228
229        private void lisaaNappaimet()
230        {
231            ClearControls();
232
233            //Yleiset näppäimet
234            Controls.Listen(Keys.Enter, ButtonPosition.Pressed, UusiPeli);
235
236            // Pelaajan 1 näppäimet
237            const double nopeus = 850.0;
238            Controls.Listen(Keys.Left, ButtonPosition.Down, LiikutaPelaajaa, null, pelaaja1, -nopeus, 0);
239            Controls.Listen(Keys.Right, ButtonPosition.Down, LiikutaPelaajaa, null, pelaaja1, nopeus, 0);
240            Controls.Listen(Keys.Up, ButtonPosition.Down, LiikutaPelaajaa, null, pelaaja1, 0, nopeus);
241            Controls.Listen(Keys.Down, ButtonPosition.Down, LiikutaPelaajaa, null, pelaaja1, 0, -nopeus);
242            Controls.Listen(Keys.Space, ButtonPosition.Up, Ammu);
243        }
244
245        private Boolean UusiPeli(ControlEvent e)
246        {
247           
248            lataaUusiKentta();
249            return true;
250        }
251
252        private Boolean Ammu(ControlEvent e)
253        {
254            // luodaan ammus
255            Projectile ammus = ase.Use();
256            if (ammus == null)
257                return false;
258
259            ammus.Position = ammus.Position + (Vector2D.FromLengthAndAngle((pelaaja1.Width/2)+(ammus.Width/2), ase.Angle.Radian));
260            ammus.Push(ammus.Velocity); //?
261            ammus.IgnoresExplosions = true;
262            ammus.Tag = "ammus";
263            ammus.MomentOfInertia = double.PositiveInfinity;
264
265            Level.Objects.Add(ammus);
266
267            return false;
268        }
269
270        private Boolean LiikutaPelaajaa(ControlEvent e)
271        {
272            PhysicsObject pelaaja = e.Parameter0.ToPhysicsObject();
273            double nopeus_x = e.Parameter1.ToDouble();
274            double nopeus_y = e.Parameter2.ToDouble();
275
276            Vector2D v = new Vector2D(nopeus_x, nopeus_y);
277            pelaaja.Hit(v);
278
279            return false;
280        }
281
282        //<--- näppäimiin liitetyt toiminnot loppuivat
283        #endregion
284
285        #region Tapahtumat
286
287        void rajahdys(object sender, EventArgs e)
288        {
289            PhysicsObject po = sender.ToPhysicsObject();
290            Explosion ex = new Explosion(po.Width * 1.50);
291            ex.Position = po.Position;
292            ex.Force = 2000;
293            Level.Objects.Add(ex);
294            po.Destroy();
295
296            if (po == pelaaja1)
297                ase.Destroy();
298            else
299                lisaa_pisteita(1);
300
301            if ( pelaaja1.IsDestroyed() )
302                lopeta_peli();
303        }
304
305        double VektorinPituus(Vector2D v1)
306        {
307            double a_x = v1.X;
308            double a_y = v1.Y;
309            double b_x = v1.X * -1;
310            double b_y = v1.Y * -1;
311
312            double x = Math.Abs(a_x - b_x);
313            double y = Math.Abs(a_y - b_y);
314            double pituus = Math.Sqrt((x*x) + (y*y));
315
316            return pituus;
317        }
318
319        void tormays(Collision collision)
320        {
321            if (!(collision.Obj is BattleObject && collision.Other is BattleObject)) return;
322
323            if (collision.Obj == pelaaja1 && collision.Other.Tag == "ammus")
324                return;
325
326            Vector2D vek = collision.Obj.Velocity - collision.Other.Velocity;
327            double dmg_d = VektorinPituus(vek);
328
329            int dmg = (int)(dmg_d/4.0);
330
331            BattleObject bo = (collision.Obj as BattleObject);
332            bo.TakeDamage(new Damage(dmg));
333
334            bo = (collision.Other as BattleObject);
335            bo.TakeDamage(new Damage(dmg));
336        }
337
338        void spawnEste(Timer timer)
339        {
340            const int HITPOINTS = 630;
341
342            IShape shape = Shapes.CreateRectangle(
343                RandomGen.NextDouble(20, 30), 
344                RandomGen.NextDouble(60, 120));
345
346            BattleObject obj = new BattleObject(shape, 200, HITPOINTS);
347
348            Texture2D tex = Content.Load<Texture2D>("laatikko");
349            obj.Texture = tex;
350            obj.TextureFillsShape = true;
351            obj.Color = Color.DarkGray;
352
353            obj.X = Level.Right - (obj.Width / 2);
354            obj.Y = RandomGen.NextDouble(Level.Bottom + (obj.Height / 2.0), Level.Top - (obj.Height / 2.0));
355            obj.MomentOfInertia = double.PositiveInfinity;
356
357            obj.HitpointsReachedZero += rajahdys;
358            AddCollisionHandler(obj, vasen_reuna_destroy);
359            Level.Objects.Add(obj);
360        }
361
362        void spawnVihu(Timer timer)
363        {
364            const int HITPOINTS = 410;
365
366            IShape shape = Shapes.CreateRectangle(30, 30);
367            BattleObject bobj = new BattleObject(shape, 100, HITPOINTS);
368            bobj.X = Level.Right - (bobj.Width / 2);
369            bobj.Y = RandomGen.NextDouble(Level.Bottom + (bobj.Height / 2.0), Level.Top - (bobj.Height / 2.0));
370
371            Texture2D tex = Content.Load<Texture2D>("alus");
372            bobj.Texture = tex;
373            ///bobj.TextureFillsShape = true;
374            bobj.Color = Color.Green;
375
376            bobj.HitpointsReachedZero += rajahdys;
377            AddCollisionHandler(bobj, vasen_reuna_destroy);
378            Level.Objects.Add(bobj);
379
380            Timer tm = new Timer();
381            tm.Interval = 0.2;
382            tm.Trigger += new Timer.TriggerHandler(vihu_ajastin);
383            tm.Start();
384            tm.Tag = bobj;
385            AddTimer(tm);
386        }
387
388        void vihu_ajastin(Timer t)
389        {
390            BattleObject b = (BattleObject)t.Tag;
391            if (b.IsDestroyed())
392            {
393                RemoveTimer(t);
394                return;
395            }
396
397            double vel_y = pelaaja1.Y - b.Y * 500;
398
399            b.Hit(
400                new Vector2D(
401                    RandomGen.NextDouble(0, 8000),
402                    vel_y)
403            );
404        }
405
406        PhysicsObject luoPunainenSeina(IShape shape)
407        {
408            PhysicsObject p = new PhysicsObject(200.0, shape);
409
410            p.IgnoresCollisionResponse = true;
411            p.IgnoresExplosions = true;
412
413            Texture2D tex = Content.Load<Texture2D>("pun_sein");
414            p.Texture = tex;
415            p.TextureFillsShape = true;
416            p.Color = Color.Red;
417
418            p.X = Level.Right - p.Width / 2.0;
419
420            AddCollisionHandler(p, vasen_reuna_destroy);
421            AddCollisionHandler(p, instagib);
422
423            Level.Objects.Add(p);
424            return p;
425        }
426
427        void spawnPysayttamatonEsine(Timer timer)
428        {
429            IShape shape = Shapes.CreateRectangle(30, 150);
430            PhysicsObject p = luoPunainenSeina(shape);
431            while( p.Y < p.Height && p.Y > -p.Height )
432                p.Y = RandomGen.NextDouble(Level.Bottom+p.Height/2.0, Level.Top-p.Height/2.0);
433        }
434
435        void spawnSeina(Timer t)
436        {
437            PhysicsObject po;
438            IShape shape;
439
440            switch (RandomGen.NextInt(0, 2))
441            {
442                // kaksi seinää, kolo keskellä
443                case 0:
444                    shape = Shapes.CreateRectangle(50.0, (Level.Height / 2) - (pelaaja1.Height * 1.5));
445                    po = luoPunainenSeina(shape);
446                    po.Y = Level.Top - po.Height / 2;
447                    po = luoPunainenSeina(shape);
448                    po.Y = Level.Bottom + po.Height / 2;
449                    break;
450
451                // yksi seinä, kolo ylhäällä
452                case 1:
453                    shape = Shapes.CreateRectangle(50.0, Level.Height - (pelaaja1.Height * 3));
454                    po = luoPunainenSeina(shape);
455                    po.Y = Level.Bottom + po.Height / 2.0;
456                    break;
457                   
458                // yksi seinä, kolo alhaalla
459                case 2:
460                    shape = Shapes.CreateRectangle(50.0, Level.Height - (pelaaja1.Height * 3));
461                    po = luoPunainenSeina(shape);
462                    po.Y = Level.Top - po.Height / 2.0;
463                    break;
464            }
465
466            t.Interval = 10.0;
467        }
468
469        void spawn_kerattava_pallo(Timer t)
470        {
471            Texture2D tex_p = Content.Load<Texture2D>("kerattava");
472            IShape pallo_shape = Shapes.CreateCircle(tex_p.Width/2);
473
474            PhysicsObject p = new PhysicsObject(double.PositiveInfinity, pallo_shape);
475            p.Texture = tex_p;
476            p.IgnoresCollisionResponse = true;
477            p.IgnoresPhysicsLogics = true;
478            p.MomentOfInertia = double.PositiveInfinity;
479            p.Tag = "piste";
480
481            p.X = Level.Right;
482            p.Y = RandomGen.NextDouble(Level.Bottom, Level.Top);
483
484            Timer pt = new Timer();
485            pt.Interval = 1 / 100.0;
486            pt.Trigger += new Timer.TriggerHandler(timer_kerattava_pallo);
487            pt.Tag = p;
488            pt.Start();
489
490            AddTimer(pt);
491            AddCollisionHandler(p, keraa_piste);
492            Level.Objects.Add(p);
493        }
494
495        void keraa_piste(Collision c)
496        {
497            if (c.Other != pelaaja1)
498                return;
499
500            pelaaja1.HitPoints.Value += PELAAJAN_HP / 5;
501            lisaa_pisteita(20);
502            c.Obj.Destroy();
503        }
504
505        void timer_kerattava_pallo(Timer t)
506        {
507            PhysicsObject p = t.Tag as PhysicsObject;
508
509            if (p.IsDestroyed())
510            {
511                RemoveTimer(t);
512                return;
513            }
514
515            p.X -= 5;
516
517            if (p.X < Level.Left)
518            {
519                p.Destroy();
520                RemoveTimer(t);
521            }
522        }
523
524        void instagib(Collision c)
525        {
526            if (c.Other != pelaaja1)
527                return;
528
529            pelaaja1.TakeDamage(new Damage(pelaaja1.HitPoints.Value));
530        }
531
532        void vasen_reuna_destroy(Collision c)
533        {
534            if (c.Other == Level.LeftBorder)
535                c.Obj.Destroy();
536        }
537
538        void lisaa_pisteita(int num)
539        {
540            cur_pisteet.Value += num;
541            total_pisteet += cur_pisteet.Value;
542
543            if (cur_pisteet.Value >= cur_pisteet.MaxValue)
544                lataaUusiKentta();
545        }
546
547        void lopeta_peli()
548        {
549            MessageDisplay.Clear();
550            MessageDisplay.AutoSize = false;
551
552            ClearPhysics();
553            ClearTimers();
554            Level.Objects.Stop();
555
556            MessageDisplay.Add("Peli loppui siihen. Keräsit yhteensä " + total_pisteet + " pistettä ja pääsit tasolle " + vaikeustaso);
557
558            highscores.ScreenList.Y += 100;
559            highscores.ScreenList.X += 150;
560   
561            highscores.Show(total_pisteet);
562
563            vaikeustaso = 0;
564            total_pisteet = 0;
565            cur_pisteet.Value = 0;
566        }
567
568        #endregion
569    }
570}
Note: See TracBrowser for help on using the repository browser.