source: 2010/31/eelaeepu/space defense 1.0/Peli.cs @ 1653

Revision 1653, 20.0 KB checked in by eelaeepu, 10 years ago (diff)
Line 
1using System;
2using Jypeli;
3using Jypeli.Widgets;
4using Jypeli.Assets;
5using Jypeli.Effects;
6using System.Collections.Generic;
7using Physics2DDotNet.Ignorers;
8
9public class Avaruuspeli : PhysicsGame
10{
11    Alus alus;
12    DoubleMeter pelaajaHpmittari;
13    List<Label> valikonKohdat;
14    List<Weapon> aseValikko;
15    List<Weapon> vihollistenaseet = new List<Weapon>();
16    List<PhysicsObject> viholliset = new List<PhysicsObject>();
17    int valittuAse;
18    Weapon aseKaytossa;
19    ObjectIgnorer ammusIgnorer = new ObjectIgnorer();
20    double aluksennopeus = 200;
21
22    Image efekti1 = LoadImage("Red");
23    Image efekti2 = LoadImage("Yellow");
24    Image savu = LoadImage("smoke");
25    ExplosionSystem rajahdys, savut;
26
27
28    protected override void Begin()
29    {
30
31
32        Valikko();
33
34
35        MessageDisplay.TextColor = Color.White;
36    }
37
38    void LuoKentta()
39    {
40        Level.BackgroundColor = Color.White;
41        Level.CreateBorders(0.2, false);
42        Mouse.IsCursorVisible = true;
43        AlustaEfektit();
44        for (int a = 0; a < 5; a++)
45        {
46            LuoVihollisAlukset(RandomGen.NextDouble(Level.Left, Level.Right), (RandomGen.NextDouble(Level.Bottom, Level.Top)));
47        }
48
49        Timer ajastin = new Timer();
50        ajastin.Interval = 0.1;
51        ajastin.Trigger += VihollisAlusAmpuu;
52        ajastin.Start();
53
54
55    }
56
57    void AlustaEfektit()
58    {
59        rajahdys = new ExplosionSystem(efekti1, efekti2, 300, false);
60        savut = new ExplosionSystem(savu, 300, false);
61        savut.MaxLifetime = 2.0;
62        savut.MinLifetime = 1.3;
63        savut.MinVelocity = 90;
64        savut.MaxVelocity = 200;
65        Add(savut);
66        Add(rajahdys);
67    }
68
69    void LuoAlus(double hp)
70    {
71        alus = new Alus(40, 50);
72        alus.AsetaHitpoints(hp);
73        alus.Tag = "omaalus";
74        alus.Image = LoadImage("alus2");
75
76        pelaajaHpmittari = new DoubleMeter(alus.AnnaHitPoints());
77        pelaajaHpmittari.MaxValue = alus.AnnaHitPoints();
78        BarGauge pelaajaHp = new BarGauge(30, 200);
79        pelaajaHp.BindTo(pelaajaHpmittari);
80        pelaajaHp.BarColor = Color.Red;
81        pelaajaHp.BorderColor = Color.Black;
82        pelaajaHp.Angle = Angle.Degrees(270);
83        pelaajaHp.Position = new Vector(0, Screen.Top - 40);
84        Add(pelaajaHp);
85
86        luoaseet();
87        Add(alus);
88    }
89
90    void AsetaOhjaimet()
91    {
92        Mouse.Listen(MouseButton.Left, ButtonState.Down, AmmuAseella, "Ammu aseella.");
93        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Näytä ohjeet");
94        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu");
95        Keyboard.Listen(Key.LeftShift, ButtonState.Pressed, VaihdaAse, "VaihtaaAseen");
96
97        Keyboard.Listen(Key.D, ButtonState.Pressed, LiikutaAlusta, "liikuta alusta oikeaan", alus, new Vector(aluksennopeus, 0.0));
98        Keyboard.Listen(Key.A, ButtonState.Pressed, LiikutaAlusta, "liikuta alusta vasenmpaan", alus, new Vector(-aluksennopeus, 0.0));
99        Keyboard.Listen(Key.S, ButtonState.Pressed, LiikutaAlusta, "liikuta alusta alas", alus, new Vector(0.0, -aluksennopeus));
100        Keyboard.Listen(Key.W, ButtonState.Pressed, LiikutaAlusta, "Liikuta alusta ylös.", alus, new Vector(0.0, aluksennopeus));
101    }
102
103    void KaannaAlusta(PhysicsObject alus, double kaantoNopeus)
104    {
105        alus.AngularVelocity += kaantoNopeus;
106    }
107
108    void LiikutaAlusta(PhysicsObject alus, Vector nopeus)
109    {
110        Vector impulssi = nopeus;
111        alus.Hit(impulssi);
112    }
113
114    void Valikko()
115    {
116        ClearAll();
117        valikonKohdat = new List<Label>();
118
119        Label kohta1 = new Label("Aloita uusi peli (Helppo)");
120        kohta1.Position = new Vector(0, 80);
121        valikonKohdat.Add(kohta1);
122
123        Label kohta2 = new Label("Aloita uusi peli (Vaikea)");
124        kohta2.Position = new Vector(0, 40);
125        valikonKohdat.Add(kohta2);
126
127        Label kohta3 = new Label("Aloita uusi peli (Mahdoton)");
128        kohta3.Position = new Vector(0, 0);
129        valikonKohdat.Add(kohta3);
130
131        Label kohta4 = new Label("Lopeta");
132        kohta4.Position = new Vector(0, -40);
133        valikonKohdat.Add(kohta4);
134
135        foreach (Label valikonKohta in valikonKohdat)
136        {
137            Add(valikonKohta);
138        }
139
140        Mouse.ListenOn(kohta1, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null, 1000.0);
141        Mouse.ListenOn(kohta2, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null, 200.0);
142        Mouse.ListenOn(kohta3, MouseButton.Left, ButtonState.Pressed, AloitaPeli, null, 1.0);
143        Mouse.ListenOn(kohta4, MouseButton.Left, ButtonState.Pressed, Lopeta, null);
144
145        Mouse.IsCursorVisible = true;
146        Mouse.ListenMovement(1.0, ValikossaLiikkuminen, null);
147        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Lopeta, "");
148
149    }
150
151    void AloitaPeli(double vaikeusTaso)
152    {
153        ClearAll();
154        LuoKentta();
155        Camera.ZoomToLevel();
156        LuoAlus(vaikeusTaso);
157        AsetaOhjaimet();
158        Mouse.ListenMovement(0.1, KuunteleLiiketta, null);
159        //Keyboard.Listen(Key.Escape, ButtonState.Pressed, Valikko, "Palaa valikkoon");
160    }
161
162    void ValikossaLiikkuminen(AnalogState hiirenTila)
163    {
164        foreach (Label kohta in valikonKohdat)
165        {
166            if (Mouse.IsCursorOn(kohta))
167            {
168                kohta.TextColor = Color.Red;
169            }
170            else
171            {
172                kohta.TextColor = Color.Black;
173            }
174
175        }
176    }
177
178    void Lopeta()
179    {
180        Exit();
181    }
182
183    void luoaseet()
184    {
185        aseValikko = new List<Weapon>();
186        Cannon tykki = new Cannon(50, 10);
187        tykki.Power.Value = 10000;
188        tykki.IsVisible = false;
189        tykki.Tag = "tykki";
190        tykki.CannonBallCollision = AmmusOsuu;
191        tykki.Angle = alus.Angle - Angle.Degrees(90);
192        alus.Add(tykki);
193
194        AssaultRifle rynnakkoKivaari = new AssaultRifle(60, 20);
195        rynnakkoKivaari.Angle = alus.Angle - Angle.Degrees(90);
196        rynnakkoKivaari.Tag = "rk";
197        rynnakkoKivaari.BulletCollision = AmmusOsuu;
198        rynnakkoKivaari.IsVisible = false;
199        PlasmaCannon plasmaTykki = new PlasmaCannon(60, 20);
200        plasmaTykki.Angle = alus.Angle - Angle.Degrees(90);
201        plasmaTykki.PlasmaParticleCollision = AmmusOsuu;
202        plasmaTykki.Tag = "plasma";
203        plasmaTykki.IsVisible = false;
204        LaserGun laserAse = new LaserGun(60, 20);
205        laserAse.Angle = alus.Angle - Angle.Degrees(90);
206        laserAse.LaserCollision = AmmusOsuu;
207        laserAse.IsVisible = false;
208        laserAse.Tag = "laser";
209
210        aseValikko.Add(rynnakkoKivaari);
211        aseValikko.Add(plasmaTykki);
212        aseValikko.Add(laserAse);
213        aseValikko.Add(tykki);
214        aseKaytossa = tykki;
215        valittuAse = 3;
216        //Add(tykki);
217    }
218
219    void AmmusOsuu(PhysicsObject ammus, PhysicsObject kohde)
220    {
221        int damage = 0;
222        if (kohde == alus)
223            return;
224        if (kohde.Tag.ToString() == "vihu")
225        {
226            Alus k = (Alus)kohde;
227            if (aseKaytossa is Cannon)
228                damage = 10;
229            if (aseKaytossa is AssaultRifle)
230                damage = 2;
231            if (aseKaytossa is PlasmaCannon)
232                damage = 1;
233            if (aseKaytossa is LaserGun)
234                damage = 10;
235            k.AsetaHitpoints(k.AnnaHitPoints() - damage);
236        }
237        if (kohde.Tag.ToString() == "ammus")
238        {
239            return;
240        }
241        ammus.Destroy();
242    }
243
244    void VaihdaAse()
245    {
246        int edellinenAse = valittuAse;
247        valittuAse++;
248        if (valittuAse >= aseValikko.Count)
249            valittuAse = 0;
250        alus.Remove(aseValikko[edellinenAse]);
251        Remove(alus);
252        alus.Add(aseValikko[valittuAse]);
253        aseKaytossa = aseValikko[valittuAse];
254
255        Timer alusTakaisin = new Timer();
256        alusTakaisin.Interval = 0;
257        alusTakaisin.Tag = alus;
258        alusTakaisin.Start(1);
259        alusTakaisin.Trigger += AlusTakaisinAseenVaihdonJalkeen;
260    }
261
262    void AlusTakaisinAseenVaihdonJalkeen(Timer ajastin)
263    {
264        PhysicsObject alus = (PhysicsObject)ajastin.Tag;
265        Add(alus);
266    }
267
268    void KuunteleLiiketta(AnalogState hiirenTila)
269    {
270
271
272    }
273    protected override void Update(Time time)
274    {
275
276        base.Update(time);
277       
278        if (alus != null)
279        {
280            pelaajaHpmittari.Value = alus.AnnaHitPoints();
281            Vector suunta = Mouse.PositionOnWorld - alus.Position;
282            alus.Angle = suunta.Angle + Angle.Degrees(90);
283        }
284        foreach (PhysicsObject vihu in viholliset)
285        {
286            //vihu.Angle = Angle.Degrees(Math.Atan2(alus.Y - vihu.Y, alus.X - vihu.X) * 180 / Math.PI + 90);
287            Vector suunta = alus.Position - vihu.Position;
288            vihu.Angle = suunta.Angle + Angle.Degrees(270);
289            //vihu.Angle = suunta.Angle;
290        }
291
292    }
293    void AmmuAseella()
294    {
295        PhysicsObject ammus = aseKaytossa.Shoot();
296
297        if (ammus != null)
298        {
299            ammus.Size *= 3;
300            ammus.IgnoresCollisionResponse = true;
301            ammus.Tag = "ammus";
302            if (aseKaytossa.Tag.ToString() == "tykki")
303            {
304                Cannon tykki = (Cannon)aseKaytossa;
305                tykki.Power.Value += 10000;
306            }
307        }
308    }
309    void LuoVihollisAlukset(double aluksenx, double alukseny)
310    {
311        Alus vihollisalus1 = new Alus(50, 40);
312        vihollisalus1.CollisionIgnorer = ammusIgnorer;
313        vihollisalus1.AsetaHitpoints(10);
314        vihollisalus1.Tag = "vihu";
315        int aluksenTyyppi = RandomGen.NextInt(10);
316        switch (aluksenTyyppi)
317        {
318            case 0:
319                {
320                    vihollisalus1.Image = LoadImage("vihollis alus1");
321                    LaserGun laserase = new LaserGun(20, 10);
322                    laserase.LaserCollision = LaserOsuu;
323                    laserase.IsVisible = false;
324                    vihollisalus1.Add(laserase);
325                    laserase.Angle = Angle.Degrees(90);
326                    laserase.IsVisible = false;
327                    vihollistenaseet.Add(laserase);
328                    viholliset.Add(vihollisalus1);
329                    break;
330                }
331            case 1:
332                {
333                    vihollisalus1.Image = LoadImage("vihollis alus2");
334                    LaserGun laserase = new LaserGun(20, 10);
335                    laserase.LaserCollision = LaserOsuu;
336                    laserase.IsVisible = false;
337                    vihollisalus1.Add(laserase);
338                    laserase.Angle = Angle.Degrees(90);
339                    vihollistenaseet.Add(laserase);
340                    viholliset.Add(vihollisalus1);
341                    break;
342                }
343            case 2:
344                {
345                    vihollisalus1.Image = LoadImage("vihollis alus5");
346                    AssaultRifle pyssy = new AssaultRifle(40, 20);
347                    pyssy.BulletCollision = RifleOsuu;
348                    pyssy.TimeBetweenUse = new TimeSpan(4000000);
349                    pyssy.IsVisible = false;
350                    pyssy.Ammo.Value = int.MaxValue;
351                    vihollisalus1.Add(pyssy);
352                    pyssy.Angle = Angle.Degrees(90);
353                    vihollistenaseet.Add(pyssy);
354                    viholliset.Add(vihollisalus1);
355                    break;
356                }
357
358            case 3:
359                {
360                    vihollisalus1.Image = LoadImage("vihollis alus6");
361                    AssaultRifle pyssy = new AssaultRifle(40, 20);
362                    pyssy.BulletCollision = RifleOsuu;
363                    pyssy.TimeBetweenUse = new TimeSpan(2000000);
364                    pyssy.Ammo.Value = int.MaxValue;
365                    pyssy.IsVisible = false;
366                    vihollisalus1.Add(pyssy);
367                    pyssy.Angle = Angle.Degrees(90);
368                    vihollistenaseet.Add(pyssy);
369                    viholliset.Add(vihollisalus1);
370                    break;
371                }
372            case 4:
373                {
374                    vihollisalus1.Image = LoadImage("vihollis alus8");
375                    AssaultRifle pyssy = new AssaultRifle(40, 20);
376                    pyssy.BulletCollision = RifleOsuu;
377                    pyssy.Ammo.Value = int.MaxValue;
378                    pyssy.TimeBetweenUse = new TimeSpan(2000000);
379                    pyssy.IsVisible = false;
380                    vihollisalus1.Add(pyssy);
381                    pyssy.Angle = Angle.Degrees(90);
382                    vihollistenaseet.Add(pyssy);
383                    viholliset.Add(vihollisalus1);
384                    break;
385                }
386            case 5:
387                {
388                    vihollisalus1.Image = LoadImage("vihollis alus9");
389                    Cannon tykki = new Cannon(20, 10);
390                    tykki.IsVisible = false;
391                    vihollisalus1.Add(tykki);
392                    tykki.Ammo.Value = int.MaxValue;
393                    tykki.Angle = Angle.Degrees(90);
394                    tykki.TimeBetweenUse = new TimeSpan(30000000);
395                    vihollistenaseet.Add(tykki);
396                    viholliset.Add(vihollisalus1);
397                    tykki.Power.Value = 100000;
398                    tykki.CannonBallCollision = KuulaOsuu;
399                    break;
400
401                }
402            case 6:
403                {
404                    vihollisalus1.Image = LoadImage("vihollis alus10");
405                    Cannon tykki = new Cannon(20, 10);
406                    vihollisalus1.Add(tykki);
407                    tykki.Ammo.Value = int.MaxValue;
408                    tykki.TimeBetweenUse = new TimeSpan(30000000);
409                    tykki.IsVisible = false;
410                    tykki.Angle = Angle.Degrees(90);
411                    viholliset.Add(vihollisalus1);
412                    vihollistenaseet.Add(tykki);
413                    tykki.Power.Value = 100000;
414                    tykki.CannonBallCollision = KuulaOsuu;
415                    break;
416                }
417            case 7:
418                {
419                    vihollisalus1.Image = LoadImage("vihollis alus12");
420                    Cannon tykki = new Cannon(20, 10);
421                    vihollisalus1.Add(tykki);
422                    tykki.TimeBetweenUse = new TimeSpan(30000000);
423                    tykki.IsVisible = false;
424                    tykki.Ammo.Value = int.MaxValue;
425                    tykki.Angle = Angle.Degrees(90);
426                    viholliset.Add(vihollisalus1);
427                    vihollistenaseet.Add(tykki);
428                    tykki.Power.Value = 100000;
429                    tykki.CannonBallCollision = KuulaOsuu;
430                    break;
431                }
432
433            case 8:
434                {
435                    vihollisalus1.Image = LoadImage("vihollis alus 13");
436                    PlasmaCannon plasmaTykki = new PlasmaCannon(100, 50);
437                    vihollisalus1.Add(plasmaTykki);
438                    plasmaTykki.TimeBetweenUse = new TimeSpan(3000000);
439                    plasmaTykki.IsVisible = false;
440                    plasmaTykki.PlasmaParticleCollision = plasmaTykkiOsuu;
441                    plasmaTykki.Angle = Angle.Degrees(90);
442                    vihollistenaseet.Add(plasmaTykki);
443                    viholliset.Add(vihollisalus1);
444                    break;
445                }
446            case 9:
447                {
448                    vihollisalus1.Image = LoadImage("vihollis alus 16");
449                    PlasmaCannon plasmaTykki = new PlasmaCannon(100, 50);
450                    plasmaTykki.TimeBetweenUse = new TimeSpan(3000000);
451                    vihollisalus1.Add(plasmaTykki);
452                    plasmaTykki.IsVisible = false;
453                    plasmaTykki.PlasmaParticleCollision = plasmaTykkiOsuu;
454                    plasmaTykki.Angle = Angle.Degrees(90);
455                    vihollistenaseet.Add(plasmaTykki);
456                    viholliset.Add(vihollisalus1);
457                    break;
458                }
459            default:
460                {
461                    vihollisalus1.Image = LoadImage("vihollis alus9");
462                    break;
463                }
464        }
465        vihollisalus1.X = aluksenx;
466        vihollisalus1.Y = alukseny;
467        vihollisalus1.Destroyed += delegate() { luoUusiKunTuhoutuu(vihollisalus1); };
468
469        Add(vihollisalus1);
470
471    }
472
473    void luoUusiKunTuhoutuu(Alus alus)
474    {
475        rajahdys.AddEffect(alus.X, alus.Y, 50);
476        savut.AddEffect(alus.X, alus.Y, 50);
477        LuoVihollisAlukset(RandomGen.NextDouble(Level.Left, Level.Right),RandomGen.NextDouble(Level.Bottom,Level.Top));
478    }
479
480    void LaserOsuu(PhysicsObject ammus, PhysicsObject kohde)
481    {
482        if (kohde.Tag.ToString() == "ammus")
483            return;
484        if (kohde.Tag.ToString() == "omaalus")
485        {
486            Alus k = (Alus)kohde;
487            k.AsetaHitpoints(k.AnnaHitPoints() - 5);
488        }
489        ammus.Destroy();
490    }
491
492    void RifleOsuu(PhysicsObject ammus, PhysicsObject kohde)
493    {
494        if (kohde.Tag.ToString() == "ammus")
495            return;
496        if (kohde.Tag.ToString() == "omaalus")
497        {
498            Alus k = (Alus)kohde;
499            k.AsetaHitpoints(k.AnnaHitPoints() - 5);
500        }
501        ammus.Destroy();
502    }
503
504    void plasmaTykkiOsuu(PhysicsObject ammus, PhysicsObject kohde)
505    {
506       
507        if (kohde.Tag.ToString() == "ammus")
508            return;
509        if (kohde.Tag.ToString() == "omaalus")
510        {
511            Alus k = (Alus)kohde;
512            k.AsetaHitpoints(k.AnnaHitPoints() - 5);
513        }
514        ammus.Destroy();
515    }
516
517    void VihollisAlusAmpuu(Timer sender)
518    {
519        for (int i = 0; i < vihollistenaseet.Count; i++)
520        {
521            Weapon ase = vihollistenaseet[i];
522            PhysicsObject vihollinen = viholliset[i];
523
524            //Vector suunta = alus.Position - ase.AbsolutePosition;
525            //vihollinen.Angle = suunta.Angle + Angle.Degrees(270);
526            if (ase is AssaultRifle)
527            {
528                PhysicsObject a = ase.Shoot();
529                if (a != null)
530                {
531                    a.Tag = "ammus";
532                    a.Velocity /= 2;
533                    a.CollisionIgnorer = ammusIgnorer;
534                    a.Size = new Vector(15, 5);
535                }
536                continue;
537            }
538            if (ase is Cannon)
539            {
540                (ase as Cannon).Power.Value = 10000;
541            }
542            PhysicsObject ammus = ase.Shoot();
543            if (ammus != null)
544            {
545                ammus.CollisionIgnorer = ammusIgnorer;
546                ammus.MaximumLifetime = TimeSpan.MaxValue;
547                ammus.Tag = "ammus";
548                ammus.Velocity /= 2;
549                if (ase is PlasmaCannon)
550                {
551                    ammus.Size *= 5;
552                }
553
554            }
555        }
556
557    }
558
559    void KuulaOsuu(PhysicsObject kuula, PhysicsObject toinen)
560    {
561       
562        if (toinen.Tag.ToString() == "ammus")
563            return;
564        if (toinen.Tag.ToString() == "omaalus")
565        {
566            Alus k = (Alus)toinen;
567            k.AsetaHitpoints(k.AnnaHitPoints() - 5);
568        }
569        kuula.Destroy();
570        Explosion rajahdys = new Explosion(40);
571        rajahdys.Position = kuula.Position;
572        Add(rajahdys);
573    }
574
575
576}
577
578public class Alus : PhysicsObject
579{
580    private double Hitpoints;
581
582    public Alus(double width, double height)
583        : base(width, height)
584    {
585    }
586
587    public void AsetaHitpoints(double hp)
588    {
589        this.Hitpoints = hp;
590    }
591
592    public double AnnaHitPoints()
593    {
594        return this.Hitpoints;
595    }
596
597
598
599    public override void Update(Time time)
600    {
601        if (AnnaHitPoints() <= 0 && !this.IsDestroyed())
602            this.Destroy();
603        base.Update(time);
604    }
605}
Note: See TracBrowser for help on using the repository browser.